3

同じ本からの同じ例: Python ディープ ネスト ファクトリ関数

def maker(N):
    def action(X):
        return X ** N 
    return action

私はその背後にあるコンセプトを理解しており、本当に素晴らしいと思いますが、このアプローチをいつ使用できるか想像できないようです.

maker()代わりに N と X の両方を引数として取ることで、上記を簡単に実装できました。

このタイプのファクトリ関数を使用して、複数の引数を取る代わりにこのアプローチを採用した理由を説明してくれる人はいますか?

それは単なるユーザーの好みですか?

4

2 に答える 2

3
squarer = maker(2)

print(squarer(2)) # outputs 4
print(squarer(4)) # outputs 16
print(squarer(8)) # outputs 64

基本的に、これはN値を 1 回入力するだけでよく、後で変更できないことを意味します。

同じことを行うには複数の方法があるため、ほとんどがプログラミングスタイルだと思います。ただし、この方法ではN値を 1 回しか入力できないため、コードを追加して、関数を呼び出すたびにチェックする代わりに、有効な値であることを 1 回テストすることができます。

EDIT は考えられる例を考えただけです(ただし、通常はクラスを使用して処理されます):

writer = connectmaker("127.0.0.1")
writer("send this text")
writer("send this other text")

次に、「メーカー」メソッドはアドレスに一度接続し、 への呼び出しごとにその値を維持しますwriter()。しかし、私が言ったように、このようなものは通常、__init__が値を格納するクラスです。

于 2013-10-23T17:24:11.607 に答える
1

operatorある意味、これらの機能の一部も見ることができます。

たとえば、次のoperator.itemgetter()ように動作します。

import operator
get1 = operator.itemgetter(1) # creates a function which gets the item #1 of the given object
get1([5,4,3,2,1]) # gives 4

これはkey=、ソート関数などの関数としてよく使用されます。

それによって解決できる具体的な問題がある場合、同様の、より専用のユースケースが容易に想像できます。

同じリーグには、次の「デコレータ作成者」がいます。

def indirect_deco(outer_param):
    def real_deco(func):
        def wrapper(*a, **k):
            return func(outer_param, *a, **k)
        return wrapper
    return real_deco

@indirect_deco(1)
def function(a, b, c):
    print (((a, b, c))

function(234, 432)

ここでも、外側の関数は「本当のデコ」関数を作成するファクトリ関数です。これにより、最初に指定されたものを置き換える別のものが作成されます。

于 2013-10-23T17:22:41.240 に答える