在 Python 中使用列表理解计算总和
Calculate sum using a list comprehension in Python
reduce()
列表理解返回一个列表,而不是一个数字,但我们可以使用函数以类似的方式计算列表中元素的总和。该
reduce()
函数可用于在每个元素上调用 reducer 函数并生成单个值。
主程序
from functools import reduce list_of_numbers = [5, 10, 15] total = reduce(lambda acc, current: acc + current, list_of_numbers) print(total) # 👉️ 30
我们使用该reduce()
函数对列表求和。
reduce
函数采用以下 3 个参数:
姓名 | 描述 |
---|---|
功能 | 一个带有 2 个参数的函数 – 累加值和可迭代的值。 |
可迭代的 | iterable 中的每个元素都将作为参数传递给函数。 |
初始值设定项 | 一个可选的初始化值,在计算中放置在可迭代项之前。 |
例子中的
lambda
函数以累计值和当前值作为参数,返回两者之和。在列表项中运行 reducer 函数的最终结果是一个单一的值——总和。
如果我们为参数提供一个值initializer
,它会被放在计算中可迭代项的前面。
主程序
from functools import reduce list_of_numbers = [5, 10, 15] total = reduce( # 👇️ accumulator is `0` on first iteration lambda acc, current: acc + current, list_of_numbers, 0 # 👈️ initial value of 0 ) print(total) # 👉️ 30
您还可以提取该函数并使用几个print()
调用来更好地了解其reduce
工作原理。
主程序
from functools import reduce list_of_numbers = [5, 10, 15] def get_sum(acc, current): print('accumulator: ', acc) print('current: ', current) return acc + current total = reduce( get_sum, list_of_numbers, 0 # 👈️ initial value of 0 (acc is 0 on first iteration) ) print(total) # 👉️ 30
在示例中,我们传递0
了初始化参数,因此 的值
accumulator
将出现0
在第一次迭代中。
accumulator
如果我们没有为 传递一个值,那么的值将被设置为可迭代对象中的第一个元素initializer
。
主程序
from functools import reduce list_of_numbers = [5, 10, 15] def get_sum(acc, current): # 👇️ acc is 5 on first iteration print('accumulator: ', acc) print('current: ', current) return acc + current total = reduce( get_sum, list_of_numbers, ) print(total) # 👉️ 30
如果iterable
为空并且initializer
提供了,initializer
则返回。
主程序
from functools import reduce list_of_numbers = [] def get_sum(acc, current): print('accumulator: ', acc) print('current: ', current) return acc + current total = reduce( get_sum, list_of_numbers, 0, # 👈️ set initializer to 0 ) print(total) # 👉️ 0
上例中的列表为空,因此0
返回了初始化器 ( ) 的值。
如果initializer
未提供并且可迭代对象仅包含1
项目,则返回第一项。
主程序
from functools import reduce list_of_numbers = [5] def get_sum(acc, current): print('accumulator: ', acc) print('current: ', current) return acc + current total = reduce( get_sum, list_of_numbers, ) print(total) # 👉️ 5
示例中的列表仅包含一个元素,我们没有为 提供值initializer
,因此该reduce()
函数返回了列表元素。