NOTE目录骨架来自菜鸟教程 Python3 条件与循环章节,表述与细节对照 Python 官方文档 与相关 PEP 核对。基于 Python 3。完整出处见文末 参考。
条件:if / elif / else
More Control Flow Tools — if:if、elif(0 个或多个)、else(可选 0 或 1 个)。条件是表达式,按 Truth Value Testing 判真假:None、False、零、''、()、[]、{}、set()、range(0) 等为假,其余一般为真。
score = 85if score >= 90: grade = "A"elif score >= 80: grade = "B"elif score >= 60: grade = "C"else: grade = "F"print(grade)冒号与缩进定义 suite(第 1 篇);空分支用 pass。
if / for / while / try 不会开新作用域:其中赋值的名字在块外仍可见(Naming and binding)。函数才会形成局部命名空间。
海象运算符可在条件里顺带赋值(PEP 572):
words = ["a", "b", "c", "d"]if (n := len(words)) > 3: print(n)比较与链式比较
比较运算符:== != < <= > >=,以及 is / is not(身份)、in / not in(成员)。可链式写:a < b <= c 等价于 a < b and b <= c,且 b 只算一次(Comparisons)。
三元表达式(条件表达式)
语法:value_if_true if condition else value_if_false。先求 condition,再二选一:
status = "adult" if age >= 18 else "minor"只适合简单表达式;复杂逻辑仍用 if 块。
match / case 简介(3.10+)
PEP 636 引入 structural pattern matching。match 与 case 在 3.10 起为 soft keyword(可用 keyword.issoftkeyword("match") 查看),只在 match 语句语法位置有特殊含义,别处仍可做变量名(3.9 及更早无此语法)。
def http_status(code): match code: case 200: return "OK" case 404: return "Not Found" case 500 | 502 | 503: return "Server Error" case _: return "Unknown"_ 为通配模式。可解构序列、映射、对象属性;比 C 风格 switch 能做的多。日常分支仍以 if / elif 为主。
循环:while 与 for
while
条件为真则重复执行 suite;要有改变条件的语句,避免死循环。
n = 3while n > 0: print(n) n -= 1print("lift off")for
for 语句 对 iterable 逐项赋值给目标,自动处理迭代结束,无需手动索引到 len。
words = ["Python", "is", "great"]for w in words: print(w)遍历 dict 时,默认迭代键;要键值用 .items()(第 5 篇)。
break、continue
break— 立刻跳出最内层 enclosing 循环。continue— 跳过本次剩余 suite,进入下一轮迭代。
for x in range(10): if x % 2 == 0: continue if x > 5: break print(x) # 1, 3, 5循环的 else 子句
while / for 可带 else:循环正常结束(未因 break 跳出)时执行 else suite。
for n in [2, 4, 6, 8]: if n % 2 == 1: print("found odd") breakelse: print("all even")查找质数、搜索失败提示等场景有用;初学可暂不依赖。
range
range 是不可变整数序列,常用于 for 控制次数,不占完整 list 内存。
range(stop) # 0 .. stop-1range(start, stop) # start .. stop-1range(start, stop, step) # step 不可为 0print(list(range(5))) # [0, 1, 2, 3, 4]print(list(range(2, 8, 2))) # [2, 4, 6]print(list(range(0, -3, -1))) # [0, -1, -2]需要 list 时再 list(range(...));仅迭代时直接 for i in range(n)。
enumerate 与 zip
enumerate(iterable, start=0) — 产出 (index, item),避免手动维护计数器:
for i, fruit in enumerate(["apple", "banana"], start=1): print(i, fruit)zip(*iterables) — 并行迭代多个可迭代对象,产出元组;长度取最短:
names = ["Alice", "Bob"]scores = [90, 85]for name, score in zip(names, scores): print(name, score)长度不等时余下部分丢弃;要对齐最长的那一侧,用 itertools.zip_longest。
斐波那契
官方 Programming First Steps 用斐波那契演示 while、多重赋值与 print 的 end。
while 版(打印不超过阈值的项):
a, b = 0, 1while a < 1000: print(a, end=", ") a, b = b, a + bprint()for + 解包(生成固定项数):
def fib(n): """打印前 n 个斐波那契数。""" a, b = 0, 1 for _ in range(n): print(a, end=" ") a, b = b, a + b print()
fib(10)存进 list(扩展官方思路):
def fib_list(n): result = [] a, b = 0, 1 for _ in range(n): result.append(a) a, b = b, a + b return result
print(fib_list(8)) # [0, 1, 1, 2, 3, 5, 8, 13]同一逻辑也可写成推导式(见下),但循环版更易读、易改。
列表推导式
List Comprehensions:[expression for item in iterable if condition]。
squares = [x * x for x in range(10)]evens = [x for x in range(20) if x % 2 == 0]嵌套循环从左到右等价于嵌套 for:
pairs = [(x, y) for x in range(3) for y in range(3) if x != y]官方建议:简单变换用推导式;逻辑复杂、副作用多时用普通 for。
保序去重
raw = [3, 1, 2, 3, 2, 1]ordered_unique = list(dict.fromkeys(raw))print(ordered_unique) # [3, 1, 2]集合与字典推导式
集合推导式 — {expr for item in iterable if cond},花括号与 dict 字面量相同,但无冒号:
unique_lengths = {len(w) for w in ["hi", "hello", "hi"]}print(unique_lengths) # {2, 5}字典推导式 — {key: value for ...}:
word_map = {w: len(w) for w in ["Python", "Java", "Go"]}print(word_map)生成器表达式
语法与 list 推导式类似,但用 圆括号:(expr for item in iterable if cond)。产出 iterator,惰性求值,省内存:
total = sum(x * x for x in range(1000000)) # 外层函数吞掉括号gen = (x * x for x in range(5))print(next(gen)) # 0print(list(gen)) # [1, 4, 9, 16] — 已消耗 0单独写 (x for x in iterable) 是生成器表达式;仅 {}、[] 构成 dict / list 推导式。单层 (x for ...) 与调用写成 func(x for ...) 时,圆括号可省略一层(官方 Generator expressions)。
推导式里先别写海象 :=;要用再查 PEP 572。
附录:控制流与推导式语法速查
| 构造 | 语法要点 |
|---|---|
| 条件 | if / elif / else + 缩进 suite |
| 三元 | a if cond else b |
| match | match subject: + case pattern:(3.10+) |
| while | while cond: |
| for | for target in iterable: |
| break / continue | 仅作用于最内层循环 |
| 循环 else | 未 break 时执行 |
| list 推导 | [e for x in it if c] |
| set 推导 | {e for x in it if c} |
| dict 推导 | {k: v for x in it if c} |
| 生成器表达式 | (e for x in it if c) |
常用内置(循环相关)
| 名称 | 作用 |
|---|---|
range | 整数序列 |
enumerate | 带索引迭代 |
zip | 并行迭代 |
len | 长度 |
sum / min / max | 聚合(可接可迭代对象) |
sorted | 返回新排序 list |
reversed | 返回 reverse iterator |
参考
官方文档(中文版 可对照阅读):
- More Control Flow Tools —
if、while、for、break/continue/else、匹配语句 - First Steps Towards Programming — 斐波那契
while示例 - List Comprehensions — 列表推导与集合推导
- Looping Techniques —
enumerate、zip、dict 遍历 - The for statement
- The while statement
- Generator expressions
- range — 构造与步长
- enumerate() / zip()
- Truth Value Testing
PEP:
- PEP 636 — Structural Pattern Matching —
match/case
目录来源(骨架,不以它为准改语法):