理解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中嵌套的两个列表l1l2

📝作为一个快速的练习,试着在其他嵌套的可迭代对象上使用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的教程。

类似文章