【问题标题】:Python function compositionPython函数组成
【发布时间】:2010-02-17 09:11:50
【问题描述】:

我已经尝试用很好的语法来实现函数组合,这就是我所拥有的:

from functools import partial

class _compfunc(partial):
    def __lshift__(self, y):
        f = lambda *args, **kwargs: self.func(y(*args, **kwargs)) 
        return _compfunc(f)

    def __rshift__(self, y):
        f = lambda *args, **kwargs: y(self.func(*args, **kwargs)) 
        return _compfunc(f)

def composable(f):
    return _compfunc(f)

@composable    
def f1(x):
    return x * 2

@composable
def f2(x):
    return  x + 3

@composable
def f3(x):
    return (-1) * x

print f1(2) #4
print f2(2) #5
print (f1 << f2 << f1)(2) #14
print (f3 >> f2)(2) #1
print (f2 >> f3)(2) #-5

它适用于整数,但在列表/元组上失败:

@composable
def f4(a):
    a.append(0)

print f4([1, 2]) #None

哪里出错了?

【问题讨论】:

  • 我认为“粉碎”是指“崩溃”?我认为“崩溃”是指“引发异常”?此外,如果我运行您发布的确切代码,它就可以正常工作。
  • 我看不出f4() 没有按设计工作。也许你的期望是错误的。
  • 谢谢,伊格纳西奥。我犯了一个非常愚蠢的错误。

标签: python function-composition


【解决方案1】:

append 进行就地添加,正如 Ignacio Vazquez-Abrams 所说(嗯,暗示)——所以,虽然你可以通过在你的函数中添加一个 return 来解决这个问题,但它会产生副作用也改变它传递的参数:

@composable
def f4(a):
    a.append(0)
    return a

最好使用以下更简洁的代码,该代码也创建并返回一个新对象:

@composable
def f4(a):
  return a + [0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多