Skip to content

02 控制流

控制流用于决定代码的执行路径。if用于条件判断,forwhile用于循环,match用于模式匹配,这些语句共同构成 Python 程序的基本执行逻辑。

一、if语句

1.1 基本语法

python
>>> x = int(input("请输入一个整数: "))
请输入一个整数: 42
>>> if x < 0:
...     x = 0
...     print('负数变为零')
... elif x == 0:
...     print('零')
... elif x == 1:
...     print('一')
... else:
...     print('更多')
更多

elifelse if的缩写。一个if语句可以包含多个elif分支,最后的else分支可选。

1.2 条件表达式

Python 3.10 之前没有switch语句,通常使用if...elif...else替代。条件表达式不需要括号,但语句末尾必须有冒号。

二、for循环

2.1 遍历序列

Python 的for循环直接遍历序列中的元素,不需要手动维护索引:

python
>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print(w, len(w))
...
cat 3
window 6
defenestrate 12

2.2 遍历时修改列表

遍历列表时如果需要修改列表本身(例如删除元素),通常应先复制一份再遍历:

python
>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words[:]:   # 遍历副本
...     if len(w) > 6:
...         words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']

直接遍历words并同时修改它,可能导致不可预测的结果。

三、range()函数

3.1 基本用法

需要遍历数字序列时,可以使用range()

python
>>> for i in range(5):
...     print(i)
...
0
1
2
3
4

3.2 指定起止和步长

python
>>> for i in range(5, 10):
...     print(i)
...
5
6
7
8
9

>>> for i in range(0, 10, 3):
...     print(i)
...
0
3
6
9

>>> for i in range(-10, -100, -30):
...     print(i)
...
-10
-40
-70

range(start, end, step)——起始值(默认0)、结束值(不含)、步长(默认1)。

3.3 配合len()遍历索引

python
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
...     print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb

多数情况下,使用enumerate()遍历索引和值更清晰。

3.4 range转列表

python
>>> list(range(5))
[0, 1, 2, 3, 4]

四、break、continue和else

4.1 break和continue

break用于跳出循环,continue用于跳过当前迭代:

python
>>> for n in range(2, 10):
...     if n % 2 == 0:
...         print(f"发现偶数: {n}")
...         continue
...     print(f"发现奇数: {n}")
发现偶数: 2
发现奇数: 3
发现偶数: 4
发现奇数: 5
发现偶数: 6
发现奇数: 7
发现偶数: 8
发现奇数: 9

4.2 循环的else子句

forwhile循环可以带else子句。当循环正常结束(未被break中断)时,else子句会执行:

python
>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, '等于', x, '*', n//x)
...             break
...     else:
...         # 循环正常结束,说明没找到因子
...         print(n, '是质数')
...
2 是质数
3 是质数
4 等于 2 * 2
5 是质数
6 等于 2 * 3
7 是质数
8 等于 2 * 4
9 等于 3 * 3

如果循环被break中断,else子句不会执行。

五、while循环

5.1 基本用法

python
>>> a, b = 0, 1
>>> while a < 10:
...     print(a, end=' ')
...     a, b = b, a+b
...
0 1 1 2 3 5 8

5.2 死循环

python
>>> while True:
...     response = input('输入quit退出: ')
...     if response == 'quit':
...         break
...
输入quit退出: hello
输入quit退出: quit

六、pass语句

pass不执行任何操作,用于语法上需要语句但逻辑上暂不需要处理的场景:

python
>>> while True:
...     pass   # 忙等待,按Ctrl+C退出

>>> class MyEmptyClass:
...     pass

>>> def init_log():
...     pass   # 还没实现,先占位

七、match语句(3.10+)

7.1 基本匹配

python
>>> status = 404
>>> match status:
...     case 200:
...         print("OK")
...     case 404:
...         print("Not Found")
...     case 500:
...         print("Server Error")
...     case _:
...         print("Unknown")
...
Not Found

_是通配符,可以匹配任何值。

7.2 解构匹配

python
>>> point = (1, 0)
>>> match point:
...     case (0, 0):
...         print("原点")
...     case (x, 0):
...         print(f"X轴上,x={x}")
...     case (0, y):
...         print(f"Y轴上,y={y}")
...     case (x, y):
...         print(f"点({x}, {y})")
...
X轴上,x=1

7.3 匹配字典

python
>>> action = {"type": "move", "x": 10, "y": 20}
>>> match action:
...     case {"type": "move", "x": x, "y": y}:
...         print(f"移动到({x}, {y})")
...     case {"type": "click", "target": target}:
...         print(f"点击{target}")
...
移动到(10, 20)

7.4 守卫条件

python
>>> point = (1, 1)
>>> match point:
...     case (x, y) if x == y:
...         print(f"在对角线上,x=y={x}")
...     case (x, y):
...         print(f"点({x}, {y})")
...
在对角线上,x=y=1

if后面是守卫条件,只有模式匹配成功且条件为真时才进入该分支。

八、总结

语句用途
if/elif/else条件判断
for遍历序列
while条件循环
range()生成数字序列
break跳出循环
continue跳过当前迭代
else(循环)循环正常结束时执行
pass占位符
match/case模式匹配(3.10+)

for循环直接遍历元素,range()用于生成数字序列。循环的else子句只在未被break中断时执行。match是 Python 3.10 引入的模式匹配语句,支持解构和守卫条件。