103

在 Python 中,我想编写一个make_cylinder_volume(r)返回另一个函数的函数。返回的函数应该可以使用参数调用h,并返回具有高度h和半径的圆柱体的体积r

我知道如何从 Python 中的函数返回,但是如何返回另一个函数

4

5 回答 5

203

试试这个,使用 Python:

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

像这样使用它,例如与radius=10and height=5

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

请注意,返回一个函数是在函数内部定义一个新函数并在最后返回它的简单问题——注意为每个函数传递适当的参数。仅供参考,从另一个函数返回一个函数的技术称为currying

于 2013-01-11T03:17:45.697 回答
22

使用 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
于 2017-07-09T08:00:04.663 回答
10

只是想指出你可以用 pymonad 做到这一点

 import pymonad 

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

 add5 = add(5)
 add5(4)
 9
于 2016-11-09T03:13:35.870 回答
2

我知道我参加聚会为时已晚,但我认为您可能会觉得这个解决方案很有趣。

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

于 2020-02-19T13:01:26.363 回答
-1

这是一个庞大的示例,它涵盖了一个函数中的许多单个多参数情况

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'")

这里先调用需要运算的数学函数,然后使用返回的函数进行实际计算

于 2020-12-17T09:03:29.077 回答