Python编程
基本控制流
与大多数命令式语言一样,程序控制流通常分为三种主要类别:
- 循环(loops)
- 分支(branches)
- 函数调用(function calls)
函数调用将在下节中讨论。生成器和列表推导式是程序控制流的高级形式,但在此不做介绍。
概览
Python中的控制流示例如下:
x = -6 # 分支
if x > 0: # 如果
print("Positive")
elif x == 0: # 否则,如果
print("Zero")
else: # 否则
print("Negative")
list1 = [100, 200, 300]
for i in list1:
print(i) # for 循环
for i in range(0, 5):
print(i) # 从0到4的for循环
for i in range(5, 0, -1):
print(i) # 从5到1的for循环
for i in range(0, 5, 2):
print(i) # 从0到4,步长为2的for循环
list2 = [(1, 1), (2, 4), (3, 9)]
for x, xsq in list2:
print(x, xsq) # 使用二元组作为迭代器的for循环
l1 = [1, 2]; l2 = ['a', 'b']
for i1, i2 in zip(l1, l2):
print(i1, i2) # 同时迭代两个列表的for循环
i = 5
while i > 0: # while 循环
i -= 1
list1 = ["cat", "dog", "mouse"]
i = -1 # 如果未找到为 -1
for item in list1:
i += 1
if item == "dog":
break # 跳出循环;也适用于 while 循环
print("Index of dog:", i)
for i in range(1, 6):
if i <= 4:
continue # 继续下一次循环;也适用于 while 循环
print("Greater than 4:", i)
循环
在 Python 中,有两种类型的循环:for
循环和 while
循环。
for
循环
for
循环遍历一个序列(元组或列表)中的元素。会创建一个变量来表示序列中的每个元素。例如:
x = [100, 200, 300]
for i in x:
print(i)
这将输出:
100
200
300
for
循环遍历列表或迭代器中的每个元素,将当前元素赋值给指定的变量名。在上面的例子中,x
中的每个元素被赋值给 i
。
有一个内置函数 range
,可以帮助我们更轻松地创建像上面这样的序列列表。上述的循环等价于:
l = range(100, 301, 100)
for i in l:
print(i)
类似于切片操作,range
函数的第一个参数是起始整数(如果只传递一个参数,则会把它作为结束参数,并默认将起始值设置为 0),第二个参数是结束整数,但不包括这个整数。
>>> range(5)
range(0, 5)
>>> list(range(5)) # 使用 list() 来输出列表
[0, 1, 2, 3, 4]
>>> set(range(5)) # 我们也可以输出一个集合
{0, 1, 2, 3, 4}
>>> list(range(1, 5))
[1, 2, 3, 4]
>>> list(range(1, 1)) # 从 1 开始,1 本身被排除在外
[]
接下来的例子使用负步长(内置 range
函数的第三个参数,类似于切片操作):
for i in range(5, 0, -1):
print(i)
这将输出:
5
4
3
2
1
负步长也可以是 -2
:
for i in range(10, 0, -2):
print(i)
这将输出:
10
8
6
4
2
for
循环和元组
for
循环还可以使用元组来进行迭代。如果循环遍历一个元组序列:
l = [(1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
for x, xsquared in l:
print(x, ':', xsquared)
这将输出:
1 : 1
2 : 4
3 : 9
4 : 16
5 : 25
while
循环
while
循环会重复执行一系列语句,直到条件为假为止。例如:
x = 5
while x > 0:
print(x)
x = x - 1
这将输出:
5
4
3
2
1
链接:
Python的控制流
Python的while
循环还可以有一个else
子句,当while
条件为假时,else
子句中的语句会执行一次。注意,while
循环内部的break
语句(详见下一节)不会导致程序流转到else
子句。举个例子:
x = 5
y = x
while y > 0:
print(y)
y = y - 1
else:
print(x)
这将输出:
5
4
3
2
1
5
与某些其他语言不同,Python没有后置条件循环。
当while
条件始终为真时(即条件永远为真),我们会得到一个无限循环。例如:
x = 1
while x > 0:
print(x)
x += 1
这会导致无限循环,打印出1, 2, 3, 4,...
。为了停止无限循环,我们需要使用break
语句。
链接:
跳出和继续
Python包含可以提前退出循环(无论是for
循环还是while
循环)的语句。使用break
语句可以退出循环:
x = 5
while x > 0:
print(x)
break
x -= 1
print(x)
这将输出:
5
要开始下一次循环而不等待当前循环结束,可以使用continue
语句:
l = [5, 6, 7]
for x in l:
continue
print(x)
这不会产生任何输出。
循环的else子句
如果循环内没有遇到break
语句,else
子句会被执行:
l = range(1, 100)
for x in l:
if x == 100:
print(x)
break
else:
print(x, " is not 100")
else:
print("100 not found in range")
另一个使用break
语句和else
语句的while
循环示例:
expected_str = "melon"
received_str = "apple"
basket = ["banana", "grapes", "strawberry", "melon", "orange"]
x = 0
step = int(input("Input iteration step: "))
while received_str != expected_str:
if x >= len(basket):
print("No more fruits left in the basket.")
break
received_str = basket[x]
x += step # Change this to 3 to make the while statement
# evaluate to false, avoiding the break statement, using the else clause.
if received_str == basket[2]:
print("I hate", basket[2], "!")
break
if received_str != expected_str:
print("I am waiting for my", expected_str, ".")
else:
print("Finally got what I wanted! my precious", expected_str, "!")
print("Going back home now!")
输出为:
Input iteration step: 2
I am waiting for my melon.
I hate strawberry!
Going back home now!
空白字符
Python通过缩进来决定循环的重复。所有缩进的代码都属于循环,下一行不缩进的代码不属于循环。例如,以下代码会打印"1 1 2 1 1 2":
for i in [0, 1]:
for j in ["a", "b"]:
print("1")
print("2")
另一方面,以下代码会打印"1 2 1 2 1 2 1 2":
for i in [0, 1]:
for j in ["a", "b"]:
print("1")
print("2")
分支
Python中基本上只有一种分支语句,即if
语句。if
语句的最简单形式仅在给定的条件为真时执行一块代码,如果条件为假则跳过这块代码。
例如:
>>> x = 10
>>> if x > 0:
... print("Positive")
...
Positive
>>> if x < 0:
... print("Negative")
...
你还可以在if
语句中添加elif
(即else
if
)分支。如果第一个if
条件为假,它会检查第一个elif
条件,并在它为真时执行该分支。如果第一个elif
为假,它会尝试第二个elif
,以此类推。注意,一旦找到了一个为真的分支,Python会停止检查后续分支并跳过其余的if
语句。你还可以在if
语句末尾添加一个else
分支。如果没有执行其他分支,Python会执行这个分支。
>>> x = -6
>>> if x > 0:
... print("Positive")
... elif x == 0:
... print("Zero")
... else:
... print("Negative")
...
'Negative'
链接:
结论
这些循环、分支和函数调用可以根据需要嵌套使用。循环可以包含循环,分支可以继续分支,函数可以调用其他函数,甚至可以调用自身。
练习
- 打印从0到1000的数字(包括0和1000)。
- 打印从0到1000之间的5的倍数。
- 打印从1到1000之间的5的倍数。
- 使用嵌套
for
循环打印以下3x3的乘法表:
1 2 3
2 4 6
3 6 9
- 打印以下3x3的乘法表:
1 2 3
------
1|1 2 3
2|2 4 6
3|3 6 9