4-操作列表(循环结构)

4.1 遍历整个列表

需要对列表中的每个元素都执行相同的操作时,可使用Python中的for循环。

下面使用for循环来打印魔术师名单中的所有名字:

magicians = ['alice', 'david', 'carolina'] 
for magician in magicians:
    print(magician)

4.1.1 细说循环过程

使用单数和复数式名称,可帮助你判断代码段处理的是单个列表元素还是整个列表。

4.1.2 在for循环中执行更多操作

magicians = ['alice', 'david', 'carolina'] 
for magician in magicians: 
    print(f"{magician.title()}, that was a great trick!")
    print(f"I can't wait to see your next trick, {magician.title()}.\n")

4.1.3 在for循环结束后执行一些操作

for循环结束后怎么办呢?通常,你需要提供总结性输出或接着执行程序必须完成的其他任务。

magicians = ['alice', 'david', 'carolina'] 
for magician in magicians: 
    print(f"{magician.title()}, that was a great trick!")
    print(f"I can't wait to see your next trick, {magician.title()}.\n")
    
print("Thank you, everyone. That was a great magic show!")

4.2 避免缩进错误

Python根据缩进来判断代码行与前一个代码行的关系。

4.2.1 忘记缩进

Python没有找到期望缩进的代码块时,会让你知道哪行代码有问题。

 File "E:\...\magicians.py", line 3
    print(f"{magician.title()}, that was a great trick!")
    ^
IndentationError: expected an indented block after 'for' statement on line 2

通常,将紧跟在for语句后面的代码行缩进,可消除这种缩进错误。 

4.2.2 忘记缩进额外的代码行

for magician in magicians: 
    print(f"{magician.title()}, that was a great trick!")
print(f"I can't wait to see your next trick, {magician.title()}.\n")

从语法上看,这些Python代码是合法的,但由于存在逻辑错误,结果并不符合预期。

4.2.3 不必要的缩进

magicians = ['alice', 'david', 'carolina'] 
    for magician in magicians: 
    print(f"{magician.title()}, that was a great trick!")
    print(f"I can't wait to see your next trick, {magician.title()}.\n")
File "E:\...\magicians.py", line 2
    for magician in magicians: 
IndentationError: unexpected indent

4.2.4 循环后不必要的缩进

如果不小心缩进了应在循环结束后执行的代码,这些代码将针对每个列表元素重复执行。在有些情况下,这可能导致Python报告语法错误,但在大多数情况下,这只会导致逻辑错误。

4.2.5 遗漏了冒号

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

假如遗漏了冒号,如下:

magicians = ['alice', 'david', 'carolina'] 
for magician in magicians
    print(f"{magician.title()}, that was a great trick!")
File "E:\...\magicians.py", line 2
    for magician in magicians
                             ^
SyntaxError: expected ':'

动手试一试

练习4-1:比萨

想出至少三种你喜欢的比萨,将其名称存储在一个列表中,再使用for循环将每种比萨的名称打印出来。修改这个for循环,使其打印包含比萨名称的句子,而不仅仅是比萨的名称。对于每种比萨,都显示一行输出,下面是一个例子。I like pepperoni pizza.在程序末尾添加一行代码,它不在for循环中,指出你有多喜欢比萨。输出应包含针对每种比萨的消息,还有一个总结性句子,下面是一个例子。I really love pizza!

练习4-2:动物

想出至少三种有共同特征的动物,将其名称存储在一个列表中,再使用for循环将每种动物的名称打印出来。修改这个程序,使其针对每种动物都打印一个句子,下面是一个例子。A dog would make a great pet.在程序末尾添加一行代码,指出这些动物的共同之处,如打印下面这样的句子。Any of these animals would make a great pet!

4.3 创建数值列表

4.3.1 使用函数range()

函数range()让Python从指定的第一个值开始数,并在到达你指定的第二个值时停止。

for number in range(1,5):
	print(number)

调用函数range()时,也可只指定一个参数,这样它将从0开始。例如,range(6)返回数0~5。 

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

要创建数字列表,可使用函数list()将range()的结果直接转换为列表。

numbers = list(range(1, 6))
print(numbers)

使用函数range()时,还可传入第三个参数作为步长。

even_numbers = list(range(2, 11, 2)) 
print(even_numbers)

使用函数range()几乎能够创建任何需要的数集。例如,如何创建一个列表,其中包含前10个整数(1~10)的平方呢?

squares=[]
for value in range(1,11):
	square=value ** 2
	squares.append(square)
print(squares)

可以不用临时变量 

squares=[]
for value in range(1,11):
	squares.append(value ** 2)
print(squares)

可节省20ms。

有时候,使用临时变量会让代码更易读;而在其他情况下,这样做只会让代码无谓地变长,执行所需时间长。你首先应该考虑的是,编写清晰易懂且能完成所需功能的代码,等到审核代码时,再考虑采用更高效的方法。

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

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

max(列表),min(列表),sum(列表)

4.3.4 列表解析

列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素。

下面的示例使用列表解析创建你在前面看到的平方数列表:

squares = [value**2 for value in range(1, 11)]
print(squares)

动手试一试

练习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个整数的立方。

4.4 使用列表的一部分

4.4.1 切片

列表的部分元素称为切片。

要创建切片,可指定要使用的第一个元素和最后一个元素的索引+1。

players = ['charles', 'martina', 'michael', 'florence', 'eli'] 
print(players[1:3])

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

要让切片终止于列表末尾,也可使用类似的语法。

负数索引返回离列表末尾相应距离的元素,比如最后三名队员,可使用切片players[-3:] 。

注意 可在表示切片的方括号内指定第三个值。这个值告诉Python在指定范围内每隔多少元素提取一个。

