第四章 操作列表
第一章 起步
第二章 变量和简单数据类型
第三章 列表简介
第四章 操作列表
第五章 if 语句
第六章 字典
第七章 用户输入和 while 语句
第八章 函数
第九章 类
第十章 文章和异常
第十一章 测试代码
前言
上一章中学习了创建列表和操作其中元素,这一章将学习如何利用循环高效遍历整个列表。
4.1 遍历整个列表
for 循环尝鲜:打印魔术师名单中的所有名字
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician)
输出为
alice
david
carolina
4.1.1 深入研究循环
就如上面代码,临时变量 magician 先获取列表中第一个值,然后打印,接着循环取值打印,直到取完最后一个结束循环。
另外,临时变量的命名可以选择描述单个列表元素有意义的名称,而单复数名称又能帮助你判断代码处理的是单个字符还是整个列表,例如
for cat in cats:
for dog in dogs:
for item in list_of_items:
4.1.2 在 for 循环中执行更多操作
在 for 循环中,想包含多少行代码都可以。在 for ... in ... :
后面,每个缩进的代码都是循环的一部分,将针对列表中的每个值都执行一次:
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(f"{magician.title()},that was a greay trick!")
print(f"I can't wait to see your next trick,{magician.title()}.\n")
print("Thank you, everyone. That was a great show!")
输出为
Alice,that was a greay trick!
I can't wait to see your next trick,Alice.
David,that was a greay trick!
I can't wait to see your next trick,David.
Carolina,that was a greay trick!
I can't wait to see your next trick,Carolina.
Thank you, everyone. That was a great show!
4.1.3 在 for 循环结束后执行一些操作
for 循环结束后怎么办呢?通常,你需要提供总结性输出或接着执行程序必须完成的其他任务。
在 for 循环后面,没有缩进的的代码都只执行一次,不会重复执行,例如上面最后一行代码。
4.2避免缩进错误
Python 根据缩进(也就是敲一个制表符 Tab 键)来判断代码行与前一个代码行的关系,我们需要注意以下错误:
- 忘记缩进
- 忘记缩进额外的代码行
- 不必要的缩进
- 循环后不必要的缩进
- 遗漏了冒号(冒号是用来标识下一行是循环的第一行的)
动手试一试
# 练习4-1:比萨
pizzas = ['pizza_1', 'pizza_2', 'pizza_3']
for pizza in pizzas:
print(f"I like {pizza}!")
print("OK, in fact, I only ate pizza one time.")
print('\n')
# 练习 4-2:动物
animals = ['dog', 'cat', 'bird']
for animal in animals:
print(f"A {animal} would make a great pet!")
print("Any of these animals would make a great pet!")
输出为
I like pizza_1!
I like pizza_2!
I like pizza_3!
OK, in fact, I only ate pizza one time.
A dog would make a great pet!
A cat would make a great pet!
A bird would make a great pet!
Any of these animals would make a great pet!
4.3 创建数值列表
列表非常适合用于存储数字集合,而 Python 提供了很多工具,可帮助你高效地处理数字列表。
4.3.1 使用函数 range() 轻松生成一系列数
函数 range() 让 Python 从指定的第一个值开始数,并在到达你指定的第二个值时停止:
for value in range(1, 5):
print(value)
输出为
1
2
3
4
- 使用 range() 时,如果输出不符合预期,请尝试将指定的值加 1 或减 1
- 使用函数 range() 时,也可以指定一个参数,这样它将从 0 开始。例如,range(6) 返回 0 ~ 5
- 使用函数 range() 时,还可以指定步长。为此,可给这个函数指定第三个参数,Python 将根据这个步长来生成树。例如range(2, 11, 2) 返回 2、4、6、8、10(由此非常容易得到奇偶数数列)
4.3.2 使用 range() 创建数字列表
要创建数字列表,可使用函数 list() 将 range() 的结果直接转化为列表——将 range() 作为 list() 的参数
value = list(range(3, 11, 3))
print(value)
# 输出为:[3, 6, 9]
使用函数 range() 几乎能够创建任何需要的数集。例如,如何创建一个列表, 其中包含前 10 个数(1~10)的平方呢?(在 Python 中,用两个星号(**)来表示乘方运算)
squares = []
for value in range(1, 11):
square = value ** 2
squares.append(square)
# 或者为了代码简介,可以不适用临时变量 squre 而直接将每个计算结果附加到列表末尾
# squares.append(value ** 2)
print(squares)
输出为
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
4.3.3 对数字列表执行简单的统计计算
有几个专门用于处理数字列表的 Python 函数,例如你可以轻松找出最大值、最小值和总和L:
digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(max(digits)) # 9
print(min(digits)) # 0
print(sum(digits)) # 45
4.3.4 列表解析
列表解析将 for 循环和创建新元素的代码合并成一行,并自动附加新元素。
这其实就是一个简写,前面介绍的生成列表 squares 的方式包含三四行代码,而列表解析让你只需编写一行代码就能生成这样的列表,这在阅读他人的代码时可能会遇到,所有也要了解。
squares = [value**2 for value in range (1, 11)]
print(squares)
要使用这种语法,首先要指定一个描述性的列表名,然后指定一个左括号,并定义一个表达式用于生成要存储到列表中的值,最后再加上右括号(注意这里的 for 循环语句结尾是没有冒号,下一行也没有缩进的),这样就与输出了与前面平方数列一样的结果。
动手试一试
# 练习 4-3:数到20
digits = range(1, 21)
for digit in digits:
print(digit)
# 练习 4-5:一百万求和
digits = list(range(1, 1000001))
print(min(digits))
print(max(digits))
print(sum(digits))
# 练习 4-6:奇数
values = range(1, 20, 2)
for value in values:
print(value)
# 练习 4-7:3的倍数
values = range(0, 31, 3)
for value in values:
print(value)
# 练习 4-8:立方
cubes = []
for value in range(1, 11):
cubes.append(value ** 3)
print(cubes)
# 练习 4-9:立方解析
cubes = [value**3 for value in range(1, 11)]
print(cubes)
使用列表的一部分
4.1.1 切片
处理列表的部分元素,Python 称之为切片。要创建切片,可指定要使用的第一个元素和最后一个元素的索引。
与函数 range() 一样,Python 在到达第二个索引之前的元素后停止:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3])
print(players[1:4])
print(players[:3])
print(players[3:])
print(players[-2:])
输出为
['charles', 'martina', 'michael']
['martina', 'michael', 'florence']
['charles', 'martina', 'michael']
['florence', 'eli']
['florence', 'eli']
4.4.2 遍历切片
如果要遍历列表的部分元素,可在 for 循环中使用切片:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print("There are the first three plays on my team:")
for player in players[:3]:
print(player)
输出为
There are the first three plays on my team:
charles
martina
michael
4.4.3 复制列表
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([ : ])这让 Python 创建一个始于第一个元素终止于最后一个元素的切片,即整个列表的副本:
my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]
print("My favorite doods are:")
print(my_foods)
print("My friend's favorite food are:")
print(friend_foods)
# 接下来核实一下看是不是两个列表:
my_foods.append('cannoli')
friend_foods.append('ice cream')
print("Now,my favorite doods are:")
print(my_foods)
print("Now, my friend's favorite food are:")
print(friend_foods)
输出为
My favorite doods are:
['pizza', 'falafel', 'carrot cake']
My friend's favorite food are:
['pizza', 'falafel', 'carrot cake']
Now,my favorite doods are:
['pizza', 'falafel', 'carrot cake', 'cannoli']
Now, my friend's favorite food are:
['pizza', 'falafel', 'carrot cake', 'ice cream']
动手试一试
# 练习 4-10:切片
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players)
print('\n')
print("The first three players in the list are: ")
print(f"{players[:3]}\n")
print("Three players from the middle of the list are:")
print(f"{players[1:4]}\n")
print("The last three players in the list are:")
print(f"{players[2:]}")
输出为
['charles', 'martina', 'michael', 'florence', 'eli']
The first three players in the list are:
['charles', 'martina', 'michael']
Three players from the middle of the list are:
['martina', 'michael', 'florence']
The last three players in the list are:
['michael', 'florence', 'eli']
4.5 元组
列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,但有些时候,你需要创建一系列不可修改的元素,这就要用到元组了。
Python 将不可能修改的值成为不可变的,而不可变的列表被称为元组。
4.5.1 定义元组
元组看起来很像列表,但使用圆括号而非中括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。
注意:严格来说,元组是由逗号标识的,圆括号只是让元组看起来更整洁、更清晰。如果你要定义一个只包含一个元素的元组,必须在这个;元素后面加上逗号:my_t = (3,)
,创建一个只有一个元素的元组通常没有意义,但自动生成的元组可能只有一个元素。
4.5.2 遍历元组中的所有值
像列表一样,也可以使用 for 循环来遍历元组中的所有值
4.5.3 修改元素的值
等等!不是说元组元素不可变吗?当然,虽然不能修改元组的元素,但可以给存储元素的变量赋值(因为在 Python 中,将一个元组变量重新赋值是合法的),来看看区别:
# 修改元组元素:
dimensions = (200, 50)
print(dimensions[0])
dimensions[0] = 250
# 200
# Traceback (most recent call last):
# File "hello_world.py", line 11, in <module>
# dimensions[0] = 250
# TypeError: 'tuple' object does not support item assignment
# 给存储元组的变量赋值
dimensions = (200, 50)
print("Original dimensions:")
for dimension in dimensions:
print(dimension)
dimensions = (250, 400)
print("Original dimensions:")
for dimension in dimensions:
print(dimension)
# Original dimensions:
# 200
# 50
# Original dimensions:
#250
# 400
哈哈,这就是跟不能单个退换货那就直接换了一整箱口味不一样的美汁源果汁一样的道理嘛,对了,我喜欢白葡萄+槐花口味的🤪🤪🤪,你呢?
4.6 设置代码格式
没事没事,从菜鸟变成高手了,就得注意一下出招的套路,要不然人家笑话咱不是,天下Python,唯帅不破!!!
4.6.1 设置格式指南
PEP 8 是最古老的 PEP(Python 改进提案) 之一,向 Python 程序员提供了代码格式指南,了解即可,英雄不问出处嘛,哈哈
4.6.2 缩进
PEP 8 建议每级缩进都使用四个空格,这既可以提高可读性,又留下了足够多的多级缩进空间,注意,一个制表符就好,混合用制表符和空客符会让 Python 解释器感到疑惑,在编辑器中嘛,制表符挺不错的。
4.6.3 行长
每行代码不超过80字符,字符行长不超过72字符
4.6.4 空行
要将程序的不同部分分开,可使用空行,但也不能滥用,空行不会影响代码的运行(Python 解释器根据水平缩进情况来解读代码而不关心垂直间距),但会影响代码的可读性。
# 总结 在本章中,你学习了:
- 如何高效处理列表中的元素
- 如何使用 for 循环遍历列表
- 根据缩进确定程序结构并可以避免一些常见的缩进错误
- 如何创建简单的数字列表以及对其操作
- 如何通过切片来使用列表的一部分和复制列表
- 元组和格式设置
下一章,上 if ,又是一盘好菜,简单!