关于“Python”的核心知识点整理大全7

2024-01-19 08:23:15 浏览数 (1)

4.2.5 遗漏了冒号

for语句末尾的冒号告诉Python,下一行是循环的第一行

代码语言:javascript复制
magicians = ['alice', 'david', 'carolina']
1 for magician in magicians
 print(magician) 

如果你不小心遗漏了冒号,如1所示,将导致语法错误,因为Python不知道你意欲何为。这 种错误虽然易于消除,但并不那么容易发现。程序员为找出这样的单字符错误,花费的时间多得 令人惊讶。这样的错误之所以难以发现,是因为通常在我们的意料之外。

4.3 创建数值列表

需要存储一组数字的原因有很多,例如,在游戏中,需要跟踪每个角色的位置,还可能需要 跟踪玩家的几个最高得分。在数据可视化中,处理的几乎都是由数字(如温度、距离、人口数量、 经度和纬度等)组成的集合。

列表非常适合用于存储数字集合,而Python提供了很多工具,可帮助你高效地处理数字列表。 明白如何有效地使用这些工具后,即便列表包含数百万个元素,你编写的代码也能运行得很好。

4.3.1 使用函数 range()

Python函数range()让你能够轻松地生成一系列的数字。例如,可以像下面这样使用函数 range()来打印一系列的数字:

numbers.py

代码语言:javascript复制
for value in range(1,5):
 print(value) 

上述代码好像应该打印数字1~5,但实际上它不会打印数字5:

代码语言:javascript复制
1
2
3
4

在这个示例中,range()只是打印数字1~4,这是你在编程语言中经常看到的差一行为的结果。 函数range()让Python从你指定的第一个值开始数,并在到达你指定的第二个值后停止,因此输出 不包含第二个值(这里为5)。

要打印数字1~5,需要使用range(1,6):

代码语言:javascript复制
1
2
3
4
5 

使用range()时,如果输出不符合预期,请尝试将指定的值加1或减1。

4.3.2 使用 range()创建数字列表

要创建数字列表,可使用函数list()将range()的结果直接转换为列表。如果将range()作为list()的参数,输出将为一个数字列表。 在前一节的示例中,我们打印了一系列数字。要将这些数字转换为一个列表,可使用list():

代码语言:javascript复制
numbers = list(range(1,6))
print(numbers) 
结果如下:
代码语言:javascript复制
[1, 2, 3, 4, 5] 

使用函数range()时,还可指定步长。例如,下面的代码打印1~10内的偶数:

even_numbers.py

代码语言:javascript复制
even_numbers = list(range(2,11,2))
print(even_numbers)

在这个示例中,函数range()从2开始数,然后不断地加2,直到达到或超过终值(11),因此 输出如下:

代码语言:javascript复制
[2, 4, 6, 8, 10] 

使用函数range()几乎能够创建任何需要的数字集,例如,如何创建一个列表,其中包含前 10个整数(即1~10)的平方呢?在Python中,两个星号(**)表示乘方运算。下面的代码演示了 如何将前10个整数的平方加入到一个列表中:

squares.py

代码语言:javascript复制
1squares = []
2 for value in range(1,11):
3 square = value**2
4 squares.append(square)
5 print(squares)

首先,我们创建了一个空列表(见1);接下来,使用函数range()让Python遍历1~10的值(见 2)。在循环中,计算当前值的平方,并将结果存储到变量square中(见3)。然后,将新计算得 到的平方值附加到列表squares末尾(见4)。最后,循环结束后,打印列表squares(见5):

代码语言:javascript复制
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

为让这些代码更简洁,可不使用临时变量square,而直接将每个计算得到的值附加到列表 末尾:

代码语言:javascript复制
squares = []
for value in range(1,11):
1 squares.append(value**2)
print(squares) 

1处的代码与squares.py中2处和3处的代码等效。在循环中,计算每个值的平方,并立即将 结果附加到列表squares的末尾。

创建更复杂的列表时,可使用上述两种方法中的任何一种。有时候,使用临时变量会让代码 更易读;而在其他情况下,这样做只会让代码无谓地变长。你首先应该考虑的是,编写清晰易懂 且能完成所需功能的代码;等到审核代码时,再考虑采用更高效的方法。

4.3.3 对数字列表执行简单的统计计算

有几个专门用于处理数字列表的Python函数。例如,你可以轻松地找出数字列表的最大值、 最小值和总和:

代码语言:javascript复制
>>> 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

代码语言:javascript复制
squares = [value**2 for value in range(1,11)]
print(squares) 

要使用这种语法,首先指定一个描述性的列表名,如squares;然后,指定一个左方括号, 并定义一个表达式,用于生成你要存储到列表中的值。在这个示例中,表达式为value**2,它计 算平方值。接下来,编写一个for循环,用于给表达式提供值,再加上右方括号。在这个示例中,for循环为for value in range(1,11),它将值1~10提供给表达式value**2。请注意,这里的for 语句末尾没有冒号。

结果与你在前面看到的平方数列表相同:

代码语言:javascript复制
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 

要创建自己的列表解析,需要经过一定的练习,但能够熟练地创建常规列表后,你会发现这 样做是完全值得的。当你觉得编写三四行代码来生成列表有点繁复时,就应考虑创建列表解析了。

4.4 使用列表的一部分

在第3章中,你学习了如何访问单个列表元素。在本章中,你一直在学习如何处理列表的所 有元素。你还可以处理列表的部分元素——Python称之为切片。

4.4.1 切片