4.4.2 遍历切片

如果要遍历列表的部分元素,可在for循环中使用切片。

4.4.3 复制列表

要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])。

my_foods = ['pizza', 'falafel', 'carrot cake'] 
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)

如果想通过friend_foods = my_foods来复制表,这是行不通的。

因为这里将my_foods赋给friend_foods,而不是将my_foods的副本赋给friend_foods。这种语法实际上是让Python将新变量friend_foods关联到已与my_foods相关联的列表,因此这两个变量指向同一个列表。 

动手试一试

练习4-10:切片

选择你在本章编写的一个程序,在末尾添加几行代码,以完成如下任务。

▲ 打印消息“The first three items in the list are:”,再使用切片来打印列表的前三个元素。

▲ 打印消息“Three items from the middle of the list are:”,再使用切片来打印列表的中间三个元素。

▲ 打印消息“The last three items in the list are:”,再使用切片来打印列表的末尾三个元素。

练习4-11:你的比萨,我的比萨

在你为完成练习4-1而编写的程序中,创建比萨列表的副本,并将其赋给变量friend_pizzas,再完成如下任务。

▲ 在原来的比萨列表中添加一种比萨。

▲ 在列表friend_pizzas中添加另一种比萨。

▲ 核实有两个不同的列表。为此,打印消息“My favorite pizzas are:”,再使用一个for循环来打印第一个列表;打印消息“My friend's favorite pizzas are:”,再使用一个for循环来打印第二个列表。核实新增的比萨被添加到了正确的列表中。

练习4-12:使用多个循环

在本节中,为节省篇幅,程序foods.py的每个版本都没有使用for循环来打印列表。请选择一个版本的foods.py,在其中编写两个for循环,将各个食品列表打印出来。

4.5 元组

Python将不能修改的值称为不可变的,而不可变的列表被称为元组。

4.5.1 定义和访问元组

元组看起来很像列表,但使用圆括号而非中括号来标识。定义元组后,就可使用索引来访问其元素,就像访问列表元素一样。

dimensions = (200, 50)
print(dimensions[0])

如果修改元组dimensions的一个元素,将发生错误:

Traceback (most recent call last):
  File "E:\...\dimensions.py", line 2, in <module>
    dimensions[0]=100
TypeError: 'tuple' object does not support item assignment

注意 严格地说,元组是由逗号标识的,圆括号只是让元组看起来更整洁、更清晰。如果你要定义只包含一个元素的元组,必须在这个元素后面加上逗号:dimensions = (200, ) 

4.5.2 遍历元组中的所有值

像列表一样,也可以使用for循环来遍历元组中的所有值

4.5.3 修改元组变量

虽然不能修改元组的元素,但可以给关联元组的变量赋值。

dimensions = (200, )
dimensions=(300,600)

动手试一试

练习4-13:自助餐

有一家自助式餐馆,只提供五种简单的食品。请想出五种简单的食品,并将其存储在一个元组中。▲ 使用一个for循环将该餐馆提供的五种食品都打印出来。

▲ 尝试修改其中的一个元素,核实Python确实会拒绝你这样做。

▲ 餐馆调整了菜单,替换了它提供的其中两种食品。请编写一个这样的代码块:给元组变量赋值,并使用一个for循环将新元组的每个元素都打印出来。

4.6 设置代码格式

4.6.1 格式设置指南

Python改进提案(Python Enhancement Proposal,PEP)。

PEP 8是最古老的PEP之一,向Python程序员提供了代码格式设置指南。

4.6.2 缩进

PEP 8建议每级缩进都使用四个空格。

你在编写代码时绝对应该使用制表符键,但一定要对编辑器进行设置,使其在文档中插入空格而不是制表符。

如果混合使用了制表符和空格,可将文件中的所有制表符都转换为空格,大多数编辑器提供了这样的功能。

4.6.3 行长

很多Python程序员建议每行不超过80字符。

PEP 8还建议注释的行长不应超过72字符。

在大多数编辑器中,可以设置一个视觉标志(通常是一条竖线),让你知道不能越过的界线在什么地方。

注意 附录B介绍了如何配置文本编辑器,使其在你按制表符键时插入四个空格,并且显示一条垂直参考线,帮助你遵守行长不超过79字符的约定。

4.6.4 空行

要将程序的不同部分分开,可使用空行。

4.6.5 其他格式设置指南

等介绍更复杂的Python结构时,我们再来分享相关的其他PEP 8指南。

动手试一试

练习4-14:PEP 8

请访问Python网站并搜索“PEP 8 — Style Guide for PythonCode”,阅读PEP 8格式设置指南。当前,这些指南适用的情况不多,但可以大致浏览一下。

练习4-15:代码审核

从本章编写的程序中选择三个,根据PEP 8指南对它们进行修改。

▲ 每级缩进都使用四个空格。对你使用的文本编辑器进行设置,使其在你按Tab键时插入四个空格。如果你还没有这样做,现在就去做吧(有关如何设置,请参阅附录B)。

▲ 每行都不要超过80字符。对你使用的编辑器进行设置,使其在第80个字符处显示一条垂直参考线。

▲ 不要在程序文件中过多使用空行。

4.7 小结

在本章中,你学习了:如何高效地处理列表中的元素;如何使用for循环遍历列表,Python如何根据缩进来确定程序的结构,以及如何避免一些常见的缩进错误;如何创建简单的数字列表,以及可对数字列表执行的一些操作;如何通过切片来使用列表的一部分和复制列表。你还学习了元组(它对不应变化的值提供了一定程度的保护),以及在代码变得越来越复杂时如何设置格式,使其易于阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值