经常需要遍历整个列表,对每个元素执行相同的操作。通过使用for循环,可让Python去处理这些问题。
fruits = ["apple","banana","strawberry"]
for fruit in fruits:
print (fruit)
结果
apple
banana
strawberry
这里定义了一个for循环,这行代码让Python从列表fruits中取出一个名字,并将其存储到变量fruit中。最后,让Python打印前面存储到变量fruit中的名字。对于列表中的每个名字,Python都将重复执行上述逻辑。可以这样解读这段代码。
循环的概念很重要,因为它是让计算机自动完成重复工作的常见方式之一。例如上述运行的代码:
for fruit in fruits:
这行代码让Python获取列表fruits中的第一个值(“apple”),并将其存储到变量fruit中。接下来Python读取下一行代码:
print (fruit)
它让Python打印fruit的值,依然是(“apple”)。鉴于该列表还包含其他的值,Python将返回到循环的第一行:
for fruit in fruits:
Python获取列表中的下一个名字(“banana”), 并将其存储到变量fruit中,在执行下面这行代码:
print (fruit)
再次打印变量的值,这次的值为(“banana”)。接下来,Python再次执行循环,对列表中的最后一个值进行打印。至此,列表中就没有其他的值了。
刚开始使用循环时请牢记,对列表中的每个元素,都将执行循环指定的步骤,而不管列表中包含了多少个元素。如果列表中包含一千万个元素,Python都将重复执行指定的步骤一千万次。
编写for循环时,对于用于存储列表中每个值的临时变量,可指定任何名称。但是,选择有意义的名称对于今后的协作开发有莫大的意义。
for car in cars;
for dog in dogs;
在for循环中,对每个元素执行任何操作。
fruits = ["apple","banana","strawberry"]
for fruit in fruits:
print ("I like " + fruit.title() +"\n")
结果:
I like Apple
I like Banana
I like Strawberry
在for循环中,想包含多少行代码都可以,使用for循环对每个元素执行众多不同的操作很有用。
通常,在for循环结束后需要提供一些总结性的输出或接着执行程序必须完成的其他任务。
在for循环后面,没有缩进的代码都只执行一次,而不会重复执行。
fruits = ["apple","banana","strawberry"]
for fruit in fruits:
print ("I like " + fruit.title() +"\n")
print ("What fruit do you like to eat?")
结果
I like Apple
I like Banana
I like Strawberry
What fruit do you like to eat?
可以看到,没有缩进的代码只执行了一次。
Python根据缩进来判断代码行与前一个代码行的关系。Python通过使用缩进让代码更易读。简单的说,它要求使用缩进让代码整洁而结构清晰。在较长的Pyhton程序中,将看到缩进程度各个不相同的代码块,这会对程序的组织结构有个大致的认识。
开始编写必须正确缩进的代码时,需要注意一些常见的缩进错误。
fruits = ["apple","banana","strawberry"]
for fruit in fruits:
print ("I like " + fruit.title() +"\n")
print ("What fruit do you like to eat?")
结果
File "hello_python.py", line 4
print ("I like " + fruit.title() +"\n")
^
IndentationError: expected an indented block
Python解释器会提示,这个位置可能是要缩进的,然而它并没有找到。这段代码是无法运行的。
fruits = ["apple","banana","strawberry"]
for fruit in fruits:
print ("I like " + fruit.title())
print ("What fruit do you like to eat?" + "\n")
结果
I like Apple
What fruit do you like to eat?
I like Banana
What fruit do you like to eat?
I like Strawberry
What fruit do you like to eat?
这是想表达的本意,每次在打印完喜欢吃的水果后,都进行询问。但是代码写成了这样
fruits = ["apple","banana","strawberry"]
for fruit in fruits:
print ("I like " + fruit.title())
print ("What fruit do you like to eat?" + "\n")
结果
I like Apple
I like Banana
I like Strawberry
What fruit do you like to eat?
只有在最后打印了一次询问。程序并没有报错,但是却偏离了本意。
这是一个逻辑错误。由于存在逻辑错误,结果是不符合预期的。如果预期某项操作将针对列表中的每个元素,但它却执行了一次,请确定是否需要将一行或多行代码缩进。
如果不小心缩进了无需缩进的代码,Python将指出这一点。
message = "What fruit do you like to eat ?"
print(message)
结果
File "/hello_python.py", line 3
print(message)
^
IndentationError: unexpected indent
为避免意外的缩进错误,只缩进需要缩进的代码。在前面的编程中,只有要在for循环中对每个元素执行的代码需要缩进。
for语句末尾的冒号告诉Python,下一行是循环的第一行。
fruits = ["apple","banana","strawberry"]
for fruit in fruits
print ("I like " + fruit.title())
结果
File "/hello_python.py", line 3
for fruit in fruits
^
SyntaxError: invalid syntax
如果不小心遗漏了冒号,将导致语法错误,因为python不知道意欲何为。这种错误虽然易于消除,但是不易于发现。好在现在有集成开发环境,能够帮助发现这一点。
列表非常适合用于存储数字集合,而Python提供了很多工具,可高效的处理数字列表。
for value in range(1,5):
print (value)
结果
1
2
3
4
range()只是打印数字1~4,在编程语言中经常会看到的差一行为的结果。函数range()让Python从指定的第一个值开始数,并在到达指定的第二个值停止,因此输出是不包含第二个值的。
要打印数字1~5,需要使用range(1,6)
for value in range(1,6):
print (value)
结果
1
2
3
4
5
使用range()时,如果输出不符合预期,请尝试将指定的值加1或者减1。
要创建数字列表,可使用函数list()将range()的结果直接转换为列表。如果将range()作为list()的参数,将为一个数字列表。
numbers = list(range(1,4))
print (numbers)
结果
[1, 2, 3]
使用range()函数时,还可指定步长。
numbers = list(range(1,11,2))
print (numbers)
结果
[1, 3, 5, 7, 9]
使用函数range()几乎可以创建任何需要的数字集,创建一个1~10的乘方的数字列表,**表示乘方
numbers = []
for value in range(1,11):
numbers.append(value ** 2)
print (numbers)
结果
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
有专门的几个用于处理数字列表的Python函数。可以统计数数字列表的最大值(函数max()),最小值(函数min())和总和(函数sum())
numbers = []
for value in range(1,11):
numbers.append(value ** 2)
print (min(numbers))
print (max(numbers))
print (sum(numbers))
结果
1
100
385
列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素。
numbers = [value ** 2 for value in range(1,11)]
print (numbers)
结果
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
可以先开始使用创建常规列表,当开始觉得多行代码比较繁复时,就该考虑使用列表解析了。
使用列表的一部分
处理列表的部分元素–Python称之为切片
要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range()一样,Python在到达指定的第二个索引前面的元素停止。要输出列表中的前三个元素,需要指定索引(0~3)。
fruits = ["apple","banana","strawberry","orange"]
print (fruits[0:3])
结果
['apple', 'banana', 'strawberry']
如果没有指定第一个索引,Python将自动从列表开头开始。
fruits = ["apple","banana","strawberry","orange"]
fruits_too = fruits[:3]
print (fruits_too)
结果
['apple', 'banana', 'strawberry']
让切片终止到列表末尾
fruits = ["apple","banana","strawberry","orange"]
fruits_too = fruits[1:]
print (fruits_too)
结果
['banana', 'strawberry', 'orange']
无论列表多长,这种语法都能够让输出从特定位置到列表末尾的所有元素。前面说过,负数索引返回离列表末尾响应距离的元素,因此可以输出列表末尾的任何切片
fruits = ["apple","banana","strawberry","orange"]
fruits_too = fruits[-2:]
print (fruits_too)
结果
['strawberry', 'orange']
如果要遍历列表的部分元素,可在for循环中使用切片。
fruits = ["apple","banana","strawberry","orange"]
print ("Here are my favorite fruits");
for fruit in fruits[:2]:
print (fruit.title())
结果
Here are my favorite fruits
Apple
Banana
很多情况下,切片都非常有用。
经常需要根据既有列表创建全新的列表。要复制列表,可创建一个包含整个列表的切片,方法是同时省略其实索引和终止索引([:])。
fruits = ["apple","banana","strawberry","orange"]
fruits_too = fruits[:]
print (fruits)
print (fruits_too)
结果
['apple', 'banana', 'strawberry', 'orange']
['apple', 'banana', 'strawberry', 'orange']
接下来分别在列表中放入不同的元素
fruits_too = fruits[:]
fruits.append("litchi")
fruits_too.append("cherry")
print (fruits)
print (fruits_too)
结果
['apple', 'banana', 'strawberry', 'orange', 'litchi']
['apple', 'banana', 'strawberry', 'orange', 'cherry']
注意,在复制代码的时候,不能直接像下面这样
fruits = ["apple","banana","strawberry","orange"]
fruits_too = fruits
print (fruits)
print (fruits_too)
结果
['apple', 'banana', 'strawberry', 'orange']
['apple', 'banana', 'strawberry', 'orange']
看着是一样的,感觉是复制了。稍微修改下代码就可以看出来是完全不一样的。
fruits = ["apple","banana","strawberry","orange"]
fruits_too = fruits
fruits.append("litchi")
fruits_too.append("cherry")
print (fruits)
print (fruits_too)
结果
['apple', 'banana', 'strawberry', 'orange', 'litchi', 'cherry']
['apple', 'banana', 'strawberry', 'orange', 'litchi', 'cherry']
其原理如下图
列表适合用于存储在程序运行期可能变化的数据集。列表是可以修改的。然而有时候需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的,而不可变的列表称为元组。
元组看起来就像列表,单使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。
elements = (100,200)
print (elements[0])
print (elements[1])
结果
100
200
试着修改元组中的元素
elements = (100,200)
elements[0] = 300
print (elements[0])
print (elements[1])
结果
Traceback (most recent call last):
File "/hello_python.py", line 2, in <module>
elements[0] = 300
TypeError: 'tuple' object does not support item assignment
试图修改元组中元素的值,导致Python报错。由于试图修改元组的操作是被禁止的,因此Python指出不能给元组的元素赋值。
像列表一样,使用for循环来遍历元组中的所有值
elements = (100,200)
for element in elements:
print (element)
结果
100
200