Pythonでのlambdaの使用について、その3つの良い友达と紹介します!

3702 ワード

匿名関数lambda
pythonはdef文に加えて、関数オブジェクトを生成する式形式を提供します.LISP言語のツールと似ているため、lambdaと呼ばれています.
defのように、この式は呼び出し可能な関数を作成しますが、この関数を変数に割り当てるのではなく、関数を返します.これらがlambdaが匿名関数と呼ばれる理由です.実際、彼はよく行内で関数定義を行う方法で使用したり、いくつかのコードの実行を遅らせたりします.
Lambdaの一般的な形式は、キーワードlambdaの後に1つ以上のパラメータ(defヘッダ内でカッコで囲まれたパラメータリストと似ています)が続き、直後にコロン、後に式が続きます.
lambda arg1,arg2,argn:expression using arguments

Lambda式によって返される関数オブジェクトはdefによって作成され、コピーされた関数オブジェクトと完全に一致しますが、lambdaには特定の役割を果たす場合に役立ついくつかの違いがあります.
Lambdaは文ではなく式です
このためlambdaはpython構文でdefが現れない場所に現れることができる.さらに、式としてlambdaは値(新しい関数)を返し、選択的に変数に値を割り当てることができます.逆に、def文は、結果として返すのではなく、ヘッダで新しい関数を変数に値を割り当てる必要があります.
Lambdaのトピックは、コードブロックではなく単一の式です.
このlambdaのトピックはdef本体return文に置かれているコードのように簡単です.単純に結果をスムーズな式に書き、明確な戻りではありません.しかし、それは式に限られているため、lambdaは通常def機能より少ない...lambda本体に限られた論理をカプセル化することができます.彼は簡単な関数を書くために設計されているからです.上記の違いを除いて、defもlambdaも同じ種類の仕事をすることができます.
defとlambdaの同じ使い方
x = lambda x, y, z: x + y + z
x(2, 3, 4)
>>> 9

y = (lambda a='hello', b='world': a + b)
y(b='Python')
>>> 'hellopython'

なぜlambdaを使うのか
上の2つの小さな例を見たことがありますが、defと変わらないと言う人が多いのではないでしょうか.私たちはなぜlambdaを使うのでしょうか.
通常、lambdaは関数のスケッチとして機能し、使用するコードに関数の定義を埋め込むことができます.彼は完全にオプションです(defを使用して代用することができます).しかし、実行可能なコードを1つ切り込むだけで、より簡潔な書く効果をもたらします.
Lambdaは通常、ジャンプテーブル、すなわち動作のリストまたは辞書を作成するために使用され、必要に応じて操作を実行することができます.例えば、次のようにします.
l = [lambda x: x ** 2, lambda x: x ** 3, lambda x: x ** 4]
for f in l:
    print(f(2))
>>> 4
>>> 8
>>> 16
print(l[0](3))
>>> 9

セグメントの実行可能なコードをdef文に記述する必要がある場合、文法的に実現できない点は、lambda式がdefのスケッチとして最も有用であり、上のコードがdefで記述されると、次のようになります.
def f1(x):
    return x ** 2
 
def f2(x):
    return x ** 3
 
def f3(x):
    return x ** 4
 
l = [f1, f2, f3]

for f in l:
    print(f(2))
print(l[0](3))

実際には、pythonの辞書や他のデータ構造を使用して、より多くの種類の動作テーブルを構築し、同じことをすることができます.
Lambdaでif-elseを実現
Pythonに含まれる単行式:if a:b else c構文はlambdaでも同様に適用されます.
lower = lambda x,y:x if x>> 4

半日見ても、lambdaがpythonの中でdefより優れていると便利だとは思わないかもしれませんが、lambdaといえば、3つの関数map、filter、reduceに言及しなければなりません.この3つの関数に触れると、lambdaの本当の便利さを感じることができます.
map関数
プログラムがリストや他のシーケンスに対してよくしなければならないことは、要素ごとに操作を行い、その結果を集合することです.pythonは、シーケンスオブジェクトの各要素に関数を適用し、すべての関数呼び出し結果を含むリストを返すツールmapを提供します.
栗を挙げると、リストがあります.リストの各フィールドを+10する必要があります.どうすればいいですか.
list_show = [1, 2, 3, 4]
#   1
new_list_show = []
for i in list_show:
    new_list_show.append(i + 10)

print(new_list_show)

#   2
def adds(x):
    return x + 10

print(list(map(adds, list_show)))

#       3:
print(list(map(lambda x: x + 10, list_show)))

上の3つの実現方法を見て、あなたはそれがもっとPythonicだと思いますか?
eg:mapはpython 3で反復可能なオブジェクトであり、リスト呼び出しを使用して表示のためにすべての結果を生成する必要があることに注意してください.python 2は必要ありません.
もちろんmapの記述関数は、自分で作成したものだけでなく、pythonが持っている多くの関数もサポートしています.例えば、
list_show = [1, -2, 3, -4, 5, -6]
print(list(map(abs, list_show)))
>>> [1, 2, 3, 4, 5, 6]

ろ過関数
filterは字面の意味を通じて、データのフィルタリング操作に使われていることを知っています.それはlambdaの良い友达で、栗を挙げています.0-9をフィルタリングし、2で割り切れる数字でリストを構成する必要があります.どうすればいいですか?コードを1行だけ必要とします.
print(list(filter(lambda x: x % 2 == 0, range(10))))
>>> [0, 2, 4, 6, 8]

そう、filterはこんなに簡単で実用的です....
reduceの妙用
reduceはpython 2では簡単な関数ですが、python 3ではfunctoolsに収録されていることを責めます.反復器を受信して、単一の結果を処理して返します.
list_show = [1, 2, 3, 4]
print(reduce(lambda x, y: x + y, list_show))
>>> 10
print(reduce(lambda x, y: x * y, list_show))
>>> 24

Lambdaの実用とその良い友达はここまで紹介して、みんなに役に立つことを望んでいます.