美文网首页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和偏函数

    压力最大的时候,效率可能最高;最忙碌的时候,学的东西可能最多;最惬意的时候,往往是失败的开始;寒冷到了极致,太阳就...

  • FP

    偏函数 颠倒实参顺序 组合函数 组合函数 reduce实现 pipe(...) VS compose(...)p...

  • Swift 高阶函数

    高阶函数之Reduce public func reduce(_ initialResult: R...

  • 5-python中reduce()函数

    reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数...

  • day3

    实现一个reduce函数,作用和原生的reduce类似。

  • reduce()函数

    reduce()函数接收的参数和map()类似,一个函数f,一个list,但行为和map()不同,reduce()...

  • Hadoop权威指南学习笔记

    1.关于MapReduce: map函数: reduce函数: combiner(合并函数):在reduce函数处...

  • for in ,for of, reduce

    for in ,for of, reduce 高级函数 filter map reduce filter 回调函数...

  • python 中的函数式编程

    高阶函数 map/reduce python 里面内建了map()和reduce()函数:现在知道有一个集合lis...

  • 2019-01-24记录

    计算函数被执行次数 ---- javascript reduce()函数的用法(): reduce函数可 接受一个...

网友评论

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

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