ディレクトリ
- 高次機能
- 数学的概念
- 内蔵高階関数
- カリー化
- デコレーター
01高階関数
1.1数学的概念
Y = G(F(x)が )、 数学およびコンピュータサイエンスでは、高次関数は、以下の条件を満足する少なくとも関数でなければならない:
の関数として、1つ以上のパラメータを受信し、1)
2)の出力の関数
カウンタの例:
def counter(base):
def inc(step=1):
nonlocal base
base += step
return base
return inc
組み込み関数1.2 - 高階関数
sorte([反復可能[キー]逆、]) ソート、のリストを返し
(反復可能関数)フィルタを、フィルタエレメントは、イテレータを返しイテラブル
マップ(関数、*反復可能)を- >マップオブジェクトの複数の指定された関数はイテレータを返すよう繰り返し要素オブジェクトがマップさ
1.3カリーカリー化
カリー化:元の関数を意味する受信機能を新たなパラメータに2つのパラメータを受け付け、機能は、既存の第二パラメータに新たな機能を返すパラメータであり
、Z = F(x、y)の変換Z = F(X)(Yなど )
これは、関数のカリー化によって機能ネストされた関数に変換することができます。
例えば
def add(x,y):
return x+y
変更後
def add(x):
def _add(y):
nonlocalt x
retrun x+y
return _add
1.4デコレータ:
:導入され
、合計する機能を出力することができるが呼ばれると、コール情報のパラメータをされて、その機能を強化する考え
def add(x, y):
return x + y
情報出力機能の追加:
def add(x, y):
print("call add, {}+{}".format(x,y))
return x + y
上記の機能は、要求添加を完了したが、以下の欠点有しれる:
1)高い印刷ステートメントカップリング
2)を追加する機能は、サービス機能に属し、非ビジネス機能コードに関連する情報を出力し、関数は、さらにサービスに置かれるべきではありません
以下の改善:
def add(x, y):
return x + y
def logger(fn):
print("Begin")
x = fn(4, 5)
print("end")
print(logger(add))
そして、分離ビジネス機能は、侵入コードがありません
改善します
def add(x,y):
return x+y
def logger(fn,x,y):
print('before')
ret = fn(x,y)
print('after')
return ret
しかし、FNパラメータは2つのパラメータを含むためだけに制限されて
改善し続けます
def add(x,y):
return x+y
def logger(fn,*args,**kwargs):
print('before')
ret = fn(*args,**kwargs)
print('after')
return ret
カリー化の方法
def add(x,y):
return x+y
def logger(fn):
def _logger(*args, **kwargs):
print('before')
ret = fn(*args, **kwargs)
print('after')
return ret
return _logger
# 如下调用
add = logger(add) # 因为函数调用的关系,参数add的引用用在函数内部保存
add(4, 5) # 调用的是内部保存的add引用,而非原本的add函数
Pythonのデコレータとして改善
def logger(fn):
def _logger(*args, **kwargs):
print('before')
ret = fn(*args, **kwargs)
print('after')
return ret
return _logger
@logger
def add(x,y):
return x+y
print(add(4, 10))
- デコレータと高次関数
デコレータは、高階関数であるが、装飾は、機能拡張に渡された機能的または装飾的な機能であります