私のコースのトレーニング部分の1つで、次の質問がありました。
make_multiplier(factor)
引数xを取り、係数*xを返す関数を返す関数を記述します。
例えば:
f=make_multiplier(10)
f(1)
10
f(2)
20
これからどこから始めればいいのか全くわかりません。私はすべてのメモを調べましたが、役に立つものは何も見つかりませんでした。
誰かが私にヒントを与えるか、私がする必要があることの正しい方向に私を向けることができますか?
関数を返す関数は次のとおりです。
def foo():
def bar():
return 42
return bar
あなたはそれをそのように呼ぶことができます:
foo()() # 42
# or
baz = foo()
baz() # 42
ヒントがあります。
非常にシンプルで、関数をネストするだけです。
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
の異なる値がどのように与えられたかに注意してください。x
x
f
ラムダを使用することもできます。ラムダは、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
ラムダの使用:
>>> 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
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