匿名関数ラムダ式
**匿名機能とは何ですか? ****
匿名関数は、その名前が示すように、名前のない関数です。プログラムで定義するためにdefを使用する必要はなく、lambdaキーワードを直接使用して単純なコードロジックを記述できます。 Lambdaは本質的に関数オブジェクトであり、別の変数に割り当てることができます。その後、関数を変数から呼び出すことも、直接使用することもできます。
# 通常、最初に関数を定義してから呼び出します
def power(x):return x **2print(power(2))
# ラムダ式を使用する場合、次のように操作できます
power = lambda x : x **2print(power(2))
# 面倒くさい、このように呼ぶこともできます
print((lambda x:2* x)(8))
ラムダ式の基本フォーマット:ラムダ入力パラメーター:式
# 次のような複数の入力パラメータが存在する可能性があります。
power = lambda x, n: x ** n
print(power(2,3))
ラムダ式の使用シナリオ
一般に、一時的な小さな関数を作成するのに適しています。たとえば、上記のpower関数では、もちろんdefを使用して定義できますが、ラムダを使用して作成すると、特に高次の関数を使用する場合に非常に簡潔になります。
関数を定義し、リストを渡し、リストの各要素の値に1を追加します
def add(l =[]):return[x +1for x in l]print(add([1,2,3]))
上記の関数は、すべての要素の値に2を追加するように変更されています
これは簡単ではないと言うかもしれません。1を2に戻すだけです。しかし、それは本当に機能しますか?関数が複数の場所で使用されていて、他の場所に2を追加したくない場合はどうなりますか?
これは扱いやすく、なる部分を抽出し、発信者を通過させます
def add(func,l =[]):return[func(x)for x in l]
def add1(x):return x+1
def add2(x):return x+2print(add(add1,[1,2,3]))print(add(add2,[1,2,3]))
簡単な質問は、非常に多くのコードで実現する必要がありますか?
def add(func,l =[]):return[func(x)for x in l]print(add(lambda x:x+1,[1,2,3]))print(add(lambda x:x+2,[1,2,3]))
マップ機能
マップの基本フォーマット
map(func, *iterables)
map()関数は3つ以上のパラメーターを受け取ります。最初のパラメーターは関数で、残りはシーケンスです。渡された関数はシーケンスの各要素に順番に適用され、結果は新しいシーケンスとして返されます。 map(func、[1,2,3])に似ています
同様に、私たちはまだそのような機能を完了するようになります:リストの各要素の値に1を追加します
def add(x):return x +1
result =map(add,[1,2,3,4])print(type(result))print(list(result))
ラムダ式を使用して操作を簡素化する
result =map(lambda x: x +1,[1,2,3,4])print(type(result))print(list(result))
関数内に2つのパラメーターがあるマップ関数の形式
map関数を使用して、2つのシーケンス内のデータの対応する位置を合計し、戻ります。つまり、2つのシーケンス[1,2,3]、[4,5,6]を操作した後、結果[5,7、 9]
print(list(map(lambda x, y: x + y,[1,2,3],[4,5,6])))
2つのシーケンスの要素の数が同じであるかどうかは比較的簡単に理解できます。 2つのシーケンスの番号が異なる場合、エラーが報告されますか?
print(list(map(lambda x, y: x + y,[1,2,3],[4,5])))
エラーは報告されないことがわかりますが、結果は最も少なくなります
削減機能
リデュース機能の基本フォーマット
reduce(function, sequence, initial=None)
Reduce関数はシーケンスに関数を適用します。この関数は2つのパラメーターを受け取る必要があります。reduce関数はシーケンスの次の要素で結果を計算し続けます。これは再帰に似ています。reduce関数は前回の計算結果によって今回に適用されます。計算
reduce(func, [1,2,3]) = func(func(1, 2), 3)
リストの積を計算するには、reduce関数を使用します
from functools import reduce
def func(x, y):return x * y
print(reduce(func,[1,2,3,4]))
ラムダ式を組み合わせて操作を簡素化する
from functools import reduce
print(reduce(lambda x, y: x * y,[1,2,3,4]))
フィルター機能
フィルタは、その名前が示すように、不純物(不要なデータ)でフィルタリングすることを意味し、フィルタによって処理された後、フィルタリングされます。
フィルタ機能の基本フォーマット
filter(function_or_None, iterable)
filter()は関数とシーケンスを受け取ります。渡された関数を各要素に順番に適用し、戻り値がTrueかFalseかに応じて、要素を保持するか破棄するかを決定します。
フィルタ関数を使用して特定のシーケンスを操作し、最後にシーケンス内のすべての偶数を返します
print(list(filter(lambda x: x %2==0,[1,2,3,4,5])))
ソートされた関数
ソート済みは文字通り見ることができます。これはソート用の関数です。ソート済みはすべての反復可能なオブジェクトをソートできます
ソートの基本フォーマット
sorted(iterable, key=None, reverse=False)
# iterable --反復可能なオブジェクト。
# key --比較に使用されるメイン要素には、パラメーターが1つだけあります。特定の関数のパラメーターは、反復可能オブジェクトから取得され、反復可能オブジェクト内の要素を指定して並べ替えます。
# reverse --並べ替えルール、逆=真の下降、逆=誤った昇順(デフォルト)。
# シーケンスを昇順で並べ替えます
print(sorted([1,6,4,5,9]))
# シーケンスを降順で並べ替えます
print(sorted([1,6,4,5,9], reverse=True))
# 複数のリストを格納するリストを並べ替える
data =[["Python",99],["c",88]]print(sorted(data, key=lambda item: item[1]))
閉鎖
すべてがオブジェクトであるPythonで、関数を関数の戻り値として返すことはできますか?
def my_power():
n =2
def power(x):return x ** n
return power
p =my_power()print(p(4))
#------------------------------------------------------------
def my_power():
n =2
def power(x):return x ** n
return power
n =3
p =my_power()print(p(4))
my_power関数が戻ると、参照値(n)も返されることがわかります。nの値は新しい関数によって使用されます。この場合、これをクロージャーと呼びます。
my_power関数からnの値を削除するとき、この時点での計算結果を見てみましょう。
n =2
def my_power():
def power(x):return x ** n
return power
n =3
p =my_power()print(p(4))
出力結果が64なのはなぜですか?
まず、閉じるときのp .__ closure____の結果を見てみましょう。
# 例1
def my_power():
n =2
def power(x):return x ** n
return power
p =my_power()print(p.__closure__)
# 結果:(<cell at 0x00000264518F9A38: int object at 0x00007FFA7F617120)
# クロージャは内部関数の属性であり、環境変数を保存するために使用されます
#---------------------------------------------------------------------
# 例2
n =2
def my_power():
def power(x):return x ** n
return power
n =3
p =my_power()print(p.__closure__)
# 出力結果なし
例1と例2を比較すると、例2はクロージャーではないことがわかります。
古典的な閉鎖の問題
次のプログラムは閉鎖ですか?正しく実行できますか
def my_power():
n =2
def power(x):
n +=1return x ** n
return power
p =my_power()print(p(3))
上記のプログラムを正しく実行するにはどうすればよいですか?修正後の結果を見てください
def my_power():
n =2
def power(x):
nonlocal n
n +=1return x ** n
return power
p =my_power()print(p.__closure__)print(p(3))print(p(3))
次のプログラムの結果を見てください
def my_power():
n =2
L =[]for i inrange(1,3):
def power():return i ** n
L.append(power)return L
f1, f2 =my_power()print(f1())print(f2())print(f1.__closure__[0].cell_contents)print(f2.__closure__[0].cell_contents)
python関数は、実行されたときにのみ関数本体で変数の値を検索します。つまり、正式なパラメーターがわからない場合、私が何であるかをどのように知ることができますか?ここで、正式なパラメータについて確信が持てない場合、pythonは最後のi値のみを記憶することを覚えておく必要があります。
デコレータとそのアプリケーション
デコレータモードとは
デコレータパターンを使用すると、構造を変更せずに既存のオブジェクトに新しい機能を追加できます。このタイプの設計パターンは、既存のクラスのラッパーとして機能する構造パターンに属しています。
このモードは、元のクラスをラップする装飾クラスを作成し、クラスメソッド署名の整合性を維持しながら追加の機能を提供します。
import time
start = time.time()
time.sleep(4)
end = time.time()print(end - start)
実用的な例からデコレータを見てください
def my_fun():print("これは機能です")my_fun()
hello worldをもう1行印刷する前に、「This isafunction」を印刷してください。
def my_fun():
begin = time.time()
time.sleep(2)print("これが関数です")
end = time.time()print(end-begin)my_fun()
現時点で、元の関数を変更したくない場合、どのように修正できますか?
def my_fun():print("これは機能です")
def my_time(func):
begin = time.time()
time.sleep(2)func()
end = time.time()print(end - begin)my_time(func)
このように、関数を追加する必要があるため、すべてのビジネス呼び出し元は変更する必要があります。この方法は明らかに望ましくありません。
別の方法:
def print_cost(func):
def wrapper():
begin = time.time()
time.sleep(2)func()
end = time.time()print(end - begin)return wrapper
@ print_cost
def my_fun():print("これが関数です")
2番目の方法は、func関数の内部実装を変更しませんが、デコレータモードを使用して、その関数を装飾および拡張します。
上記はPython機能プログラミングの詳細な内容です。Python機能プログラミングの詳細については、ZaLou.Cnの他の関連記事に注意してください。
Recommended Posts