第四章 操作列表
遍历整个列表
-
假设我们有一个魔术师名单,需要将其中每个魔术师的名字都打印出来。为此,可以分别获取名单中的每个名字,但这种做法会导致多个问题。例如,如果名单很长,将包含大量重复的代码。另外,每当名单的长度发生变化时,都必须修改代码。通过for循环,可以让 python去处理这些问题。
-
下面使用for循环来打印魔术师名单中的所有名字。
magicians = ['alice','david','carolina']
for magician in magicians:
print(magician)
- 首先,像第3章那样定义一个列表。接下来,定义一个for循环。输出很简单,就是列表中的所用名字:
执行
python3 magicians.py
alice
david
carolina
深入研究循环
- 循环这种概念很重要,因为它是让计算机自动完成重复工作的常见方式之一。例如,在前面 magicians.py 中使用的简单的循环里,python将首先读取第一行代码:
for magician in magicians:
- 这行代码让 python 获取列表 magicians 中的第一个值 'alice' ,并将与其变量magician 相关联。接下来,python读取下一行代码:
print(magician)
- 它让 python 打印 magician 的值,依然是 'alice' 。鉴于该列表还包含其他的值,python 返回到循环第一行:
for magician in magicians:
- python 获取列表中的下一个名字 'david' ,并将其与变量 magician 相关联,再执行下面这行代码:
print(magician)
-
刚开始使用循环时请牢记,对列表的每个元素,都将执行循环指定的步骤,而不管列表包含多少个元素。如果列表包含一百万个元素,python 就重复指定的步骤一百万次,且通常速度非常快。
-
另外,编写for循环时,可以给依次与列表中的每个值相关联的临时变量指定任意名称。然而,选择描述单个元素的有意义名称大有裨益。例如:
for cat in cats:
for dog in dogs:
for item in list_df_items:
在fou循环中执行更多操作
- 在for循环中,可对每个元素执行任何操作。对于每位魔术师,都打印一条消息。
magicians = ['alice','david','carolina']
for magician in magicians:
print(f"{magician.title()},than was a great trick!")
- 相比于前一个示例,唯一不同的是为每位魔术师打印了一条以其名字为抬头的消息,当这个循环第一次迭代时,变量 magician 的值为 'alice',因此打印第一条消息的抬头为 'Alice';第二次迭代时,消息的抬头为 'David';第三次迭代时,抬头为 'Carolina'。
执行
python3 magicians.py
Alice,than was a great trick!
David,than was a great trick!
Carolina,than was a great trick!
在for循环结束后执行一些操作
- for循环结束后怎么办呢?通常,你需要提供总结性输出或接着执行程序必须完成的其他任务。在for循环后面,没有缩进的代码都只执行一次,不会重复执行。下面打印一条向全体魔术师致谢的消息,感谢他们的精彩表演。想要在打印给各位魔术师的消息后面打印一条给全体魔术师的致谢消息,需要将相应的代码放在for循环后面,且不缩进:
magicians = ['alice','david','carolina']
for magician in magicians:
print(f"{magician.title()},than was a great trick!")
print(f"I can't wait to see tour next trick,{magician.title()}.\n")
print("Thank you , ervryone. That was a great magic show!")
- 可以看到,开头两个函数调用了print() 针对列表中的每位魔术师重复执行。然而,第三个函数调用print() 没有缩进,因此只执行了一次:
python3 magicians.py
Alice,than was a great trick!
I can't wait to see tour next trick,Alice.
David,than was a great trick!
I can't wait to see tour next trick,David.
Carolina,than was a great trick!
I can't wait to see tour next trick,Carolina.
Thank you , ervryone. That was a great magic show!
- 使用for循环处理数据是一种对数据集执行整体操作的不错方式。例如,你可能使用for循环来初始化游戏:遍历角色列表,将每个角色显示到屏幕上。然后再循环后面添加一个不缩进的代码,在屏幕上绘制所有角色后显示一个Play Now按钮。
避免缩进错误
- Python根据缩进来判断代码行与前一个代码行的关系。开始编写正确的代码时,需要注意一些常见的缩进错误。
忘记缩进
忘记缩进额外的代码行
-
有时候,循环能够运行且不会报告错误,但结果可能出人意料。试图再循环中执行多项任务,却忘记缩进其中的一些代码时,就会出现这种情况。
-
这是一个逻辑错误。从语法上看,这些代码是合法的,但由于存在逻辑错误,结果并不符合预期。如果你预期某项操作将针对每个列表元素都只醒一次,但它总共只执行了一次,请确定需要将一行还是多行代码缩进。
不必要的缩进
循环后不必要的缩进
- 如果不小心缩进了应在循环结束后执行的代码,这些代码将针对每个列表元素重复执行。在有些情况下,这可能导致Python报告语法错误,但在大多数情况下,这只会导致逻辑错误。
遗漏了冒号
- for语句末尾的冒号告诉Python,下一行是循环的第一行。
创建数值列表
- 需要存储一组数据的原因有很多。例如,在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分;在数据可视化中,处理的几乎都是由数(如温度、距离、人口数量、经度和纬度等)组成的集合。
使用函数range()
- Python函数range()让你能够轻松地生成一系列数。
for value in range(1,5):
print(value)
- 上述代码好像应该打印数1~5,但实际不会打印5。
执行
python3 first_numbers.py
1
2
3
4
使用 rangge() 创建列表
- 要创建数字列表可使用函数list() 将range() 的结果直接转化为列表。如果将list() 的参数,输出将是一个数字列表。
numbers = list(range(1,6))
print(numbers)
执行
python3 first_numbers.py
[1, 2, 3, 4, 5]
- 使用函数range() 时,还可指定步长。为此可给这个函数指定第三个参数,python将根据这个步长来生成数。
打印1~10的偶数:
even_numbers = list(range(2,11,2))
print(even_numbers)
执行
python3 even_numbers.py
[2, 4, 6, 8, 10]
在Python 中,用两个星号(**)表示乘方运算。s
squares = []
for value in range(1,11):
square = value ** 2
squares.append(square)
print(squares)
为了让代码简洁,可以不使用临时变量square ,而直接将每个计算得到的值附加到列表末尾:
square = []
for value in range(1,11):
squares.appends.(value**2)
print(squares)
- 首先,创建一个名为squares 的空列表。然后函数 range() 让python 遍历1~10的值。在循环中,计算当前值的平方,并将结果赋给变量square。然后,将计算得到的平方值附加到列表squares 末尾。最后,循环结束后,打印列表squares:
执行
python3 squares.py
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
- 创建更复杂的列表时,可使用上述两种方法的任何一种。有时候,使用临时变量会让代码更易读;而在其他情况下,这样只会让代码无所谓的变长。你首先应该考虑的是,编写清晰易懂且能完成所需功能的代码,等到审核代码时,再考虑采用更高效的方法。
对数字列表执行简单的统计计算
- 有几个专门用于处理数字列表的python 函数。例如,你可以轻松找到数字列表的最大值、最小值和总和。
digits = []
for value in range(0,11):
digits.append(value)
sum_min = min(digits)
sum_max = max(digits)
sum_sum = sum(digits)
print(sum_min)
print(sum_max)
print(sum_sum)
这里介绍的知识也适用于包含数百万个数的列表。
列表解析
- 前面介绍的生成列表squares 的方式包含三四行代码,而列表解析让你只需编写一行代码就能生成这样的列表。列表解析将for循环和创建新元素的代码合成一行,并自动附加新元素。
下面的示例使用列表解析创建在你面前看到的平方数列表:
squares = [value**2 for value in range(1,11)]
print(squares)
执行
python3 squares.py
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
- 要创建自己的列表解析,需要经过一定的练习,但能够熟练地创建常规列表后,你会发现这样做完全是值得的。当你觉得编写三四行代码来生成列表有点繁复时,就应该考虑创建列表解析了。
使用列表的一部分
切片
- 要创建切片,可指定要使用的第一个元素和最后一个元素的指引。与函数 range() 一样,python在达到第二个索引之前的元素后停止。要输出列表中的前三个元素,需要指定索引0和3,这将返回索引为0、1和2的元素。
players = ['charles','martina','michael','florence','eli']
print(players[0:3])
执行
python3 players.py
['charles', 'martina', 'michael']
如果没有指定第一个索引,python将自动从列表开头开始。
players = ['charles','martina','michael','florence','eli']
print(players[:4])
执行
python3 players.py
['charles', 'martina', 'michael', 'florence']
要将切片终止于列表末尾,也可使用类似的语法。
players = ['charles','martina','michael','florence','eli']
print(players[2:])
执行
['michael', 'florence', 'eli']
可在表示切片的方括号内指定第三个值。这个值告诉python在指定范围内每隔多少元素提取一个。
遍历切片
如果要遍历列表的部分元素,可在for循环中使用切片。下面的示例遍历前三个元素,并打印他们的名字。
players = ['charles','martina','michael','florence','eli']
print("Here are the first three players on my team:")
for player in players[:3]:
print(player.title())
上述代码没有遍历整个元素列表,而只遍历前三个元素:
python3 players.py
Here are the first three players on my team:
Charles
Martina
Michael
- 在很多情况下,切片很有用。例如,编写游戏时,你可以在玩家退出游戏时将其最终得分加入到一个列表,然后将该列表按降序排列以获取三个最高得分,再创建一个只包含前三个得分的切片;处理数据时,可使用切片来进行批量处理;编写web 应用程序时,可使用切片来分页显示信息,并在每页显示数量合适的信息。
复制列表
我们经常需要根据即有列表创建全新的列表。下面来介绍复制列表的工作原理,以及复制列表可提供极大帮助的一种情形。
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引( [:] )。这让python 创建一个始于第一个元素、终于最后一个元素的切片,即整个列表的副本。
例如,一个列表包含四个元素,而你想要创建一个新的列表,并在其中包含第一个列表的所有元素。因此你可以通过复制来创建这个列表。
my_foods = ['pizza','falafel','carrot cake']
firend_foods = my_foods[:]
print(my_foods)
print(firend_foods)
执行
python3 foods.py
['pizza', 'falafel', 'carrot cake']
['pizza', 'falafel', 'carrot cake']
为核实确实有两个列表,下面在每个列表中都添加一个元素
my_foods = ['pizza','falafel','carrot cake']
firend_foods = my_foods[:]
my_foods.append('cannoli')
firend_foods.append('ice cream')
print(my_foods)
print(firend_foods)
执行
python3 foods.py
['pizza', 'falafel', 'carrot cake', 'cannoli']
['pizza', 'falafel', 'carrot cake', 'ice cream']
元组
- 列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python 将这种不能修改的值称为不可变的,而不可变的列表称为元组。
定义元组
元组看起来很像列表,但使用圆括号而非中括号来标识。定义元组后,就可使用索引来访问其元素,就像访问列表元素一样。
有一个大小不应改变的矩形,可将其长度和宽度存储在一个元组中,从而确保它们是不能修改的:
dimensions = (200,50)
print(dimensions[0])
print(dimensions[1])
执行
python3 dimensions.py
200
50
在进行尝试修改元组dimensions 的第一个元素,看看结果如何
dimensions = (200,50)
dimensions[0] = 250
print(dimensions[0])
执行
python3 dimensions.py
Traceback (most recent call last):
File "dimensions.py", line 2, in <module>
dimensions[0] = 250
TypeError: 'tuple' object does not support item assignment
严格来说,元组是由逗号标识的,圆括号只是让元组看起来更整洁、更清晰。如果你要定义一个元素的元组,必须在这个元素后面加上逗号;
my_t = (3,)
创建只包含一个元素的元组通常没有意义,但自动生成的元组有可能只有一个元素。
遍历元组中的所有值
像列表一样,也可以使用for循环遍历元组中的所有值:
dimensions = (200,50)
for dimenesion in dimensions:
print(dimenesion)
执行
python3 dimensions.py
200
50
修改元组变量
虽然不能修改元组的元素,但可以给存储元组赋值。因此,如果要修改前述矩形的尺寸,可重新定义整个元组:
dimensions = (200,50)
print("Original dimesions:")
for dimension in dimensions:
print(dimension)
dimensions = (400,100)
print("\nModifed dimensions")
for dimension in dimensions:
print(dimension)
这样,Python 不会引发任何错误,因为给元组变量重新赋值是合法的:
python3 dimensions.py
Original dimesions:
200
50
Modifed dimensions
400
100
相对于列表,元组是更简单的数据结构。如果需要存储的一组值在程序的整个生命周期都不变,就可以使用元组。
设置代码格式
格式设置指南 缩进 行长
空行
空行不会影响代码的运行,但会影响代码的可读性。Python 解释器根据水平缩进情况来解读代码,但不关心垂直间距。
☺欢迎一起来学习交流!
网友评论