要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range()一样,Python 在到达你指定的第二个索引前面的元素后停止。要输出列表中的前三个元素,需要指定索引0~3, 这将输出分别为0、1和2的元素。 下面的示例处理的是一个运动队成员列表:

players.py

代码语言:javascript复制
players = ['charles', 'martina', 'michael', 'florence', 'eli']
1 print(players[0:3])

1处的代码打印该列表的一个切片,其中只包含三名队员。输出也是一个列表,其中包含前 三名队员:

代码语言:javascript复制
['charles', 'martina', 'michael'] 

你可以生成列表的任何子集,例如,如果你要提取列表的第2~4个元素,可将起始索引指定 为1,并将终止索引指定为4:

代码语言:javascript复制
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[1:4]) 

这一次,切片始于'marita',终于'florence':

代码语言:javascript复制
['martina', 'michael', 'florence'] 

如果你没有指定第一个索引,Python将自动从列表开头开始:

代码语言:javascript复制
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[:4]) 

由于没有指定起始索引,Python从列表开头开始提取:

代码语言:javascript复制
['charles', 'martina', 'michael', 'florence']

要让切片终止于列表末尾,也可使用类似的语法。例如,如果要提取从第3个元素到列表末 尾的所有元素,可将起始索引指定为2,并省略终止索引:

代码语言:javascript复制
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[2:]) 

Python将返回从第3个元素到列表末尾的所有元素:

代码语言:javascript复制
['michael', 'florence', 'eli'] 

无论列表多长,这种语法都能够让你输出从特定位置到列表末尾的所有元素。本书前面说过, 负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任何切片。例如,如果你 要输出名单上的最后三名队员,可使用切片players[-3:]:

代码语言:javascript复制
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[-3:]) 

上述代码打印最后三名队员的名字,即便队员名单的长度发生变化,也依然如此。

4.4.2 遍历切片

如果要遍历列表的部分元素,可在for循环中使用切片。在下面的示例中,我们遍历前三名 队员,并打印他们的名字:

代码语言:javascript复制
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print("Here are the first three players on my team:")
1 for player in players[:3]:
 print(player.title()) 

处的代码没有遍历整个队员列表,而只遍历前三名队员:

代码语言:javascript复制
Here are the first three players on my team:
Charles
Martina
Michael

在很多情况下,切片都很有用。例如,编写游戏时,你可以在玩家退出游戏时将其最终得分 加入到一个列表中。然后,为获取该玩家的三个最高得分,你可以将该列表按降序排列,再创建 一个只包含前三个得分的切片。处理数据时,可使用切片来进行批量处理;编写Web应用程序时, 可使用切片来分页显示信息,并在每页显示数量合适的信息。

4.4.3 复制列表

你经常需要根据既有列表创建全新的列表。下面来介绍复制列表的工作原理,以及复制列表 可提供极大帮助的一种情形。

要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])。 这让Python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。

例如,假设有一个列表,其中包含你最喜欢的四种食品,而你还想创建另一个列表,在其中 包含一位朋友喜欢的所有食品。不过,你喜欢的食品,这位朋友都喜欢,因此你可以通过复制来 创建这个列表:

foods.py

代码语言:javascript复制
1 my_foods = ['pizza', 'falafel', 'carrot cake']
2 friend_foods = my_foods[:]
print("My favorite foods are:")
print(my_foods)
print("nMy friend's favorite foods are:")
print(friend_foods)

我们首先创建了一个名为my_foods的食品列表(见1),然后创建了一个名为friend_foods的 新列表(见2)。我们在不指定任何索引的情况下从列表my_foods中提取一个切片,从而创建了 这个列表的副本,再将该副本存储到变量friend_foods中。打印每个列表后,我们发现它们包含‘的食品相同:

代码语言:javascript复制
My favorite foods are:
['pizza', 'falafel', 'carrot cake']
My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake'] 

为核实我们确实有两个列表,下面在每个列表中都添加一种食品,并核实每个列表都记录了 相应人员喜欢的食品:

代码语言:javascript复制
my_foods = ['pizza', 'falafel', 'carrot cake']
1 friend_foods = my_foods[:]
2 my_foods.append('cannoli')
3 friend_foods.append('ice cream')
print("My favorite foods are:")
print(my_foods)
print("nMy friend's favorite foods are:")
print(friend_foods)

与前一个示例一样,我们首先将my_foods的元素复制到新列表friend_foods中(见1)。接下 来,在每个列表中都添加一种食品:在列表my_foods中添加'cannoli'(见2),而在friend_foods 中添加'ice cream'(见3)。最后,打印这两个列表,核实这两种食品包含在正确的列表中。

代码语言:javascript复制
My favorite foods are:
4 ['pizza', 'falafel', 'carrot cake', 'cannoli']
My friend's favorite foods are:
5 ['pizza', 'falafel', 'carrot cake', 'ice cream']

4处的输出表明,'cannoli'包含在你喜欢的食品列表中,而'ice cream'没有。5处的输出 表明,'ice cream'包含在你朋友喜欢的食品列表中,而'cannoli'没有。倘若我们只是简单地将 my_foods赋给friend_foods,就不能得到两个列表。例如,下例演示了在不使用切片的情况下复 制列表的情况:

代码语言:javascript复制
my_foods = ['pizza', 'falafel', 'carrot cake']
#这行不通
1 friend_foods = my_foods
my_foods.append('cannoli')
friend_foods.append('ice cream')
print("My favorite foods are:")
print(my_foods)
print("nMy friend's favorite foods are:")
print(friend_foods)

0 人点赞