深入解析 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
中的两个列表 l1
和 l2
。
📝 作为一个快速练习,尝试在其他嵌套的可迭代对象上使用 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
函数的教程。