用functools.reduce优雅地编写序列处理

参考:

假设需要对变量x(初始为0)进行加1乘2减3,则一个直接地办法是

def add(x):
    return x+1
def mul(x):
    return x*2
def sub(x):
    return x-1
x = 0
x = add(x)
x = mul(x)
x = sub(x)
print(x)
>>> 1

这种写法比较简陋,可以使用functools.reduce来简化这个过程

reduce(function, sequence,initial=None) -> value

reduce对sequence连续使用function, 如果不给出initial, 则第一次调用传递sequence的两个元素, 以后把前一次调用的结果和sequence的下一个元素传递给function,官方例子如下:

x = functools.reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
print(x)
>>> 15

即对列表里的所有元素不断叠加,第一次取1,2相加得到3,第二次取3和3相加得到6…,类似地,如果把列表[1, 2, 3, 4, 5]替换为函数add,mul,sub便可以实现更优雅的写法,此时reduce返回的将是一个函数,即下面的fun,它表示先从函数列表中取addmul操作,这两个函数作为参数fg传给第一个lambda,这个lambada返回一个函数 lambda x: g(f(x)),它的参数是x, 返回f(g(x)),因此最后reduce返回的是一个嵌套函数。

import functools

def add(x):
    return x+1
def mul(x):
    return x*2
def sub(x):
    return x-1
fun = functools.reduce(lambda f, g: lambda x: g(f(x)), [add, mul, sub])
print(fun(0))
>>> 1
发布了83 篇原创文章 · 获赞 4 · 访问量 5352

猜你喜欢

转载自blog.csdn.net/weixin_43486780/article/details/105516148