web-dev-qa-db-ja.com

別の関数を返す関数を作成するにはどうすればよいですか?

Pythonでは、別の関数を返す関数make_cylinder_volume(r)を書きたいと思います。返された関数は、パラメータhで呼び出し可能で、高さhおよび半径rの円柱の体積を返す必要があります。

Pythonの関数からvaluesを返す方法は知っていますが、どのようにして別の関数を返すのですか?

66
Julian Das

Pythonを使用して、これを試してください:

import math
def make_cylinder_volume_func(r):
    def volume(h):
        return math.pi * r * r * h
    return volume

このように使用します。たとえば、radius=10およびheight=5

volume_radius_10 = make_cylinder_volume_func(10)
volume_radius_10(5)
=> 1570.7963267948967

関数を返すことは、関数内で新しい関数を定義し、最後にそれを返すという単純な問題であることに注意してください-各関数に適切なパラメーターを渡すように注意してください。参考までに、別の関数から関数を返す手法は currying として知られています。

145
Óscar López

匿名関数とも呼ばれるラムダを使用すると、make_cylinder_volume_func内のvolume関数を1行に抽象化できます。オスカー・ロペスの答えと何ら変わりはありませんが、ラムダを使用した解決策は、ある意味で「より機能的」です。

これは、ラムダ式を使用して受け入れられた答えを書く方法です。

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
12
DaveIdito

あなたがpymonadでこれを行うことができることを指摘したいだけです

 import pymonad 

 @pymonad.curry
 def add(a, b):
     return a + b

 add5 = add(5)
 add5(4)
 9
10
Erotemic