基本控制流

与大多数命令式语言一样,程序控制流通常分为三种主要别:

  • 循环(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'

链接

结论

这些循环、分支和函数调用可以根据需要嵌套使用。循环可以包含循环,分支可以继续分支,函数可以调用其他函数,甚至可以调用自身。

练习

  1. 打印从0到1000的数字(包括0和1000)。
  2. 打印从0到1000之间的5的倍数。
  3. 打印从1到1000之间的5的倍数。
  4. 使用嵌套for循环打印以下3x3的乘法表:
1 2 3
2 4 6
3 6 9
  1. 打印以下3x3的乘法表:
1 2 3
------
1|1 2 3
2|2 4 6
3|3 6 9
Last modified: Friday, 31 January 2025, 12:02 AM