1

私のコースのトレーニング部分の1つで、次の質問がありました。

make_multiplier(factor)引数xを取り、係数*xを返す関数を返す関数を記述します。

例えば:

f=make_multiplier(10)
f(1)
10
f(2)
20

これからどこから始めればいいのか全くわかりません。私はすべてのメモを調べましたが、役に立つものは何も見つかりませんでした。

誰かが私にヒントを与えるか、私がする必要があることの正しい方向に私を向けることができますか?

4

5 に答える 5

4

関数を返す関数は次のとおりです。

def foo():
    def bar():
        return 42

    return bar

あなたはそれをそのように呼ぶことができます:

foo()() # 42
# or
baz = foo()
baz() # 42

ヒントがあります。

于 2012-12-23T15:17:19.917 に答える
3

非常にシンプルで、関数をネストするだけです。

def make_multiplier(x):
    def multiplier(y):
        return x * y
    return multiplier

ネストされた関数は、外部関数が呼び出されたときのx値を使用して、周囲のスコープから未知の変数(この場合)を自動的に検索します。xここで覚えておくべきことは、関数も単なるオブジェクトであり、他のPythonオブジェクトと同じように変数に格納し、呼び出しを延期できることです。

これは与える:

>>> def make_multiplier(x):
...     def multiplier(y):
...         return x * y
...     return multiplier
... 
>>> f = make_multiplier(10)
>>> f(1)
10
>>> f(2)
20
>>> g = make_multiplier(5)
>>> g(1)
5
>>> f(3)
30

の値とは独立した、gの異なる値がどのように与えられたかに注意してください。xxf

ラムダを使用することもできます。ラムダは、1つの式に限定された単なる無名関数です。ここではそれで十分です:

def make_multiplier(x):
    return lambda y: x * y

別の代替手法は、キーワードパラメータにバインドxすることです。これは、必要に応じてそれをオーバーライドできることを意味します。

def make_multiplier(x):
    def multiply(y, x=x):
         return x * y
    return multiply

またはラムダバージョン:

def make_multiplier(x):
    return lambda y, x=x: x * y

次に、返された呼び出し可能オブジェクトに1つまたは2つの引数を渡します。

>>> f = make_multiplier(10)
>>> f(5)
50
>>> f(5, 3)
15
于 2012-12-23T15:17:08.987 に答える
0

私はこれを推奨しているわけではありません。意味のない自由なスタイル可能なことを示しているだけです。

>>> from functools import partial
>>> from operator import mul
>>> make_multiplier = partial(partial, mul)
>>> f = make_multiplier(10)
>>> f(1)
10
>>> f(2)
20
于 2012-12-24T00:04:06.660 に答える
0

ラムダの使用:

>>> make_multiplier = lambda n: lambda x: x * n
>>> make_multiplier(10)(5)
50

10000000 ループ、ベストオブ 3: ループあたり 0.189 マイクロ秒

標準ライブラリの使用:

import functools
import operator

f = lambda n: functools.partial(operator.mul, n)

10000000 ループ、ベストオブ 3: ループごとに 0.148 usec

于 2012-12-23T22:32:05.113 に答える
0

Matt BallまたはMartijn Pietersのクロージャー メソッド (この特定のケースでは正しい答えです) に加えて、Python で認識する価値のある形式が他に 2 つあります。

1 つ目は、ラムダ匿名関数を使用することです。

>>> f=lambda x: x*10
>>> f(1)
10
>>> f(2)
20

2番目はクラスを書くことです:

class Multiplyby:
    def __init__(self,x):
        self.x=x

    def __call__(self,y):
        return self.x*y

fx10=Multiplyby(10)
fx5=Multiplyby(5)


for y in [1,2,3]:
    print y, fx10(y), fx5(y)

プリント:

1 10 5
2 20 10
3 30 15
于 2012-12-23T18:34:17.080 に答える