2013-01-10 18 views
44

Pythonでは、別の関数を返す関数make_cylinder_volume(r)を書きたいと思います。返される関数は、パラメータhで呼び出し可能で、高さがh、半径がrの円筒の体積を返します。別の関数を返す関数を作成するにはどうすればよいですか?

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

+2

http://stackoverflow.com:あなたと思い、他のカリー化関数として呼び出して

import math def make_cylinder_volume_fun(r): return lambda h: math.pi * r * r * h 

そして:

この

では、ラムダ式を使用して受け入れ答えを書くことができる方法です/ questions/245192/what-are-first-class-objects –

答えて

101

のPythonを使って、これを試してみてください:

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

radius=10height=5で例えば、このようにそれを使用してください:機能を返すことは新しい関数を定義するだけの簡単な作業だったこと

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

お知らせ関数の中で適切なパラメータを渡すよう注意してください。参考までに、別の関数から関数を返す手法は、curryingとして知られています。

+2

カレーへの参照を追加していただき、ありがとうございます。私は2回upvoteすることができますことを願っています。 – HeatfanJohn

+1

あなたが渡した「10」はどこかに保存されていますか?いつガベージコレクションされますか? – sudo

+3

@sudo https://en.wikipedia.org/wiki/Closure_(computer_programming)をご覧ください。 –

6

はちょうどあなたが単一の行にmake_cylinder_volume_func内部volume機能アウト抽象的なことができ、あなたはまた、匿名関数として知られているラムダを使用しpymonad

import pymonad 

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

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

でこれを行うことができますことを指摘したいと思います。 ÓscarLópezの答えと異なる点はありませんが、ラムダを使った解決策はまだまだ意味があります。

volume_radius_1 = make_cylinder_volume_fun(1) 
volume_radius_1(1) 
=> 3.141592653589793 
関連する問題