関数

INPUT · スライド

見せるのか、渡すのか

01 / 07

よく似て見える2つ

下の2つの関数を見くらべてみよう。ちがうのは print か return かの1語だけ。やっている計算はどちらも kazu * 2 だよ。

ところが呼んでみると、表示されるのは1行だけ。watasu(5) は何も表示しない。でも何も起きていないわけではないんだ。

def miseru(kazu):    print(kazu * 2)def watasu(kazu):    return kazu * 2miseru(5)watasu(5)

実行結果

10

02 / 07

print は人間に見せる

print は画面に文字を出す命令。出した瞬間に仕事は終わりで、値はどこにも残らない。

人間の目に届けるのが役目なので、プログラムの側から見れば何も返ってきていない。だから miseru(5) の結果を変数に入れると、入るのは None だよ。

def miseru(kazu):    print(kazu * 2)kotae = miseru(5)print(kotae)

実行結果

10
None

03 / 07

return はプログラムに渡す

return は呼んだ場所に値を渡す命令。渡すだけなので、画面には何も出ない。

見たければ、受け取った側で print に渡す。下の print(watasu(5)) の print が、関数の外にいることに注目してね。

def watasu(kazu):    return kazu * 2watasu(5)print("ここまで何も出ていない")print(watasu(5))

実行結果

ここまで何も出ていない
10

04 / 07

print した値は計算に使えない

ここがいちばんつまずく場所。print する関数の結果を計算に使おうとすると、TypeError になるよ。

画面には 10 と出ているのに、kotae の中身は None。目に見えているものと、プログラムが持っているものはちがうんだ。

def miseru(kazu):    print(kazu * 2)kotae = miseru(5)print(kotae + 3)

実行結果

10
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

05 / 07

return した値は書かなければ出ない

逆のつまずきもある。return する関数をただ呼んでも、画面には何も出ない。

「動いていない」と思ってしまいがちだけれど、計算はちゃんと終わっていて、値も返ってきている。受け取って print に渡さないと見えないだけなんだ。

def watasu(kazu):    return kazu * 2watasu(5)print("おわり")

実行結果

おわり

06 / 07

両方やってもいい

もちろん、中で print しつつ return もする関数も書ける。

下の例では、おかいけいを画面に出しながら、金額を呼び出し側に渡している。人間にも見せるし、プログラムにも渡す——両方やりたいときはこう書くよ。

def kaikei(nedan):    print(f"おかいけいは{nedan}円です")    return nedanshiharai = kaikei(500)print(shiharai + 100)

実行結果

おかいけいは500円です
600

07 / 07

どちらを書くか

迷ったときの目安はこれ。

  • その値をあとで使うか … 使うなら return
  • 人に読ませたいだけか … それだけなら print

部品として使いまわしたい関数は、return で返すほうがいい。表示は呼んだ側にまかせるほうが、あとから使いみちを変えやすいからだよ。

下の zeikomi は return で返しているので、画面に出すことも、合計に足しこむこともできた。print にしていたら合計は出せなかったね。

次は引数を2つ以上に増やして、関数にできることを広げよう。

def zeikomi(nedan):    return nedan * 11 // 10print(zeikomi(100))goukei = zeikomi(100) + zeikomi(200)print(goukei)

実行結果

110
330