我尝试用漂亮的语法实现函数组合,这就是我得到的:
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
哪里错了?
最佳答案
append
进行就地添加,正如 Ignacio Vazquez-Abrams 所说(好吧,暗示的)——所以,虽然您可以通过添加一个 return
来解决这个问题你的函数,它也会有改变传递给它的参数的副作用:
@composable
def f4(a):
a.append(0)
return a
最好使用以下更简洁的代码,它也创建并返回一个新对象:
@composable
def f4(a):
return a + [0]
关于Python函数组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2279423/