Python初学者がラムダ式を頑張って理解した話

Python

ラムダ式との出会い

Pythonについて勉強中の江藤です。
先週、Pythonで画像処理を行うライブラリについてしらべていたところ、Qiitaの『PILでEXIF Orientationタグを考慮して処理』という記事で以下のような方法が掲載されていました。

何これ、全然わからん

convert_image の箇所で何か技巧的なことをしているのですが、構文が全く理解出来ませんでした。
当初、これって難読なPythonアンチパターンなんじゃない?と思って見なかったことにしたのですが、
先輩によるとこれは簡潔で良いコードなのだそうです。
という訳で、一つずつ砕いて理解しました。

この記事はその際の記録です。

その1 : lambda 式

lamnda 式って何?

lambda から始まる箇所のことを「無名関数」とか「ラムダ式」と言うそうで、「関数をより簡潔に書くための書式」だそうです。

Python における Lambda 式の構文は下記のようになるそうです

私が苦手な三項演算子によく似ています。

実際に書いてみる

これだけ見てもよく分からないので、簡単な関数を書いて、それをラムダ式にしてみました。
以下のような関数を書いてみました。引数に取った数に1を加える関数です

関数 add_one を先ほどのラムダ式の構文に当てはめると、こうなります。

なんとなく、ラムダ式の箇所で何が起こっているのかが分かりました。

その2 : データ構造”辞書”

辞書って何?

キーによって値を指定するデータ構造のことを、Pythonだと「辞書(dict)」と呼ぶそうです。
他の言語において「連想配列」とか「ハッシュマップ」と呼ばれているものと同じものの様です。
これは、研修で使ったJavaやPHPでも同じようなものがあったので、使い方はなんとなく分かりました。

実際に書いてみる

例えば

その3 : ラムダ式と辞書の合わせ技

最初に掲載したサンプルコードだと、ラムダ式と辞書を合わせて使っていました。
上の例における “PHP” や “Java” の箇所にラムダ式が入っている感じでしょうか。

ポイントは呼び出すときの書式

を覚えるのが大変ということな気がします。

実際に書いてみる

add_type の値によって、加算する数値が変わるようにしてみました。

最初のサンプルと同じ形になりました!
これで、あのコードがなにをしているのかが漸く分かりました。

おわりに

こんなに長々と書いているのにほとんど断定の文がないという、
非常に危うい記事が出来上がってしまいました。

この記事を書くために、この記事に載せた以外にもサンプルプログラムを書いて実行してと繰り返していたのですが、
ラムダ式だと簡潔に書けるということがなんとなく分かってきました。

例えば、最後に載せたサンプルをラムダ式を用いずに関数で書いてみたのが以下の物になります。

コードの行数もインデントも増えました。
この場合はラムダ式で書いた方が良さそうです。
適材適所だとは思うのですが、必要となったときにパパッと書けるように、
あの独特の構文に慣れていこうと思います。

この記事を書いた人

江藤 光
江藤 光
新人です。

Python