理解Python的sum函数【附例子】
学习有关Python中的sum()函数的所有内容:从使用不同可迭代对象的语法——带有有用的代码示例。
在使用Python可迭代对象(如数字列表)时,常见的操作是找到列表中所有元素的总和。在使用其他可迭代对象(如元组和集合)时,我们也会遇到这样的操作。
有几种不同的方法可以实现这一目标,但推荐的Pythonic方式是使用内置的sum()函数。
在这里,我们将首先看看其他方法,比如循环和定义函数。然后我们将继续学习Python的sum()函数的语法和代码示例,以更好地理解它。
在Python可迭代对象中求和
📋 您可以在Python REPL中进行编码。或者您可以使用Geekflare’s Online Python editor。
考虑以下数字列表:
>>> nums = [2,8,5,3,11,7,9]
我们的目标是找到列表中所有数字的总和。我们很快就会介绍Python的sum()
函数,但我们将从一些其他方法开始。这些方法包括:
- 使用简单的循环
- 使用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()
函数。reduce函数内置于Python的functools模块中,它接受一个函数和一个可迭代对象,并通过连续应用函数于可迭代对象的元素来减少可迭代对象。
在这里,我们使用一个匿名函数来定义两个数字的加法,并将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
使用可选的起始值
为了将一个常数值添加到和中,我们可以使用可选的start
值来调用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
列表转换为集合,并计算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() function将具有浮点数值的可迭代对象求和。
使用Sum函数展平
现在让我们看看如何使用sum()
函数来展平和连接可迭代对象。
展平列表
假设我们有一个嵌套的列表:
>>> lists = [[2,4,6],[3,5,7]]
当我们将这个嵌套的列表作为参数传递给sum()
函数,并将空列表作为start
值:
>>> 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 "", line 1, in
TypeError: sum()无法对字符串求和 [请使用''.join(seq)代替]
所以sum()
函数不能用来求和(或连接)字符串。
然而,如上面的错误消息中所示,您可以使用join()
方法将字符串列表连接成单个字符串。
>>> ''.join(['a','b','c'])
'abc'
结论
在本教程中,我们学习了如何使用内置的sum()
函数来找出可迭代对象中所有元素的和。使用sum()
函数的一般语法是:sum(iterable, start)
,其中iterable
是一个必需的参数,而start
是一个可选的参数。
然后,我们编写了几个示例来理解在列表、元组、集合和字典等可迭代对象中使用sum()
函数的方法。稍后,我们还看了一下如何使用sum()
函数来展平和连接可迭代对象,但不包括Python字符串。
希望本教程对您有所帮助。接下来,您可能想查看关于Python’s map function的教程。