Learn about functools.reduce( ) and itertools.accumulate( ) in python.
reduce()与accumulate
reduce()
functools模块用于高阶函数。作用于或返回其他函数的函数。一般来说,任何可调用对象都可以被视为用于此模块的函数。
functools模块提供以下函数functools.reduce()
functools.reduce()
将两个参数的函数从左到右累加地应用于iterable的项,以便将iterable缩减为单个值-python文档
functools.reduce(function, iterable,initializer)
如果存在可选的初始值设定项,则该初始值设定项将放在计算中iterable的项之前,并在iterable为空时用作默认值。
如果未给定初始值设定项,并且iterable只包含一项,则返回第一项。
示例:reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
示例1:使用reduce()查找列表元素的乘积
from functools import reduce
num1=[1,2,3,4,5]
num2=reduce(lambda x,y:x*y,num1)
print (num2)#Output:120
示例2:使用reduce()查找iteable中的最大数
from functools import reduce
num1=[15,12,30,4,5]
num2=reduce(lambda x,y: x if x>y else y,num1)
print (num2)#Output:30
图示:
示例3:在reduce()中使用用户定义的函数
from functools import reduce
def sum1(x,y):
return x+y
num1=[15,12,30,4,5]
num2=reduce(sum1,num1)
print (num2)#Output:66
例4:提到初始化器。
如果存在可选的初始值设定项,则它将放在计算中iteable的项之前。
from functools import reduce
def sum1(x,y):
return x+y
num1=[1,2,3,4,5]
num2=reduce(sum1,num1,10)
print (num2)#Output:25
示例5:Iterable只包含一个项,reduce()将返回该项。
from functools import reduce
def sum1(x,y):
return x+y
num1=[5]
num2=reduce(sum1,num1)
print (num2)#Output:5
from functools import reduce
num1=[15]
num2=reduce(lambda x,y: x if x>y else y,num1)
print (num2)#Output:15
示例6:如果iterable为空并且给定了初始值设定项,reduce()将返回初始值设定项。
from functools import reduce
def sum1(x,y):
return x+y
num1=[]
num2=reduce(sum1,num1,10)
print (num2)#Output:10
itertools.accumulate()
生成一个迭代器,返回func参数中提到的其他二进制函数的累积和或累积结果。
如果提供了func,则它应该是两个参数的函数。输入iterable的元素可以是任何可以接受为func.-Python文档参数的类型
itertools.accumulate(iterable[, func, *, initial=None])
例1:通过使用itertools.accumulate(),我们可以找到iterable的运行积。函数参数以operator.mul形式给出。
它将返回一个产生所有中间值的迭代器。我们可以使用list()构造函数将其转换为list。
from itertools import accumulate
import operator
num2=accumulate([1,2,3,4,5],operator.mul)
print (list(num2))
#Output:[1, 2, 6, 24, 120]
图形表示法。
例2:如果没有提到函数参数,默认情况下它将执行加法操作
它将返回一个产生所有中间值的迭代器。我们可以使用list()构造函数将其转换为列表。
import itertools #using add operator,so importing operator module import operator num1=itertools.accumulate([1,2,3,4,5]) print (num1)#Output:<itertools.accumulate object at 0x02CD94C8> #Converting iterator to list object. print (list(num1))#Output:[1, 3, 6, 10, 15]#using reduce() for same function from functools import reduce r1=reduce(operator.add,[1,2,3,4,5]) print (r1)#Output:15
示例3:函数参数以max()形式给出,以查找正在运行的最大值
from itertools import accumulate
num4=accumulate([2,4,6,3,1],max)
print (list(num4))#Output:[2, 4, 6, 6, 6]
例4:如果提到初始值,它将从初始值开始累积。
from itertools import accumulate import operator #If initial parameter is mentioned, it will start accumulating from the initial value. #It will contain more than one element in the ouptut iterable.num2=accumulate([1,2,3,4,5],operator.add,initial=10) print (list(num2))#Output:[10, 11, 13, 16, 20, 25]
例5:如果iterable为空并且提到了初始参数,它将返回初始值。
from itertools import accumulate
import operator
num2=accumulate([],operator.add,initial=10)
print (list(num2))#Output:[10]
例6:如果iterable包含一个元素,并且没有提到初始参数,它将返回该元素。
from itertools import accumulate
num2=accumulate([5],lambda x,y:x+y)
print (list(num2))#Output:[5]
示例7:使用for循环遍历迭代器
返回类型是迭代器。我们也可以使用for循环遍历迭代器。
from itertools import accumulate
num2=accumulate([5,6,7],lambda x,y:x+y)
for i in num2:
print (i)
'''
Output:
5
11
18
'''
reduce()和accumulate()之间的差异
结论:
- functools模块支持reduce()函数。
- itertools模块支持accumulate()函数。
- reduce()将只返回一个累计值。
- accumulate()将返回正在运行的累计值。就像我们可以用accumulate()函数找到一个iterable的running max,running product,running sum。
- accumulate()返回一个迭代器。
感谢您阅读我的文章,希望对您有所帮助!
原文:https://codeburst.io/reduce-vs-accumulate-in-python-3ecee4ee8094
本文:http://jiagoushi.pro/node/1490
讨论:请加入知识星球【首席架构师智库】或者微信小号【cea_csa_cto】
- 登录 发表评论
- 45 次浏览
最新内容
- 1 day 23 hours ago
- 2 days 13 hours ago
- 3 days 23 hours ago
- 4 days 17 hours ago
- 4 days 17 hours ago
- 4 days 17 hours ago
- 4 days 18 hours ago
- 4 days 18 hours ago
- 4 days 18 hours ago
- 4 days 19 hours ago