lambda は、小さな無名の単一式関数です。map、filter、reduce は、イテラブル全体に関数を適用する関数型のツールです。これらを組み合わせることで関数型のスタイルが実現できますが、Python では同じ処理にしばしば comprehension が好まれます。
# a lambda is a one-line function with no name
square = lambda x: x ** 2
square(5) # 25
# equivalent named function:
def square(x): return x ** 2
lambda は、他の関数へのインライン引数として、特にソートやフィルタのキーとして真価を発揮します。
people.sort(key=lambda p: p.age) # sort by an attribute
sorted(words, key=lambda w: len(w)) # sort by length
max(items, key=lambda x: x.score) # find max by a criterion
nums = [1, 2, 3, 4]
list(map(lambda x: x ** 2, nums)) # [1, 4, 9, 16]
# more Pythonic alternative — a comprehension:
[x ** 2 for x in nums] # [1, 4, 9, 16]
list(filter(lambda x: x % 2 == 0, nums)) # [2, 4]
# comprehension equivalent:
[x for x in nums if x % 2 == 0] # [2, 4]
from functools import reduce
reduce(lambda acc, x: acc + x, nums, 0) # 10 (sum)
# but built-ins are clearer when they exist:
sum(nums) # 10
For map/filter, COMPREHENSIONS are usually more readable and idiomatic:
map(f, xs) → [f(x) for x in xs]
filter(pred, xs) → [x for x in xs if pred(x)]
Lambdas are best for short inline keys (sort/max/filter), NOT complex logic.
Guido(Python の作者)とコミュニティは一般に、可読性の観点から map/filter よりも comprehension を好みます。reduce は組み込みからも外されました。しかし key= 関数としての lambda は依然として Python 的でよく使われます。
これらの関数型ツールを使うと、変換やフィルタリングを簡潔に表現できます。
Python は関数型でも書ける一方、Python 的な選択肢は通常、可読性のために map/filter よりも comprehension を、reduce よりも組み込み関数(sum、max、min)を使うことです。
lambda が真に輝くのは、sort/max/min/filter に key として渡す小さなインライン関数としてです。
その両方を理解し、comprehension と組み込み関数を好む Python 流の傾向を知っておくことで、きれいで Python 的なコードを書けるようになり、実際のプロジェクトに現れる関数型スタイルのコードも読めるようになります。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する