CHAPTER 10 · 6 lessons · 78問

高階関数とラムダ式

関数を値として渡す。「処理そのもの」を引数にできると、書けるものの幅が変わる。

0 / 78 問クリア

第3章で関数を覚えたとき、関数は「呼ぶもの」だった。この章では見方を変える。関数は、値だ。

数や文字列と同じように、変数に入れられるし、別の関数に渡せるし、返すこともできる。関数を受け取ったり返したりする関数のことを 高階関数 と呼ぶよ。

いちばん実感しやすいのが並べかえだ。sorted(namaes) はそのまま並べてくれるけれど、「文字数の短い順に並べたい」となると、どういう基準で並べるかを教える必要がある。そこで sorted(namaes, key=len) と書く。len という関数を、値として渡している。カッコを付けていないことに注目してほしい——付けたら「呼んだ結果」を渡すことになってしまう。付けなければ関数そのものだよ。

基準がその場かぎりのものだと、いちいち def で名前をつけるのは大げさになる。そこで使うのが ラムダ式。lambda x: x["toshi"] と書けば、名前のない小さな関数がその場でできる。sorted(hitos, key=lambda h: h["toshi"]) で「年齢順に並べる」だ。

そのあと map と filter を扱う。map は全部に同じ処理をかける、filter は条件に合うものだけ残す。前の章でやった内包表記とできることはほとんど同じで、Python では内包表記のほうが好まれることが多い。それでも扱うのは、他人のコードに出てくるからだよ。両方読めるようにしておこう。

章の最後は、関数を引数として渡すという考え方そのものに向き合う。「あとで何をするかは、呼ぶ側に決めてもらう」という書き方ができると、部品としての関数の作り方が変わる。JavaScript を学んだことがある人なら、コールバックと同じ話だと気づくはずだよ。

この章のレッスン

名前のない関数

  1. 89関数も値だnibai = lambda x: x * 2。関数は、数や文字と同じように変数に入れられるよ。問題へ
  2. 90基準を渡して並べかえるsorted(namaes, key=len)。len にカッコを付けないのがすべてだよ。問題へ
  3. 91いちばんを1行で見つけるmax(meibo, key=lambda h: h["ten"])。第2章で5行かけたあの型が、1行になるよ。問題へ

関数を渡す

  1. 92全部に同じ処理をかけるmap(f, xs) で一気に変換。list を通さないと中身が見えないのが最大の落とし穴だよ。問題へ
  2. 93条件に合うものだけ残すfilter(f, xs) は「残すかどうか」を関数に聞く。こちらも list を通さないと見えないよ。問題へ
  3. 94関数を受け取る関数を書くあとで何をするかは、呼ぶ側に決めてもらう。部品としての関数の作りかたが変わるよ。問題へ

つぎは「もっと便利な道具」。セット・collections・正規表現・再帰。知っていると急に楽になる道具を、必要な理由とセットで。