Python 函数组合

9 投票
1 回答
4168 浏览
提问于 2025-04-15 19:23

我尝试用好看的语法来实现函数组合,这里是我写的代码:

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

问题出在哪里呢?

1 个回答

9

正如Ignacio Vazquez-Abrams所说(其实是暗示),append是直接在原地添加的。这意味着,如果你想解决这个问题,只需在你的函数里加一个return,但这样做会有一个副作用,就是会改变传入的参数。

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

最好使用下面这段更简洁的代码,它还会创建并返回一个新的对象:

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

撰写回答