理解 Python 的求和函数 [With Examples]

深入解析 Python 中的 sum() 函数:从语法到各种可迭代对象的使用,并附带实用代码示例。

在 Python 中操作可迭代对象,例如数字列表时,一个常见任务是计算列表中所有元素的总和。 当处理其他可迭代对象,如元组和集合时,也会遇到类似需求。

虽然有多种方法可以实现这一目标,但推荐的、符合 Python 风格的方式是使用内置的 sum() 函数。

本文将首先探讨其他方法,例如循环和自定义函数,然后深入研究 Python sum() 函数的语法和代码示例,以帮助您更好地理解它。

在 Python 可迭代对象中求和

您可以直接在 Python REPL 环境中编写代码,或者使用 techblik.com 提供的在线 Python 编辑器。

以下面的数字列表为例:

>>> nums = [2,8,5,3,11,7,9]

我们的目标是找到这个列表中所有数字的总和。 稍后我们将介绍 Python 的 sum() 函数,但首先,让我们看看其他一些方法,包括:

  • 使用简单的 for 循环
  • 使用 functools 模块中的 reduce() 函数
  • 定义自定义函数

使用循环

要找到列表中所有元素的总和,可以使用 for 循环,步骤如下:

  • 将变量 total 初始化为零。
  • 遍历 nums 列表,访问每个数字。
  • 将每个数字加到 total 中。
>>> nums = [2,8,5,3,11,7,9]
>>> total = 0
>>> for num in nums:
...     total += num
...
>>> total
45

使用 reduce() 函数

另一种对可迭代对象求和的方法是使用 reduce() 函数。该函数内置于 Python 的 functools 模块中,它接收一个函数和一个可迭代对象,并通过连续地将函数应用于可迭代对象的元素来“减少”可迭代对象。

这里我们使用 lambda 函数来定义两个数字的加法,并将 nums 列表作为可迭代对象传入。

>>> nums = [2,8,5,3,11,7,9]
>>> from functools import reduce
>>> total = reduce(lambda n1, n2: n1 + n2, nums)
>>> total
45

reduce() 函数的工作方式是从左到右连续相加两个数字,直到最终得到一个总和值:

使用自定义函数

我们还可以定义一个自定义函数来完成求和操作。 下面我们定义了一个名为 sum_list 的函数:

  • 它接受一个数字列表作为参数;
  • 返回列表中元素的总和。

函数体内部使用了之前看到的循环结构,但定义一个函数可以提高代码的复用性。

>>> def sum_list(some_list):
...     total = 0
...     for num in some_list:
...        total += num
...     return total
...

使用 nums 作为参数调用 sum_list() 函数,将返回总和 45:

>>> nums = [2,8,5,3,11,7,9]
>>> total = sum_list(nums)
>>> total
45

接下来,让我们深入了解内置的 sum() 函数。 它不仅简洁,而且功能强大,可以应用于多种可迭代对象和数据类型。

Python sum() 函数的语法

sum() 函数的语法如下:

sum(iterable, start)

这里,

  • iterable 是一个必需的参数。 它可以是任何可进行求和操作的可迭代对象,例如数字列表或元组。 如果使用 Python 字符串调用 sum() 函数,将会引发 TypeError 异常(稍后会详细介绍)。
  • start 是一个可选参数。 它通常是一个数值,添加到计算的总和中。 当需要给结果加上一个常量值时,这会很有用。

现在我们已经了解了 Python sum() 函数的语法,接下来让我们使用它来对可迭代对象求和。

使用 sum() 函数对可迭代对象求和

#1. 列表

让我们使用 sum() 函数计算 nums 列表中数字的总和:

>>> nums = [2,8,5,3,11,7,9]
>>> sum_1 = sum(nums)
>>> sum_1
45

使用可选的起始值

要向总和添加一个常量值,可以使用带有可选起始值的 sum() 函数。 在这里,我们将起始值 100 作为位置参数传入:

>>> sum_start = sum(nums,100)
>>> sum_start
145

起始值也可以指定为关键字参数:

>>> sum_start = sum(nums,start=10)
>>> sum_start
55

