ラムダ関数(ラムダ式)というものは他の言語でも馴染みのあるものです。
いわゆる「無名関数」というもので、
関数に名前をつけず、コード量を削減することができます。
僕のイメージでは、map()関数やfilter()関数にてラムダ式を見ることがよくあります。
Javaでは僕も使用していました。
ですが、Pythonには内包表記というパワフルな記述法があります。
map()関数やfilter()関数などに至っては、内包表記で全て事が足ります。(たぶん)
個人的に、ラムダ式は少し可読性が下がり、
Pythonにおいては、内包表記で完結できるのであれば、
内包表記を使用した方が、可読性も高いと思いました。
map()関数とfilter()関数を例にとって、解説していきます。
目次
- 1.map()関数(ラムダ式)
- 1-1.内包表記で同じ処理を書いてみる
- 2.filter()関数(ラムダ式)
- 2-1.内包表記で同じ処理を書いてみる
- 3.まとめ
目次
1.map()関数(ラムダ式)
map()関数とはリスト等のオブジェクトと関数を引数として受け取り、
引数で受け取ったオブジェクトを、引数で受け取った関数に渡され、処理がされます。
ラムダ式で記述すると以下のようになります。
1 2 3 |
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for n in map(lambda n:n**2, numbers): print(n) |
上記はnumbersリスト内の値を全て二乗した後に出力しています。
ラムダ式の部分が少し読みづらいですね。
1-2.内包表記で同じ処理を書いてみる
同じ処理を内包表記で記述すると以下のようになります。
1 2 3 |
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] squares = [n**2 for n in numbers] print(squares) |
内包表記の方が読みやすくないですか?
2.filter()関数(ラムダ式)
filter()関数とはリスト等のオブジェクトから、条件に沿った要素のみ抽出できる関数です。
ラムダ式で記述すると以下のようになります。
1 2 3 |
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for n in filter(lambda n:n%2!=0, numbers): print(n) |
上記はnumbersリスト内の値から奇数のみを抽出して出力しています。
もちろん読めなくはないですが、個人的には内包表記の方が好きです(笑)
2-2.内包表記で同じ処理を書いてみる
1 2 3 |
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] odds = [n for n in numbers if n%2!=0] print(odds) |
こちらの方が直感的に分かりやすい気がします。
3.まとめ
結局のところ、人によって読みやすさは変わると思います。。。
今回は「ラムダで出来ることは内包表記でも出来るよ!」(たぶん)と言いたかっただけです!
ラムダで出来て内包表記で出来ないことや、
こういう処理の時はラムダの方が読みやすい、書きやすい等があれば、
ぜひぜひコメントで教えてください。
以上、Tigerでした。