本文で紹介した “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” ではなく、定義されている関数名を書いてもかまいません。 では、関数を引数に取れるということの便利さは、おそらく説明はいらないかと思います。ですが、無名関数はどう便利なのか。それは、またの機会に紹介したいと思います。
mapとlambda
2017/08/02 17:00
クラウドファンディングを開始しました
2017/08/02 16:18
2020年から小学校でのプログラミング教育の義務化が決定していますし、島根大学附属小学校(や、たぶん他のところでも)での実証が開始されるそうです(それとも、もう開始してたでしょうか)。 ただ、疑問なのが、Scratchなどのような「手続き型」のものがメインの教材になるのではないかという点と、教諭の準備ができるのかという点です。Viscuitを補助的に用いている例もあるとは聞いていますが。 「プログラミング=手続き型」ではありませんから、プログラミングとはなにかという概念について、いくつものモデルや考え方があるというところも、教材の対象である低学年児童 (あるいは児童・生徒)、教諭ともにわかってもらえる教材を作りたいと思います。 そのためには、実際に児童を対象とした講習を行ない、本プロジェクト内においても継続的にフィードバックを行ないたいと思っています。 ぜひ、ご支援をよろしくお願いいたします。