パフォーマンス:
で関数を作成すると、で作成するよりlambda
もわずかに高速def
です。違いはdef
、ローカル テーブルに名前エントリを作成することによるものです。結果の関数の実行速度は同じです。
読みやすさ:
Lambda 関数は、ほとんどの Python ユーザーにとってやや読みにくいですが、状況によってははるかに簡潔です。非機能ルーチンから機能ルーチンへの変換を検討してください。
# Using non-functional version.
heading(math.sqrt(v.x * v.x + v.y * v.y), math.atan(v.y / v.x))
# Using lambda with functional version.
fheading(v, lambda v: math.sqrt(v.x * v.x + v.y * v.y), lambda v: math.atan(v.y / v.x))
# Using def with functional version.
def size(v):
return math.sqrt(v.x * v.x + v.y * v.y)
def direction(v):
return math.atan(v.y / v.x)
deal_with_headings(v, size, direction)
ご覧のとおり、機能バージョンに変換するには、元の非機能バージョンにlambda
追加するだけでよいという意味で、バージョンは短く、「より簡単」です。lambda v:
また、はるかに簡潔です。しかし覚えておいてください、多くの Python ユーザーはラムダ構文に混乱するでしょう。そのため、長さと実際の複雑さで失ったものは、仲間のコーダーからの混乱で取り戻される可能性があります。
制限:
lambda
関数は、変数名に割り当てられていない限り、一度しか使用できません。
lambda
変数名に割り当てられた関数は、def
関数よりも有利ではありません。
lambda
関数はピクルするのが困難または不可能な場合があります。
def
関数の名前は、合理的に説明的で一意であるか、少なくともスコープ内で使用されないように慎重に選択する必要があります。
一貫性:
Python は、関数型プログラミングの規則をほとんど避けて、手続き型でより単純な目的セマンティクスを採用しています。オペレーターは、このlambda
バイアスとは正反対です。さらに、すでに普及している の代替として、def
関数lambda
は構文に多様性を追加します。一貫性が低いと考える人もいます。
既存の機能:
他の人が指摘したように、フィールドでの の多くの使用は、または他のモジュールlambda
のメンバーに置き換えることができます。operator
例えば:
do_something(x, y, lambda x, y: x + y)
do_something(x, y, operator.add)
多くの場合、既存の関数を使用すると、コードが読みやすくなります。
Pythonic の原則: 「それを行うための明白な方法は 1 つ、できれば 1 つだけであるべきです」</p>
これは、唯一の真実の情報源の原則に似ています。残念なことに、単一の明白な方法を実行するという原則は、真の指針となる原則ではなく、Python にとって常に物欲しそうな願望でした。Python の非常に強力な配列内包表記について考えてみましょう。map
これらは、 関数と 関数と機能的に同等filter
です。
[e for e in some_array if some_condition(e)]
filter(some_array, some_condition)
lambda
とdef
同じです。
それは意見の問題ですが、明らかに何かを壊さない一般的な使用を意図した Python 言語は、十分に「Pythonic」であると言えます。