高階関数とラムダ式

INPUT · スライド

関数も値だ

01 / 07

関数は「呼ぶもの」だった

第3章で def を覚えたとき、関数は呼ぶものだった。nibai(5) と書いて答えをもらう。それが全部だったね。

この章では見方を変えるよ。関数は、値だ。数や文字列とまったく同じように、変数に入れられるんだ。

下の f = nibai に注目。nibai のうしろにカッコを付けていない。これで f は nibai と同じ関数になる。

def nibai(x):    return x * 2f = nibaiprint(f(5))

実行結果

10

02 / 07

カッコを付けるかどうかで意味が変わる

ここがこの章でいちばん大事なところだよ。

  • nibai(5) … 関数を呼んだ結果。10 という数
  • nibai … 関数そのもの。「2倍する」という処理のかたまり

カッコは「使え」という合図なんだ。付けなければ、処理がそのまま値として手に入る。

ちなみに関数そのものを print すると、こんなものが出るよ。

<function nibai at 0x7f3c2a1b4040>

うしろの数は置いてある場所で、実行するたびに変わる。見て楽しいものではないけれど、たしかに値として存在していることは分かるね。

def nibai(x):    return x * 2f = nibaiprint(nibai(5))print(f(5))

実行結果

10
10

03 / 07

名前のない関数を作る

関数が値なら、名前を付けずにその場で作れてもいいはずだよね。5 や "あか" をいちいち変数に入れなくても書けるのと同じように。

そのための書きかたが lambda(ラムダ)。形はこう。

lambda 引数: 式

lambda のうしろに引数の名前、コロン、そのあとに式を1つ。それだけで小さな関数ができあがるよ。

nibai = lambda x: x * 2print(nibai(5))

実行結果

10

04 / 07

def と並べて見くらべる

同じ働きをする2つを並べてみよう。

def nibai(x):    return x * 2
nibai = lambda x: x * 2

def は3行、lambda は1行。書いてあることは対応しているよ。

  • def nibai(x): の (x) が、lambda x: の x
  • return x * 2 の x * 2 が、コロンのうしろの x * 2

呼びかたもまったく同じ。どちらも nibai(5) で使えるよ。

def nibai(x):    return x * 2nibai2 = lambda x: x * 2print(nibai(7))print(nibai2(7))

実行結果

14
14

05 / 07

return は書かない

見くらべて気づいたかな。lambda には return が無い。

書かないのではなく、書けない。lambda のうしろに置けるのは式1つだけで、その式の答えがそのまま返り値になるんだ。

うっかり return を書くと、下のようにエラーになるよ。

nibai = lambda x: return x * 2

実行結果

SyntaxError: invalid syntax

06 / 07

式なら何でも入る

式でありさえすれば、中身は自由だよ。引数を2つ以上にしてもいい。

第9章でやった a if 条件 else b も、文ではなく式だったね。だから lambda の中に入れられる。これで「条件で切りかえる小さな関数」が1行で書けるよ。

tasu = lambda a, b: a + bhantei = lambda t: "ごうかく" if t >= 60 else "ふごうかく"print(tasu(2, 3))print(hantei(80))

実行結果

5
ごうかく

07 / 07

変数に入れるくらいなら def を使う

ここまで nibai = lambda x: x * 2 と書いてきたけれど、実はこれはPythonの作法から外れている。

名前を付けて置いておくなら、素直に def で書くほうがいい。理由ははっきりしていて、def のほうが読みやすいし、エラーのときに名前が出るからだよ。lambda で作った関数は、エラーの行に <lambda> としか出ない。どの関数で転んだのか分からないんだ。

では lambda はいつ使うのか。その場で渡して、それきり使わないときだよ。名前を付ける価値が無いくらい小さくて、1回しか出番が無い処理。

次のレッスンでは、まさにその場面に出会うよ。「どういう基準で並べるか」を sorted に教えるときだ。