在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
和 height=5
:
volume_radius_10 = make_cylinder_volume_func(10)
volume_radius_10(5)
=> 1570.7963267948967
请注意,返回函数很简单,只需在函数内部定义一个新函数,然后在最后返回它即可 - 请小心为每个函数传递适当的参数。仅供参考,从另一个函数返回一个函数的技术称为 currying。
使用 lambda(也称为匿名函数),您可以将
volume
内的 make_cylinder_volume_func
函数抽象为一行。与 Óscar Ló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
只是想指出你可以使用 pymonad 来做到这一点
import pymonad
@pymonad.curry
def add(a, b):
return a + b
add5 = add(5)
add5(4)
9
我知道我来得太晚了,但我想你可能会发现这个解决方案很有趣。
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
如何工作的
文档。
这是一个大型示例,涵盖了一个函数中的许多单个多个参数的情况
def maths(var='NA'):
if var.lower() == 'add':
def add(*args):
return "Sum is : "+str(sum(args))
return add
elif var.lower() == 'substract':
def substract(a,b):
if a>b:
return "Difference is : "+str(a-b)
else:
return "Difference is : "+str(b-a)
return substract
elif var.lower() == 'multiply':
def multiply(*args):
temp = 1
for x in args:
temp = temp*x
return "multiplication is : "+str(temp)
return multiply
elif var.lower() == 'divide':
def divide(a,b):
return "Division is : "+str(a/b)
return divide
else:
print("Please choose one of given operations: 'add','substract','multiply','divide'")
这里首先调用数学函数进行所需的运算,然后使用返回的函数进行实际计算
通过简单的例子函数返回另一个函数
def outer_func():
def inner_func():
print('inside inner func')
return inner_func
outer_func()()