#2. 元组

sum() 函数也适用于元组。 我们将 nums 列表转换为元组,得到 nums_tuple

>>> nums_tuple = tuple(nums)
>>> nums_tuple
(2, 8, 5, 3, 11, 7, 9)
>>> sum_2 = sum(nums_tuple)
>>> sum_2
45

#3. 集合

我们还可以对一组数字使用 sum() 函数:

>>> nums_set = set(nums)
>>> nums_set
{2, 3, 5, 7, 8, 9, 11}

这里,我们将 nums 列表转换为 Python 集合,并计算 nums_set 中元素的总和。

>>> sum_3 = sum(nums_set)
>>> sum_3
45

#4. 字典

考虑以下带有数字键的 student_dict。 请注意,当您使用此字典作为参数调用 sum() 函数时会发生什么。

>>> students_dict = {1:106,2:112,3:127}
>>> sum_4 = sum(students_dict)
>>> sum_4
6

默认情况下,sum() 函数返回键的总和。

对键求和

我们知道默认行为是对字典的键求和。

但是,您可以通过使用字典的 keys() 方法访问键,使这一点更加明确。 然后将键列表传递给 sum() 函数:

>>> sum_keys = sum(students_dict.keys())
>>> sum_keys
6

对值求和

如果您想改为对字典的值求和,请通过调用字典对象的 values() 方法来访问这些值:

>>> sum_vals = sum(students_dict.values())
>>> sum_vals
345

将 Python 的 sum() 函数与其他数值数据类型一起使用

到目前为止,我们已经了解了如何将 sum() 函数与整数可迭代对象一起使用。 现在让我们看几个其他数字数据类型的示例。

复数

sum() 函数也可用于对复数求和。 在此示例中,nums_c 是一个复数列表:

>>> nums_c = [3 + 4j, 1 + 2j]
>>> sum_c = sum(nums_c)
>>> sum_c
(4+6j)

浮点数

在这里,我们使用 sum() 函数对浮点数列表 nums_f 求和:

>>> nums_f = [1.8,2.5,3.6,7.2]
>>> sum_f = sum(nums_f)
>>> sum_f
15.100000000000001

📑 为了提高浮点数相加结果的精度,可以使用 math 模块中的 fsum() 函数对浮点值进行求和。

使用 sum() 函数进行展平操作

现在让我们看看如何使用 sum() 函数来展平并连接可迭代对象。

展平列表

假设我们有一个嵌套列表:

>>> lists = [[2,4,6],[3,5,7]]

当我们传递此嵌套列表作为参数,并将一个空列表作为起始值调用 sum() 函数时:

>>> sum(lists,[])
[2, 4, 6, 3, 5, 7]

我们看到,嵌套列表现在已被展平为一个数字列表。

等效地,当我们认为列表的形式为 l3 = [l1, l2]时, sum() 函数将连接嵌套在列表 l3 中的两个列表 l1l2

📝 作为一个快速练习,尝试在其他嵌套的可迭代对象上使用 sum() 函数。

常见陷阱:不要对字符串使用 Python 的 sum() 函数

由于我们已经看到 sum() 函数可以用于展平和连接列表(以及元组等其他可迭代对象),我们很容易认为也可以使用它来连接字符串。

但是,如果您尝试这样做,将会遇到 TypeError

>>> sum(['a','b','c'],'')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]

因此,sum() 函数不能用于求和(或连接)字符串。

但是,如上面的错误消息所示,您可以使用 join() 方法将字符串列表连接成单个字符串。

>>> ''.join(['a','b','c'])
'abc'

结论

在本文中,我们学习了如何使用内置的 sum() 函数来计算可迭代对象中所有元素的总和。 sum() 函数的一般语法是 sum(iterable, start),其中 iterable 是必需参数,start 是可选参数。

随后,我们通过多个示例,理解了 sum() 函数与列表、元组、集合和字典等可迭代对象的用法。 此外,我们还探讨了 sum() 函数如何用于展平并连接可迭代对象——Python 字符串除外。

希望本教程对您有所帮助。 接下来,您可能想查看有关 Python map 函数的教程。