40のおっさんのPython学習記録

20年以上前、学部の必修のC言語が全く理解できずに同級生に放り投げ、その後コーディングから遠ざかったガチ文系のおっさんが、ふと思い立ってPythonに挑戦しています。

lambda式って何ぞ?

みんなのPython(以後「みんPy」と記す)の今5章にとりかかっています。関数型プログラミングについての章な模様ですが、関数型プログラミングとほかのプログラミングの違いがよくわからんのですが、要するにExcelの関数のように、ある特定の機能や手続きを定めた関数を使っていけば、コードが煩雑にならないとかそういうことですわね? エクセラーの自分としてはなんか当たり前のようなことを改めて言われてるような気もしますが、プログラマーの世界は違うんですかね?

で、この章のわりとしょっぱなにlambda式というものが出てきました。

lambda式を使うと、使い捨ての関数を定義できます。式という言葉がついていることからわかる通り、式を使って関数を定義できるのです。lambda式で定義される関数には関数名がないため、無名関数と呼ばれています。

と説明されているのですが、「お前何言ってんの?日本語使ってくれる?」状態です。筆者はおそらく業界的にはわかりやすい説明をしているんだと思いますが、おっさんファンドマネージャーには「は?」としか言いようがありません。

具体例を見るとよくわかるかもしれないなと思って具体例をとりあえず見てみましょう。みんPyの234ページあたりにあるおそらく艦これかなにかをベースにした具体例を入力するのが個人的には辛かったので、より一般的だと思われる塾の成績管理を題材にしたデータに書き換えました。

#塾の4教科テスト成績管理スクリプト

#生徒氏名と算国理社の点数
grades = [
	("梅山",65,78,74,95),
	("梅岡",100,38,93,21),
	("梅田",32,84,47,100),
	("呻き",0,23,9,45),
	("梅なんとか",82,91,76,97)
	]

#算数の点数をキーとして降順でならべかえ、合計点を付加
ranked = sorted(grades, key=lambda x:x[1], reverse=True)
for x in ranked:
	print(x[0:],sum(x[1:5]))

呻きさんはえらいダメな点数ですね。こんなんじゃ中学受験諦めたほうがいいと思いますが、それはさておいて、塾でテストをやって、生徒の名前と各教科の生の点数が並んでて、これをランキング表示させたいわけです。上記の例は書いてある通り算数の点数で並べ替えて、合計得点も表示させようとしています。で、ここにlambdaが登場します。
私の超個人的な感覚ならば算数をキーにしたいなら

ranked = sorted(grades, key=x[1], reverse=True)

でいいじゃん、と思うんですがこれだとエラーで通らないんです。xが定義されてないとかゴチャゴチャぬかしやがるわけです。ところがlambda x:をおくことでxがタプルの要素と定義されるようなんです。もうほんと意味がわかんない。とりあえずこれはこういうもんだと思ってゴリゴリ進みます。

あと、lambda式を使えば、最後のfor分のところの表示までもfor分なしで一気通貫できるようなんだけど、個人的には今はいっぱいいっぱいなのでおいおいどうにかします。

追記(2018年1月7日)

自分がlambda式を気持ち悪いと思う理由を書いていなかったというか、思い出して書こうと思いますが。

key=lambda x:x[1]

単純に言うと、lambdaが宣言された後、カッコも何もなくx:x[1]が続く点ですね。自分の直感としてはlambdaが何を指してるのかlambda(x:x[1])みたいにカッコで括れよ!とどシロートとしては思うわけですよ。