Pythonで、make_cylinder_volume(r)
別の関数を返す関数を書きたいのですが。返される関数は、パラメータを使用して呼び出すことができh
、高さh
と半径を持つ円柱の体積を返す必要がありますr
。
Pythonの関数から値を返す方法を知っていますが、別の関数を返すにはどうすればよいですか?
回答:
Pythonを使用して、これを試してください。
import math
def make_cylinder_volume_func(r):
def volume(h):
return math.pi * r * r * h
return volume
このように使用します。たとえば、radius=10
and height=5
:
volume_radius_10 = make_cylinder_volume_func(10)
volume_radius_10(5)
=> 1570.7963267948967
関数を返すことは、関数内に新しい関数を定義し、最後にそれを返すという単純な問題であることに注意してください。各関数に適切なパラメーターを渡すように注意してください。参考までに、別の関数から関数を返す手法は、カリー化と呼ばれます。
10
あなたが渡したあなたはどこかに保存されていますか?ガベージコレクションはいつ行われますか?
匿名関数とも呼ばれるラムダを使用すると、volume
内部の関数を抽象化できます。make_cylinder_volume_func
1行に。ÓscarLópezの答えと何ら変わりはありませんが、ラムダを使用したソリューションは、ある意味で「より機能的」です。
これは、ラムダ式を使用して受け入れられた回答を書く方法です。
import math
def make_cylinder_volume_fun(r):
return lambda h: math.pi * r * r * h
そして、他のカリー化された関数と同じように呼び出します。
volume_radius_1 = make_cylinder_volume_fun(1)
volume_radius_1(1)
=> 3.141592653589793
lambda h:
削除された場合、関数は同じように機能しますか?
return
が戻る前に結果を評価しようとし、変数の束であるため、float値を返すためです(関数を返してみれば機能します)。lambda
次のコードは評価されるべきではなく、変数rのスコープはmake_cylinder..
。によって返される関数に保持されることを示しています。
私はパーティーに遅すぎることを知っていますが、この解決策は面白いと思うかもしれません。
from math import pi
from functools import partial
def cylinder_volume(r, h):
return pi * r * r * h
make_cylinder_with_radius_2 = partial(cylinder_volume, 2)
make_cylinder_with_height_3 = partial(cylinder_volume, h=3)
print(cylinder_volume(2, 3)) # 37.6991118431
print(make_cylinder_with_radius_2(3)) # 37.6991118431
print(make_cylinder_with_height_3(2)) # 37.6991118431
これがどのように機能するかについてのドキュメントpartial
です。