本文で紹介した “lambda” と “map” について簡単に説明します。
まず、例を見てみます。
最初の例は、lisp系の “gauche” というschemeの実装での例です。
| gosh> (map (lambda (x) (* x 2)) '(1 2 3))
| (2 4 6)
最初の“gosh>” はプロンプトで、その後が例の本体です。
2行目がその出力です
次にPython3での例です。これはスクリプト・ファイルに書いてみました。
| print(list(map(lambda x: x * 2, [1,2,3])))
これをex1.pyというような名前にして、実行してみます。
| $ python3 ex1.py
すると、このような結果が得られます。
| [2, 4, 6]
おわかりのとおり、同じ結果が出てきています。
どちらも “map” という、「関数を引数に取る関数 (高階関数)」に、 “lambda” という無名関数として示される処理と、その “lambda” に与える引数が示されています。
gaucheもpython3も “map” では、“lambda” も与える引数も“map” の引数になっています。この点についての見やすさを考えると、Python3はちょっと読みにくいかもしれません。
この程度の例では、ループを使ってもかまいませんが、より複雑な処理も可能であることは説明はいらないかと思います。
Python3の場合はともかく、schemeの場合、 “lambda” 自体を合成、あるいは生成したり、またPython3の場合もschemeの場合も、引数を合成、あるいは生成したりということが可能です。
Python3の場合、おそらくよくあるのは “range(10)" のようにして引数を生成するような場合でしょうか。
「関数を引数にとる」ということ自体は、C言語でもポインタを使うことで可能です。
両者の違いは、C言語では引数になる関数もかならず関数として定義されていなければならないという点でしょうか。
gaucheにしてもPython3にしても、 “lambda” ではなく、定義されている関数名を書いてもかまいません。
では、関数を引数に取れるということの便利さは、おそらく説明はいらないかと思います。ですが、無名関数はどう便利なのか。それは、またの機会に紹介したいと思います。