如何编写返回另一个函数的函数?

Jul*_*Das 72 python functional-programming function currying

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

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

Ósc*_*pez 151

试试这个,使用Python:

import math
def make_cylinder_volume_func(r):
    def volume(h):
        return math.pi * r * r * h
    return volume
Run Code Online (Sandbox Code Playgroud)

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

volume_radius_10 = make_cylinder_volume_func(10)
volume_radius_10(5)
=> 1570.7963267948967
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢您添加currying的参考.我只希望我能两次投票. (4认同)
  • @sudo看看https://en.wikipedia.org/wiki/Closure_(computer_programming) (4认同)

Dav*_*ito 13

使用lambdas(也称为匿名函数),可以将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
Run Code Online (Sandbox Code Playgroud)

然后打电话给你任何其他咖喱功能:

volume_radius_1 = make_cylinder_volume_fun(1)
volume_radius_1(1) 
=> 3.141592653589793
Run Code Online (Sandbox Code Playgroud)

  • @schoon不会在这种情况下不起作用.这实际上是一个非常有趣的案例,突出了"变量范围"和函数currying(基本上依赖于varibale范围)的想法.它不起作用的原因(在我的例子中)是因为`return`将在返回之前尝试评估结果,并且因为它是一堆变量,它将返回一些浮点值(尝试返回一个函数,它将会工作).`lambda`告诉我不应该计算以下代码,并且变量r的范围将保留在`make_cylinder..`返回的函数中. (2认同)

Ero*_*mic 10

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

 import pymonad 

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

 add5 = add(5)
 add5(4)
 9
Run Code Online (Sandbox Code Playgroud)

  • ```from functools importpartial add5 =partial(add, 5)``` 完全相同 (3认同)