ホームページ  >  記事  >  バックエンド開発  >  Python の詳細な分析 -- カリー化関数

Python の詳細な分析 -- カリー化関数

零到壹度
零到壹度オリジナル
2018-04-19 16:08:472187ブラウズ

この記事の例では、Python の詳細な分析 (カリー化関数) について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

1. 定義:

1) 2 つのパラメータを受け入れる元の関数を、1 つのパラメータを受け入れる新しい関数に変更するプロセスを指します。新しい関数は、元の 2 番目のパラメーターをパラメーターとして受け取る関数を返します

2) 例: 加算関数のカリー化: ネストによって関数をカリー化関数に変換する方法です。

def add(x,y):
    return x + y
def add(x):
    def _add(y):
        return x + y
    return _add

2 番目、アプリケーション:

要件:

追加関数。その機能を強化し、呼び出されたパラメーターと呼び出しに関する情報を出力できるようにしたいです。

def add(x,y):
    return x + y

ここで情報出力関数

def add(x,y):
    print('call add,x + y')  #log output to the console
    return x + y

を追加します。上記の追加関数は要件を満たしていますが、以下の3つの欠点があります。

1. print文の結合度が高すぎる。

2. 追加機能はビジネス機能に属しますが、情報を出力する機能は非ビジネス機能コードに属することができ、ビジネス機能追加に配置されるべきではありません。

次に、次の改善を行います:

def add(x,y):
    return x + y
def logger(fn):
    print('begin')  #enhanced output
    x = fn(4,5)
    print('end')    #enhanced features
    return x
print(logger(add))

上記の改善により、ビジネス機能の分離が達成されますが、fn 関数呼び出しでのパラメーターの受け渡しに問題があります。パラメータを柔軟に渡したいのですが、パラメータは内部関数にあります。この問題を解決するには、柔軟な言語 Python を使用するにはどうすればよいですか?

def add(x,y):
    return x + y
def logger(fn):
    def _logger(*args,**kwargs):
        print('begin')
        c = fn(*args,**kwargs)
        print('end')
        return c
    return _logger
logger(add)(2,3)

これで、パラメーターを柔軟に入力できるようになります

より具体的な例を以下に示します:

def ad1(m,n,*,l=909):
    return m + n + l
def loger(fn,*args,**kwargs):
    print('What\'s the matter?')
    ret = fn(*args,**kwargs)
    return ret
print(loger(ad1,2,3,l=4))   #Can you currying them?
def add(x,y,*,z=9):
    return x + y + z
def logger(fn,*args,**kwargs):
    print('This is a stupid function')
    ret = fn(*args,**kwargs)  #after collections it needs to be deconstructed
    return ret
print(logger(add,2,4,z=17))
def ad1(m,n,*,l=909):
    return m + n + l
def loger(fn):
    def _loger(*args,**kwargs):   #append a function as wrapper
        print('What\'s the matter?')    
        ret = fn(*args,**kwargs)   #the function which is be wrapped and transfer args and kwargs
        return ret
    return _loger
#print(loger(ad1)(2,3,l=4))  also okay
t = loger(ad1)  #defind the function loger
r = t(2,3,l=4)  # income parameters and transfer it
print(r)

3. 要約:

カリー化を学習すると、Python で最も重要かつ不可欠な知識が得られます。 デコレーター


関連する推奨事項:

js関数のカリー化

関数式のカリー化

JavaScript関数のスコープ、カリー化

カレー

以上がPython の詳細な分析 -- カリー化関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。