第四章
1、遍历整个列表
当你需要整洁干净地输出一个列表中的所有元素,就必须对每个元素执行相同的操作。此时的代码中就会含有大量重复的代码,而当列表发生一些改变,又需要修改大量的代码,显然这样的方法工作效率低下。所以有必要使用Python中的for循环来解决这些问题,简化代码,提高效率。
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician)
# 输出:
alice
david
carolina
2、for循环
循环就是让计算机自动完成重复性的工作。进入循环操作后,计算机会自动执行相应的操作,直到列表的最后一个元素也执行完后,就会自动退出循环,继续往下执行。
在for循环中,可对每个元素执行任何的操作,添加多少行的代码都可以,计算机会针对列表中的每个元素都执行一次。
在for循环的后面,没有缩进的代码都只执行一次。因为只有缩进了的代码才隶属于for循环。没有缩进代表该行代码不属于for循环里面,所以只会执行一次。
Python是根据缩进来判断代码行与前一个代码行的关系。
3、常见的缩进错误
对于位于for语句后面且属于循环组成部分的代码行,一定要缩进。如果你忘记缩进,Python会提醒你。
当循环能够运行而且不会报告错误,但结果却出乎意料,此时,就有可能是你忘记缩进其中的某些代码行。
如果你将无需缩进的代码行缩进了,Python也会提醒你。
如果不小心缩进了应在循环结束后执行的代码,这些代码会针对每个列表元素重复执行。
for语句末尾的冒号告诉Python,下一行是循环的第一行。如果你不小心遗漏了冒号,将导致语法错误,因为Python不知道你意欲何为。
因此,在编写代码时,尽量避免不该出现的错误,因为某些错误会花费大量的时间才能找出。
4、创建数值列表
(1)使用函数range()
range()函数可以生成一系列的数字,如:
for value in range(1, 5):
print(value)
# 输出:
1
2
3
4
上述例子中用到的range()函数,它的第一个参数表示生成的序列从1开始,到5之前结束,不包括5。
(2)使用range()创建数字列表
可使用函数list()将range()的结果直接转换为列表。
numbers = list(range(1, 5))
print(numbers)
# 输出:
[1, 2, 3, 4]
使用range()函数时,还可以指定步长。如:
numbers = list(range(2, 11, 2))
print(numbers)
# 输出:
[2, 4, 6, 8, 10]
range()函数括号中的第三个参数为指定的步长,若不写第三个参数,默认为1。
(3)对数字列表执行简单的统计运算
digits = [4, 2, 5, 0, 7, 1, 9, 3]
print(min(digits))
print(max(digits))
print(sum(digits))
# 输出:
0
9
31
(4)列表解析
列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素。如:
squares = [value**2 for value in range(1, 11)]
print(squares)
# 输出:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
要使用这种语法,首先指定一个描述性的列表名,然后添加一个方括号,并在方括号中定义一个表达式,用于生成你要存储到列表中的值。在上述例子中,表达式为value**2,用于计算平方值。而后的for循环用于给表达式提供值,注意这里的for语句末尾不需要加上冒号。
5、使用列表的一部分
(1)切片
要创建切片,可指定要使用的第一个元素和最后一个元素的索引。
fruits = ['apple', 'banana', 'orange', 'pear', 'watermelon']
print(fruits[1:4])
# 输出:
['banana', 'orange', 'pear']
与函数range()一样,Python会在第二个索引之前停止操作,即不包括索引为4的元素。通过切片,你可以生成列表的任何子集。
如果你没有指定第一个索引,Python将自动从列表的开头开始提取元素;同样的,如果没有指定第二个索引,Python将会一直提取到列表的末尾。注意冒号不能省略,索引也可以是负数。
(2)遍历切片
遍历列表的部分元素,可在for循环中使用切片。如只打印前三种水果:
fruits = ['apple', 'banana', 'orange', 'pear', 'watermelon']
for fruit in fruits[:3]:
print(fruit)
# 输出:
apple
banana
orange
(3)复制列表
要复制整个列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:]),即可复制整个列表。
函数id()返回的是变量的内存地址。
fruits = ['apple', 'banana', 'orange', 'pear', 'watermelon']
my_fruits = fruits[:]
print(id(fruits))
print(id(my_fruits))
# 输出:
2722431740296
2722431740360
fruits = ['apple', 'banana', 'orange', 'pear', 'watermelon']
my_fruits = fruits
print(id(fruits))
print(id(my_fruits))
# 输出:
2686324681096
2686324681096
通过上述两个例子,我们可以知道,虽然复制的是整个列表,但是不能直接赋值,因为通过输出内存地址可以发现,直接赋值的话,表明有两个不同的变量名指向了同一个内存地址,它实际上是将内存地址复制给了新的变量。而用切片的方法,我们可以发现内存地址是不一样的,说明这两个变量除了列表里面的元素相同之外,并没有任何的关系,它实际上是将列表中的元素完全复制给了新的变量。
6、元组
列表在程序运行期间,它的元素是可以修改的,即列表是可变的。但有时候需要一系列不可变的元素,而这不可变的列表被称为元组。
(1)定义元组
元组类似于列表,但它使用圆括号而不是方括号来标识。
demensions = (18, 65, 32)
print(demensions)
print(demensions[1])
# 输出:
(18, 65, 32)
65
对元组中元素的访问,和访问列表元素是一样的。
当你要修改元组中的某一个元素时,Python会返回类型错误的消息,说明元组是不可变的。
(2)遍历元组中的所有值
可以像列表一样用for循环来遍历元组中的所有值。
demensions = (18, 65, 32)
for demension in demensions:
print(demension)
# 输出:
18
65
32
(3)修改元组变量
虽然不能修改元组的元素,但可以给存储元组的变量赋值。所以当你需要修改元组的某一个元素时,只能对该元组重新赋值。这样Python就不会报错,因为给元组变量赋值是合法的。
7、设置代码格式
Python改进提案(Python Enhancement Proposal,PEP),PEP 8是最古老的PEP之一,它向Python程序员提供了代码格式设置指南。
PEP 8建议每级缩进都使用四个空格,这既可以提高可读性,又留下了足够的多级缩进的空间。
建议每行的行长不超过80个字符,虽然每行容纳的字符数可以很多,但是为了方便查看,尽量不超过80个字符。PEP 8还建议注释的行长不超过72个字符,原因与上面一样。
要将程序的不同部分分开,可使用空行,但也不能滥用。空行不会影响代码的运行,但会影响代码的可读性。Python解释器根据水平缩进情况来解读代码,但不关心垂直间距。