Pythonを学ぶために学ばなければならないいくつかの高次関数

1.ラムダ式

匿名関数(英語:匿名関数)は、識別子(関数名)を定義する必要のない関数のクラスを指します。素人の言葉で言えば、それは私たちが関数名なしで機能することを可能にします。

通常の状況では、defキーワードを使用して関数を定義します匿名関数の使用法を学ぶ場合、代替手段deflambdaです。

ここ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

おすすめ

転載: blog.csdn.net/weixin_36338224/article/details/109350873