1.ラムダ式
匿名関数(英語:匿名関数)は、識別子(関数名)を定義する必要のない関数のクラスを指します。素人の言葉で言えば、それは私たちが関数名なしで機能することを可能にします。
通常の状況では、def
キーワードを使用して関数を定義します。匿名関数の使用法を学ぶ場合、代替手段def
はlambda
です。
ここdef
で使用しlambda
、例を示します。すぐに理解できます。
def mySum(x, y):
return x+y
mySum(2, 3)
# 5
(lambda x, y: x+y)(2, 4)
# 6
上記の例から、匿名関数が直接実行され、多くのコード行が節約されていることがわかります。何かありますか?
次に、その使用法を詳しく見てみましょう
带if / else
>>>( lambda x, y: x if x < y else y )( 1, 2 )
1
ネストされた機能
>>>( lambda x: ( lambda y: ( lambda z: x + y + z )( 1 ) )( 2 ) )( 3 )
6
再帰機能
>>> func = lambda n:1 if n == 0 else n * func(n-1)
>>> func(5)
120
または
>>> f = lambda func, n: 1 if n == 0 else n * func( func, n - 1 )
>>> f(f,4)
24
上記の例から判断すると、通常の関数と比較すると、ラムダ式の書き込みスタイルは奇妙で、読みやすさが比較的劣っています。直接実行できることに加えて、他に目立った機能はないようですが、なぜ今日それを導入するのですか?
まず、ラムダはステートメントではなく式であることを知っておく必要があります。この機能により、特別なシーンで使用できます。特定のシーンは何ですか?次に、いくつかの非常に便利な組み込み関数を紹介します。
2.マップ機能
マップ関数。2つのパラメーターを受け取ります。最初のパラメーターは関数オブジェクト(もちろんラムダ式にすることもできます)、2番目のパラメーターはシーケンスです。
どのような機能を実現できますか?例を挙げましょう。
>>> map(lambda x: x*2, [1,2,3,4,5])
[2, 4, 6, 8, 10]
次のシーケンスの各要素をパラメータとしてラムダに渡すことができることがはっきりとわかります。
map関数を使用していないときは、次のように記述します。
mylist=[]
for i in [1,2,3,4,5]:
mylist.append(i*2)
3.フィルター機能
フィルタ機能はマップ機能に似ています。また、ラムダ式とシーケンスの2つのパラメーターを受け取ります。後続のシーケンスで各要素をトラバースし、それをパラメーターとしてラムダ式に渡します。式がTrueを返すと、要素は保持されます。式がFalseを返すと、要素は破棄されます。
次の例では、0未満の要素のリストを除外します。
>>>filter(lambda x: x < 0, range(-5, 5))
[-5, -4, -3, -2, -1]
4.機能を減らす
削減機能も同様です。その機能は、最初にシーケンスの最初と2番目の要素を操作し、次にラムダ関数を使用して3番目のデータで結果を計算し、次に4番目の要素で結果を計算するというようになります。要素がなくなるまで。
これがあなたが理解するであろう例です。
>>>reduce(lambda x,y: x+y, [1,2,3,4,5])
15
計算プロセスは次のように分類されます。
1+2=3
3+3=6
6+4+10
10+5=15
5. 注意点
上記の関数は、それらの記述を巧みに習得することで、コードをよりPythonicに見せることができ、ある程度、コードはより簡潔に見えます。
初心者の場合は、上記の例がPython2.x環境で示されていることに注意する必要があります。Python 3.xでは、それは異なります。自分で試すことができます。
要約は次のとおりです。
まず、map関数とfilter関数が返すのは、リストではなく、イテレーターオブジェクトです。これが地図の例です
>>> map_obj = map(lambda x: x*2, [1,2,3,4,5])
>>> from collections.abc import Iterator
>>> isinstance(map_obj, Iterator)
True
>>> next(map_obj)
2
>>> list(map_obj)
[4, 6, 8, 10]
2つ目のポイントは、reduceを直接呼び出すことはできませんが、使用する前にインポートする必要があるということです。
from functools import reduce