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 == 0break 退出最内层循环,continue 跳到下一次迭代,pass 只是占位且不会跳过后续语句。不要遍历列表的同时删除其中的元素,通常建立新列表更清楚。
python
found = None
for number in [0, -2, 4, 9]:
if number <= 0:
continue
found = number
break
assert found == 4range
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截断。参考未执行。
继续阅读
- 开发实践
- 排错
- 开发实践