4.3 创建数值列表
需要存储一组数的原因有很多。例如,在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分;在数据可视化中,处理的几乎都是由数(如温度、距离、人口数量、经度和纬度等)组成的集合。
列表非常适合用于存储数字集合,而Python提供了很多工具,可帮助你高效地处理数字列表。明白如何有效地使用这些工具后,即便列表包含数百万个元素,你编写的代码也能运行得很好。
4.3.1 使用函数range()
Python函数range() 让你能够轻松地生成一系列数。例如,可以像下面这样使用函数range() 来打印一系列数:
first_numbers.py
for value in range(1, 5):
print(value)
上述代码好像应该打印数1~5,但实际上不会打印5:
1
2
3
4
在这个示例中,range() 只打印数1~4。这是编程语言中常见的差一行为的结果。函数range() 让Python从指定的第一个值开始数,并在到达你指定的第二个值时停止。因为它在第二个值处停止,所以输出不包含该值(这里为5)。
要打印数1~5,需要使用range(1,6) :
for value in range(1, 6):
print(value)
这样,输出将从1开始、到5结束:
1
2
3
4
5
使用range() 时,如果输出不符合预期,请尝试将指定的值加1或减1。
调用函数range() 时,也可只指定一个参数,这样它将从0开始。例如,range(6) 返回数0~5。
4.3.2 使用range() 创建数字列表
要创建数字列表,可使用函数list() 将range() 的结果直接转换为列表。如果将range() 作为list() 的参数,输出将是一个数字列表。
在前一节的示例中,只是将一系列数打印出来。要将这组数转换为列表,可使用list() :
numbers = list(range(1, 6))
print(numbers)
结果如下:
[1, 2, 3, 4, 5]
使用函数range() 时,还可指定步长。为此,可给这个函数指定第三个参数,Python将根据这个步长来生成数。
例如,下面的代码打印1~10的偶数:
even_numbers.py
even_numbers = list(range(2, 11, 2))
print(even_numbers)
在这个示例中,函数range() 从2开始数,然后不断加2,直到达到或超过终值(11),因此输出如下:
[2, 4, 6, 8, 10]
使用函数range() 几乎能够创建任何需要的数集。例如,如何创建一个列表,其中包含前10个整数(1~10)的平方呢?在Python中,用两个星号(** )表示乘方运算。下面的代码演示了如何将前10个整数的平方加入一个列表中:
squares.py
❶ squares = []
❷ for value in range(1, 11):
❸ square = value ** 2
❹ squares.append(square)
❺ print(squares)
首先,创建一个名为squares 的空列表(见❶)。接下来,使用函数range() 让Python遍历1~10的值(见❷)。在循环中,计算当前值的平方,并将结果赋给变量square (见❸)。然后,将新计算得到的平方值附加到列表squares 末尾(见❹)。最后,循环结束后,打印列表squares (见❺):
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
为了让代码更简洁,可不使用临时变量square ,而直接将每个计算得到的值附加到列表末尾:
squares = []
for value in range(1,11):
❶ squares.append(value**2)
print(squares)
❶处的代码与squares.py中❸处和❹处的代码等效。在循环中,计算每个值的平方,并立即将结果附加到列表squares 的末尾。
创建更复杂的列表时,可使用上述两种方法中的任何一种。有时候,使用临时变量会让代码更易读;而在其他情况下,这样做只会让代码无谓地变长。你首先应该考虑的是,编写清晰易懂且能完成所需功能的代码,等到审核代码时,再考虑采用更高效的方法。
4.3.3 对数字列表执行简单的统计计算
有几个专门用于处理数字列表的Python函数。例如,你可以轻松地找出数字列表的最大值、最小值和总和:
>>> digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> min(digits)
0
>>> max(digits)
9
>>> sum(digits)
45
注意 考虑到版面,本节使用的数字列表都很短,但这里介绍的知识也适用于包含数百万个数的列表。
4.3.4 列表解析
前面介绍的生成列表squares 的方式包含三四行代码,而列表解析让你只需编写一行代码就能生成这样的列表。列表解析 将for 循环和创建新元素的代码合并成一行,并自动附加新元素。面向初学者的书并非都会介绍列表解析,这里之所以介绍列表解析,是因为等你开始阅读他人编写的代码时,很可能会遇到它。
下面的示例使用列表解析创建你在前面看到的平方数列表:
squares.py
squares = [value**2 for value in range(1, 11)]
print(squares)
要使用这种语法,首先指定一个描述性的列表名,如squares 。然后,指定一个左方括号,并定义一个表达式,用于生成要存储到列表中的值。在这个示例中,表达式为value2 ,它计算平方值。接下来,编写一个for 循环,用于给表达式提供值,再加上右方括号。在这个示例中,for 循环为for value in range(1,11) ,它将值1~10提供给表达式value2 。请注意,这里的for 语句末尾没有冒号。
结果与前面的平方数列表相同:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
要创建自己的列表解析,需要经过一定的练习,但能够熟练地创建常规列表后,你会发现这样做是完全值得的。当你觉得编写三四行代码来生成列表有点繁复时,就应考虑创建列表解析了。
动手试一试
练习4-3:数到20 使用一个for 循环打印数1~20(含)。
练习4-4:一百万 创建一个包含数1~1 000 000的列表,再使用一个for 循环将这些数打印出来。(如果输出的时间太长,按Ctrl + C停止输出或关闭输出窗口。)
练习4-5:一百万求和 创建一个包含数1~1 000 000的列表,再使用min() 和max() 核实该列表确实是从1开始、到1 000 000结束的。另外,对这个列表调用函数sum() ,看看Python将一百万个数相加需要多长时间。
练习4-6:奇数 通过给函数range() 指定第三个参数来创建一个列表,其中包含1~20的奇数,再使用一个for 循环将这些数打印出来。
练习4-7:3的倍数 创建一个列表,其中包含3~30能被3整除的数,再使用一个for 循环将这个列表中的数打印出来。
练习4-8:立方 将同一个数乘三次称为立方 。例如,在Python中,2的立方用2**3 表示。请创建一个列表,其中包含前10个整数(1~10)的立方,再使用一个for 循环将这些立方数打印出来。
练习4-9:立方解析 使用列表解析生成一个列表,其中包含前10个整数的立方。