跳转到主要内容

热门内容

今日:


总体:


最近浏览:


Chinese, Simplified

Learn about functools.reduce( ) and itertools.accumulate( ) in python.

 

reduce()与accumulate

reduce()

functools模块用于高阶函数。作用于或返回其他函数的函数。一般来说,任何可调用对象都可以被视为用于此模块的函数。

functools模块提供以下函数functools.reduce()

functools.reduce()

将两个参数的函数从左到右累加地应用于iterable的项,以便将iterable缩减为单个值-python文档

functools.reduce(functioniterable,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】

 

最后修改
星期四, 一月 5, 2023 - 21:56
Tags
 
Article