控制流语句决定哪些代码会执行,以及执行多少次。 本章介绍条件语句、占位符、循环、模式匹配、 异常、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。