美文网首页Python全栈工程师Python函数
18.2-functools之reduce和偏函数

18.2-functools之reduce和偏函数

作者: BeautifulSoulpy | 来源:发表于2019-09-18 21:15 被阅读0次

    压力最大的时候,效率可能最高;最忙碌的时候,学的东西可能最多;最惬意的时候,往往是失败的开始;寒冷到了极致,太阳就要光临。成长不是靠时间,而是靠勤奋;时间不是靠虚度,而是靠利用;感情不是靠缘分,而是靠珍惜;金钱不是靠积攒,而是靠投资;事业不是靠满足,而是靠踏实。

    1.函数神器:functools模块全解析

    functools 模块提供用于调整或扩展函数和其他可调用对象的工具,而无需完全重写它们。

    reduce函数

    reduce函数会对参数序列中元素进行累积。reduce函数将一个可迭代对象中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
    Python2里reduce是内置函数,python3里需要通过functools库导入。

    语法:
    reduce(function, iterable)

    案例:
    from functools import reduce
    reduce(lambda x, y: x+y, [1,2,3,4,5])
    Result:15
    reduce(lambda x, y: x * y, range(1, 6))
    Result:120
    

    我们也可以写一个自己的reduce函数,如下:

    #构建自己的reduce函数:
    def myreduce(fn,seq):
        start = seq[0]
        for i in seq[1:]:
            start = fn(start,i)
        return start
    
    # reduce源码
    from functools import reduce
    
    def reduce(function, iterable, initializer=None):
        it = iter(iterable)
        if initializer is None:
            value = next(it)
        else:
            value = initializer
        for element in it:
            value = function(value, element)
        return value
    
    reduce(lambda value,x: value + x,range(5), 10)
    -----------------------------------------------------
    20
    
    偏函数
    functools模块partial方法:

    偏函数:把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成一个新的函数并返回; 从partial生成新的函数,是对原函数的封装;在标准库里大量使用;

    偏函数 把多参数函数变成单参的,单参函数就可以当无参装饰器使用了:

    from functools import partial
    square = partial(power, exponent=2)
    print(square(2))
    --------------------------
    4
    
    范例1:
    def partial(func, *args, **keywords):
        def newfunc(*fargs, **fkeywords):
            newkeywords = keywords.copy()
            newkeywords.update(fkeywords)
            return func(*args, *fargs, **newkeywords)
        newfunc.func = func
        newfunc.args = args
        newfunc.keywords = keywords
        return newfunc
    
    def add(x,y):
        pass
    
    add(4,5) #y=5
    newadd = partial(add,5)
    newadd(4)
    
    
    范例2:
    from functools import partial
    import inspect
    def add(x,y):
        return x+y
    
    add(4,5)
    newadd = partial(add,4)
    print(inspect.signature(newadd))
    print(newadd(5))
    
    newadd = partial(add,5)
    print(inspect.signature(newadd))   # 函数签名
    print(newadd(4))
    
    newadd = partial(add,x=4,y=5)
    print(inspect.signature(newadd))
    print(newadd())
    
    newadd = partial(add,x=4,y=5)
    print(inspect.signature(newadd))
    print(newadd(x=10,y=11))
    
    newadd = partial(add,x=4)
    print(newadd(5,6))
    ------------------------------------
    (y)
    9
    (y)
    9
    (*, x=4, y=5)
    9
    (*, x=4, y=5)
    21
    TypeError                                 Traceback (most recent call last)
    <ipython-input-20-a5ea786a8bd0> in <module>
         22 
         23 newadd = partial(add,x=4)
    ---> 24 print(newadd(5,6))
    
    TypeError: add() got multiple values for argument 'x'
    

    相关文章

      网友评论

        本文标题:18.2-functools之reduce和偏函数

        本文链接:https://www.haomeiwen.com/subject/qnwuyctx.html