Skip to content

Python 条件与循环 ​

条件分支 ​

if/elif/else 只执行首个满足条件的分支。None、零、空字符串和空容器通常是假值;多个条件用 and、or、not 组合。

python
size = 0
if size < 0:
    size_label = "invalid"
elif size == 0:
    size_label = "empty"
else:
    size_label = "nonempty"

assert size_label == "empty"
label = "yes" if 3 > 2 else "no"  # 简单条件表达式
assert label == "yes"

遍历与循环控制 ​

for 遍历可迭代对象,while 在条件成立时重复。需要索引用 enumerate,同时遍历多个序列用 zip;zip 默认到最短输入结束。

python
names = ["Alice", "Bob"]
for index, name in enumerate(names, start=1):
    print(index, name)

remaining = 2
while remaining > 0:
    remaining -= 1
assert remaining == 0

break 退出最内层循环,continue 跳到下一次迭代,pass 只是占位且不会跳过后续语句。不要遍历列表的同时删除其中的元素,通常建立新列表更清楚。

python
found = None
for number in [0, -2, 4, 9]:
    if number <= 0:
        continue
    found = number
    break
assert found == 4

range ​

range(stop) 或 range(start, stop, step) 返回不可变整数序列对象,按需迭代,不提前创建整数列表。结束值不包含在内,步长不能为零。

python
assert list(range(5)) == [0, 1, 2, 3, 4]
assert list(range(2, 9, 2)) == [2, 4, 6, 8]
assert list(range(3, 0, -1)) == [3, 2, 1]

match:拆解结构 ​

Python 3.10 起支持结构化模式匹配。它适合匹配并解包数据结构;普通数值范围判断继续用 if。只有首个匹配成功的分支执行,没有匹配且没有兜底时不执行任何分支。

python
command = ["move", 2, 3]
match command:
    case ["move", x, y]:
        description = f"move to {x},{y}"
    case ["quit"]:
        description = "bye"
    case _:
        description = "unknown"

assert description == "move to 2,3"

模式里的普通名称通常捕获值,并非与同名变量作相等比较。细节见 官方流程控制教程。

练习 ​

写循环寻找第一个大于 10 的值;找不到时把结果保留为 None。再用 zip 配对姓名和分数,先检查两个输入的长度是否相同。下一步读 函数与模块。

参考解答 ​

寻找第一个符合条件的值时,匹配后必须break,避免被后续匹配覆盖;空输入和全部不符合都应得到None。完整局部练习:

python
values = [3, 12, 20]
found = None
for value in values:
    if value > 10:
        found = value
        break
assert found == 12

names, scores = ["Ada", "Lin"], [90, 80]
if len(names) != len(scores):
    raise ValueError("name/score length mismatch")
pairs = list(zip(names, scores))
assert pairs == [("Ada", 90), ("Lin", 80)]

把values改为空列表时found应仍为None;长度不一致应先报错,而非接受zip截断。参考未执行。

继续阅读