関数

INPUT · スライド

どこを関数にするか

01 / 06

手に入れた道具をならべる

この章で手に入れたものをならべてみよう。

  • def … ひとまとまりの処理に名前をつける
  • 引数 … 外から中へ値を渡す
  • return … 中から外へ値を返す
  • スコープ … 中で作った名前は中だけのもの
  • キーワード引数と初期値 … 名前をつけて渡す、渡さなかったときの値を決める

文法はこれで全部。ここからはどう使うかの話だよ。同じ結果が出るコードでも、部品の切りかたで読みやすさはまったく変わるんだ。

02 / 06

同じコードが2回出てきたら

関数にするかどうかで迷ったときの、いちばん分かりやすい合図がこれ。同じような処理を2回書いた瞬間だよ。

2か所あると、直すときに2か所とも直さないといけない。片方だけ直して片方を忘れる——これがバグのいちばん太い水源だ。

下のコードは税込み計算を2回書いている。税率が変わったら2か所とも直すことになるね。

print(int(1000 * 1.1))print(int(2500 * 1.1))

実行結果

1100
2750

03 / 06

1か所にまとめる

関数にすると、直す場所が1つになる。税率を知っているのは関数の中だけになったので、呼ぶ側は税率のことを忘れていい。

「同じことを2回書いた」以外にも合図はある。コメントで説明したくなったときもそうだよ。「ここは税込みを計算している」と書きたくなったら、その部分を関数にして名前で説明すればいい。

def zeikomi(nedan):    return int(nedan * 1.1)print(zeikomi(1000))print(zeikomi(2500))

実行結果

1100
2750

04 / 06

いい名前は、何をするかを言っている

関数の名前は、中を見なくても何が起きるか分かるものにしよう。

  • 悪い例 … f shori data keisan2
  • よい例 … zeikomi hantei gassan tsunagu

「何をするか」を動詞で言えるのがいい名前だよ。名前が決まらないときは、たいていその関数が2つ以上の仕事をしている。名前に困ったら、分けられないか考えてみよう。

Pythonでは小文字とアンダースコアで書く習慣がある。zeikomiKeisan ではなく zeikomi_keisan だよ。

05 / 06

1つの関数に、1つの仕事

よくやってしまうのが、計算と表示を1つの関数に詰めこむこと。

計算した結果を中で print してしまうと、その値は外に出てこない。合計を出したくなっても、並べかえたくなっても、もう使えないんだ。

計算する関数は return する。表示は呼んだ側でやる。 これを守るだけで、部品の使い回しがきくようになるよ。

def shoukei(tanka, kosuu):    return tanka * kosuugoukei = shoukei(160, 2) + shoukei(220, 1)print(f"ごうけい {goukei}円")

実行結果

ごうけい 540円

06 / 06

小さい部品から組み立てる

大きなプログラムを書くときは、小さい関数から作って、それを呼ぶ関数を作る。いきなり全部を1つの関数に書こうとしない。

下では shoukei が金額を出し、gyou がそれを使って1行ぶんの文字列を作っている。それぞれは短くて、それぞれ単体で確かめられる。

それじゃあ10問やってみよう。あとの問題ほど大きくなって、最後は関数をいくつか組み合わせた小さなプログラムになるよ。

def shoukei(tanka, kosuu):    return tanka * kosuudef gyou(namae, tanka, kosuu):    return f"{namae} x{kosuu} {shoukei(tanka, kosuu)}円"print(gyou("パン", 160, 2))

実行結果

パン x2 320円