1562 字
8 分钟
Python 札记 (6)
2026-08-29
NOTE

目录骨架来自菜鸟教程 Python3 条件与循环章节,表述与细节对照 Python 官方文档 与相关 PEP 核对。基于 Python 3。完整出处见文末 参考

条件:if / elif / else#

More Control Flow Tools — ififelif(0 个或多个)、else(可选 0 或 1 个)。条件是表达式,按 Truth Value Testing 判真假:NoneFalse、零、''()[]{}set()range(0) 等为假,其余一般为真。

score = 85
if 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 matchingmatchcase 在 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 = 3
while n > 0:
print(n)
n -= 1
print("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")
break
else:
print("all even")

查找质数、搜索失败提示等场景有用;初学可暂不依赖。

range#

range 是不可变整数序列,常用于 for 控制次数,不占完整 list 内存。

range(stop) # 0 .. stop-1
range(start, stop) # start .. stop-1
range(start, stop, step) # step 不可为 0
print(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、多重赋值与 printend

while(打印不超过阈值的项):

a, b = 0, 1
while a < 1000:
print(a, end=", ")
a, b = b, a + b
print()

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)) # 0
print(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
matchmatch subject: + case pattern:(3.10+)
whilewhile cond:
forfor target in iterable:
break / continue仅作用于最内层循环
循环 elsebreak 时执行
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

参考#

官方文档(中文版 可对照阅读):

  1. More Control Flow Toolsifwhileforbreak/continue/else、匹配语句
  2. First Steps Towards Programming — 斐波那契 while 示例
  3. List Comprehensions — 列表推导与集合推导
  4. Looping Techniquesenumeratezip、dict 遍历
  5. The for statement
  6. The while statement
  7. Generator expressions
  8. range — 构造与步长
  9. enumerate() / zip()
  10. Truth Value Testing

PEP:

  1. PEP 636 — Structural Pattern Matchingmatch / case

目录来源(骨架,不以它为准改语法):

  1. 菜鸟教程 · 条件控制
  2. 菜鸟教程 · 循环语句
Python 札记 (6)
https://blog.chuwu.top/posts/python/python6/
作者
ChuwuYo
发布于
2026-08-29
许可协议
CC BY-NC-SA 4.0