2013-01-10 175 views
44

在Python中,我想寫一個函數make_cylinder_volume(r),它返回另一個函數。返回的函數應該可用參數h調用,並返回高度爲h和半徑r的圓柱體積。如何編寫一個返回另一個函數的函數?

我知道如何從函數在Python返回,但我怎麼回另一個函數

+2

http://stackoverflow.com/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

謝謝您添加對currying的引用。我只希望我能兩次上癮。 – HeatfanJohn

+1

所以你傳入的'10'存儲在某個地方?它什麼時候被垃圾收集? – sudo

+3

@sudo查看https://en.wikipedia.org/wiki/Closure_(computer_programming) –

6

只是想指出的是,你可以用pymonad

import pymonad 

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

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

做到這一點使用lambda表達式,也被稱爲匿名函數,你可以抽象出volume功能make_cylinder_volume_func裏面一行。與ÓscarLópez的答案沒有任何區別,使用lambda的解決方案仍然在某種意義上「更實用」。

這是如何使用lambda表達式寫公認的答案:

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 
相關問題