2013-01-10 130 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 
相关问题