控制流语句决定哪些代码会执行,以及执行多少次。 本章介绍条件语句、占位符、循环、模式匹配、 异常、with 语句和推导式。

条件语句

快速导览已经展示了基本的 if、 它后面的冒号,以及缩进代码块。 Python 的比较运算符可以像数学表达式那样链式书写:

# chaining.py

x = 5
print(0 < x < 10)  # Chained comparison
#: True
grade = "ok" if x >= 3 else "low"  # Conditional expression
print(grade)
#: ok

这个例子还展示了条件表达式(conditional expression): 一个只有一行、能够产生值的 if/else。

给 if 语句增加 elif,就可以按顺序测试多个条件:

# if_elif.py

def classify(n):
    if n < 0:
        return "negative"
    elif n == 0:
        return "zero"
    else:
        return "positive"

print(classify(-3), classify(0), classify(7))
#: negative zero positive

占位符:pass 和 ...

pass 语句什么也不做。 当 Python 语法要求某个位置必须有一条语句,而你暂时没有任何代码要执行时,就使用它。

...(Ellipsis 字面量)是另一种占位符。 把它单独作为一条语句使用时,同 pass 一样什么也不做:

# placeholders.py

def not_implemented():
    pass  # Fill in later

def not_implemented_yet():
    ...

print(not_implemented(), not_implemented_yet())
#: None None

pass 表示一个目前还没有内容的缩进代码块。 ... 则是 stub 的惯用函数体,表示实现位于别处。 通常会把它直接写在被 stub 的 signature 同一行, 例如 Protocol 方法中 (静态类型会使用这种写法)。

循环

while 循环会一直运行,直到条件变为假:

# while_loop.py

def collatz_sequence(n):
    steps = 0
    while n != 1:
        n = n // 2 if n % 2 == 0 else 3 * n + 1
        print(n)
        steps += 1
    return steps

print(collatz_sequence(10), "steps")
#: 5
#: 16
#: 8
#: 4
#: 2
#: 1
#: 6 steps

break 离开循环,continue 则跳到下一轮迭代:

# break_continue.py

for n in range(10):
    if n == 3:
        continue  # Skip the rest of this iteration
    if n == 6:
        break  # Leave the loop
    print(n, end=" ")
print()  # The newline that end=" " left off
#: 0 1 2 4 5

这个循环先打印 0 1 2,通过 continue 跳过 3,然后打印 4 5, 接着在 6 处通过 break 停止,因此 6 到 9 都不会打印。 两者都作用于包含它们的最内层循环。 Python 没有带 label 的 break,所以如果想一次离开两层循环,要么使用 flag, 要么从同时包住两个循环的函数中 return,要么使用下面介绍的循环 else。