Python函数组合

标签 python function-composition

我尝试用漂亮的语法实现函数组合,这就是我得到的:

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/

相关文章:

python - 为什么游标没有再次创建?

python - 在哪里可以找到在 Python shell 中加载的第一个文本并对其进行更改?

Haskell 函数由两个二元函数组成?

overloading - 为什么这些表达有不同程度的歧义?

list - 练习多重组合,列表中的函数

python - 如何识别在 python 中从 set() 中删除的元素?

python - 在python中解码json字符串

python - Python变量何时未定义?

haskell - 如何在 Haskell 中使用 (.)

python - 如何制作函数 Composer