四.Python高階関数とデコレーター

ディレクトリ

  • 高次機能
    • 数学的概念
    • 内蔵高階関数
    • カリー化
    • デコレーター

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))
  • デコレータと高次関数
    デコレータは、高階関数であるが、装飾は、機能拡張に渡された機能的または装飾的な機能であります

おすすめ

転載: www.cnblogs.com/luckyleaf/p/12112523.html