すぐ影響されるブログ

アニメやマンガにすぐ影響されるミーハーのブログ

NEW GAME!を観ました。プログラミング始めます。(11)

正直めんどくさくて今日までサボってました。

f:id:kirintt:20170906030734p:plain

今回はちょっと苦労したえ…。

☟前回の記事 

nagoyanofes.hatenadiary.jp

※基本的に、愛知大学の有澤先生がプログラミングの講義で使用しているテキスト「Pythonによるプログラミング入門」に沿って進めています。

Python 2.7.13を使用しています。

 

 

 

サンプルプログラム

1か月分のカレンダーを表示するプログラム(「Pythonによるプログラミング入門」p. 13)。

f:id:kirintt:20170826201139p:plain

今日のキーワード

関数を作る (1) def cal0(n,m):

"def 関数名(使用する変数):"で関数を作成する。長々とした処理を何度も行う時には、予め関数にしておくと便利そう。

例8)

1 つの月のカレンダーを表示する関数 cal0(n,m) を作成しなさい。ここに n は月の最初の日の曜日を表す数字で、日曜日を 0、月曜日を 1、· · ·、土曜日を 6 とする。m はその月の日数である。また、cal0(n,m) を使って、木曜日から始まり、31 日で終わるカレンダーを表示しなさい。

(引用元:Pythonによるプログラミング入門, p. 26)

f:id:kirintt:20170906031543p:plain

  • テキストに載っていたものをそのままコピペしたのだが、おかしな結果に…。
  • 曜日の表示、"---"の表示と日付の改行は問題ない。
  • 日付がすべて4になっている。
  • 日付のforがうまく行っていない?

f:id:kirintt:20170906031910p:plain

  • 3つ目のfor(日付の表示に関する部分)で、
  • print "%5d"%n → print "%5d"%x
  • 成功。
  • 日付に当たるxを使用するべきところがn(開始曜日を指定する変数)となっていたために先に示した結果となっていた。
  • 以下、先のプログラムの説明をテキストより引用。
  • f:id:kirintt:20170906032545p:plain

    (引用元:, p. 27)

問1

次のプログラムの出力を予測しなさい。

f:id:kirintt:20170906032853p:plain

ヒント: 最後に出力された None は、この関数の値である。

(引用元:, p. 27)

予測:35

f:id:kirintt:20170906040406p:plain

  • 15忘れてた。言い訳すら出来ない。
  • "None"て何?どっから湧いた??

f:id:kirintt:20170906033117p:plain

  • 関数が生成する値は return で指定される。return で明示的に値を指定されない場合には None が関数の値になる

    (引用元:, p. 27)

  • "None"は関数の返す値がないときに出ちゃうってことか?
  • 今のプログラム、f(2,3)だけのときにはNoneが出ないが、上の図のようにprint f(2,5)だけのときにはNoneが出た。
  • この書き方だとprintが重複しているが、関数f(x,y)内のprintをreturn(後述)にしとけばOKっぽい。
  • でもNoneの前に一応f(2,5)の計算結果は出てるんだよな…そこが謎。

関数を作る (2) def f (x,y):

ここでは、通常の関数についての話。

通常の関数は値を生成する。生成する値は return で指定される。

(引用元:, p. 27)

例9)

f (x , y) = (x + y) × y
となる関数 f (x , y) を定義し、 f (2 , 3) と f (2 , 5) の値を表示しなさい。

(引用元:, p. 27)

f:id:kirintt:20170906035154p:plain

  • テキストに載っていた解答。
  • 関数内のreturnで指定された部分がprintで表示されている。

f:id:kirintt:20170906035350p:plain

  • ちゃんと説明を読まずに、returnを使わず書いたやつ。
  • 結果は同じだった。
問1

f:id:kirintt:20170906035727p:plain

となる関数 f (x) を定義し、 f (2) と f (3) の値を表示しなさい。

ヒント: 実数の割り算にしておかないと、頭の中が???? となる

(引用元:, p. 28)

f:id:kirintt:20170906035943p:plain

  • ちょっとミスった(後述)。
問2

f:id:kirintt:20170906041653p:plain

で求められる。これを求める関数を V(r) とし、V(2) とV(3) の値を表示しなさい。
ヒント: 円周率 π は数学モジュール math に pi として含まれている。math の中の pi を使うには
from math import pi
を最初に実行しておけばよい。

(引用元:, p. 28)

f:id:kirintt:20170906041800p:plain

  • 会話モードでお世話になった"pi"が再登場。
  • こういう面倒な計算も毎回式を書く必要なくサクッとやってくれる。便利だ…。

今日のミス

関数を作る (2) def f (x,y):

問1

f:id:kirintt:20170906040516p:plain

  • 累乗の演算子を間違えた。
  • エクエルとかだと"^"だけど、pythonでは"**"を使う。すっかり忘れてた。
問2

f:id:kirintt:20170906040735p:plain

  • なんか値が本来より小さい。
  • piを疑って3.14にしてみたり、()を付けて式を要素で分けてみたりしたけど結果は変わらず…なぜ??
  • 原因は4/3を実数値にしていなかったから。
  • 4/3 → 4.0/3 とすることで解決。
  • 問1のヒントに書いてあったことにここで引っかかるとは…ウカツ!

 

以上。

今回は3.9問2でけっこう時間食われた。こんな短いプログラムで苦労したが、企業で働くプログラマーは膨大な量を書いてるんだよなぁ。ストレスで頭がおかしくなってしまうんじゃないかと心配になる。

 

☟次

nagoyanofes.hatenadiary.jp