守卫与通配符
添加条件和兜底分支
守卫与通配符 是 CoddyKit 上的免费 Python Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
细化匹配
有时结构化模式还不够,您还需要一个条件。守卫会为分支添加 if 测试,而通配符则提供灵活的兜底匹配。
添加守卫
在模式后写入 if <condition>。只有模式匹配并且守卫为真时,该分支才会匹配。
n = 7
match n:
case x if x < 0:
print('negative')
case x if x == 0:
print('zero')
case x if x > 0:
print('positive')守卫使用捕获的名称
守卫可以引用由模式绑定的变量。这里会检查捕获的配对值是否相等。
point = [3, 3]
match point:
case [x, y] if x == y:
print('on the diagonal')
case [x, y]:
print('off the diagonal')守卫失败时
如果结构匹配但守卫为假,匹配会继续检查下一个分支,而不会停止。
value = 5
match value:
case n if n > 100:
print('big')
case n:
print('fell through to here:', n)将守卫与类模式结合
守卫可以与任何类型的模式结合使用,包括类模式,从而精确限定对象属性的条件。
from dataclasses import dataclass
@dataclass
class Order:
total: float
def discount(order):
match order:
case Order(total=t) if t > 100:
return 'free shipping'
case Order():
return 'standard shipping'
print(discount(Order(150)))
print(discount(Order(50)))通配符回顾
单独的下划线 _ 可以匹配任何内容,但不会绑定任何值。将它作为最后一个分支时,它会处理之前没有匹配的所有情况。
x = 'unexpected'
match x:
case 'a':
print('letter a')
case _:
print('catch-all')捕获与通配符
命名捕获同样可以匹配任何内容,但会保留该值,而 _ 会丢弃它。如果需要在分支体中使用这个值,请使用名称。
value = 42
match value:
case 0:
print('zero')
case other: # capture: keeps the value
print('value was', other)模式内部的通配符
下划线可以出现在更大的模式内部,用来忽略您不关心的部分。
record = ('user', 42, 'ignore_me')
match record:
case ('user', user_id, _):
print('user id:', user_id)组合 OR、守卫和通配符
这些功能可以组合使用。先使用 OR 模式,再使用守卫,最后使用通配符,就能构建出表达力很强的分类器。
def classify(n):
match n:
case 0 | 1:
return 'binary digit'
case x if x % 2 == 0:
return 'even'
case _:
return 'odd'
print(classify(0))
print(classify(4))
print(classify(7))完备性
与某些语言不同,Python 不会强制 match 覆盖所有情况。如果没有任何分支匹配,该语句就什么也不做。如果希望始终执行一个分支,请添加最后的 case _。
color = 'purple'
result = 'no match'
match color:
case 'red':
result = 'stop'
case 'green':
result = 'go'
print(result)为解构数据添加守卫
守卫与序列模式和映射模式结合得很自然,可以让您测试刚刚提取出的值。
data = [10, 20]
match data:
case [a, b] if a + b > 25:
print('sum is large')
case [a, b]:
print('sum is small')快速检查
当模式在结构上匹配,但它的守卫条件为假时,会发生什么?
回顾
您学会了添加条件和兜底分支。
- 守卫会添加一个可以使用捕获名称的
if测试。 - 守卫失败时会继续检查下一个分支。
_会匹配并丢弃值;名称会捕获值。- 添加最后的
case _可以确保始终执行一个分支。
常见问题解答
「守卫与通配符」课时是免费的吗?
是的 — 「守卫与通配符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「守卫与通配符」这节课中我会学到什么?
添加条件和兜底分支 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「守卫与通配符」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。