我最近开始用Python编写代码,我想知道是否有可能返回一个专门处理另一个函数的函数。
例如,在Haskell中,您可以创建一个函数,将5添加到任何给定的数字,如下所示:
sumFive = (+5)在Python中有可能吗?
发布于 2016-02-08 22:00:02
我认为其他的答案是误解了这个问题。我相信OP是在询问函数的部分应用,在他的例子中,函数是(+)。
如果目标不是部分应用程序,则解决方案非常简单:
def sumFive(x): return x + 5对于Python中的部分应用程序,我们可以使用以下函数:https://docs.python.org/2/library/functools.html#functools.partial
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc然后,我们必须将+操作符转换为一个函数(我不认为有像Haskell这样的轻量级语法):
def plus(x, y): return x + y最后:
sumFive = partial(plus, 5)不像在Haskell那样好,但效果很好:
>>> sumFive(7)
12发布于 2016-02-13 10:13:06
Python的设计不支持将多变量函数计算成单变量函数序列(运行)。正如其他答案所指出的,https://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application的相关(但不同的)概念更容易使用函数工具模块中的partial。
但是,PyMonad库为您提供了工具,可以在Python中运行,它提供了“用于使用函子、应用函子和单子进行编程的类的集合”。
使用curry装饰器来装饰接受任意数量参数的函数:
from pymonad import curry
@curry
def add(x, y):
return x + y这是非常容易咖喱add。该语法与Haskell的语法没有太大的不同:
>>> add5 = add(5)
>>> add5(12)
17 请注意,这里的add和add5函数是PyMonad的Reader monad类的实例,而不是普通的Reader函数对象:
>>> add
<pymonad.Reader.Reader at 0x7f7024ccf908>例如,这允许使用更简单的语法来组合函数(在Haskell中很容易实现,在Python中通常要少得多)。
最后,值得注意的是,infix操作符+不是+函数:+调用左操作数的__add__方法,或者右操作数的__radd__方法并返回结果。如果您想使用+ (免责声明:我还没有尝试这样做),则需要为您正在使用的对象装饰这些类方法。
发布于 2016-02-08 21:40:10
是啊。Python支持lambda表达式:
sumFive = lambda x: x + 5
for i in range(5):
print sumFive(i),
#OUTPUT 5,6,7,8,9https://stackoverflow.com/questions/35279806
复制相似问题