Python编写条件分支代码方法
前言「写条件分支」看起来是最没技术含量的活但代码质量的分水岭恰恰在这里。同一个业务规则有人写出五层嵌套的if有人用三行if/elif加一个字典就清爽收尾。区别不在于聪明而在于是否知道 Python 提供了哪些分支写法、各自适合什么场景。初学者最常见的三个误解是以为and/or返回的是True/False其实返回的是参与运算的操作数本身以为match就是 C 的switch其实没有贯穿、还能匹配结构以及以为x or default是安全的默认值写法当x是0或空字符串时会被错误替换。本文按「从简单到复杂」的顺序讲六种条件分支写法并给出各自该在什么时候用。文中的match语句需要 Python 3.10 及以上其余写法在 Python 3.8 及以上都能跑。一、基础if / elif / else最直接的写法。要点是命中即停所以判断顺序就是优先级顺序。# 适用于 Python 3 全版本def http_status_text(code):if code 200:return OKelif code 301:return Moved Permanentlyelif code 404:return Not Foundelif 500 code 600:return Server Errorelse:return Unknown这里用到了链式比较500 code 600它等价于500 code and code 600但更短也更不易写错。二、条件表达式三元运算符当分支只是为了「二选一取值」时用条件表达式比写四行if/else更清晰# 适用于 Python 3 全版本age 17label 成年 if age 18 else 未成年print(label) # 未成年形式是「真值 if 条件 else 假值」顺序和 C 的条件 ? 真值 : 假值相反这是高频写错点。它适合短表达式嵌套多层会立刻变得难读# 适用于 Python 3 全版本# 不推荐嵌套三元可读性差grade A if s 90 else (B if s 80 else C)多层判断还是回到if/elif/else。三、布尔运算的短路与返回值and和or有短路特性而且返回的是操作数本身a or ba为真就返回a否则返回ba and ba为假就返回a否则返回b# 适用于 Python 3 全版本print(0 or 默认) # 默认print(x or 默认) # xprint(0 and 1 / 0) # 0右侧未求值不会除零print(abc and 42) # 42利用返回值可以写出简短的默认值逻辑但要注意假值判断的陷阱or会把0、、[]也当成「没有值」。如果一个合法值就是0必须改用显式的is None判断# 适用于 Python 3 全版本def with_default(value, default100):# 错误示范value 为 0 时也会被替换# return value or default# 正确只在确实是 None 时才用默认值return default if value is None else valueprint(with_default(0)) # 0print(with_default(None)) # 100四、卫语句提前返回消除嵌套深层嵌套的根因通常是「所有失败情况都往里缩进」。反过来写不合格的输入提前 return把主逻辑留在最外层。# 适用于 Python 3 全版本# 不推荐嵌套三层def price_bad(user, item):if user is not None:if user.is_active:if item.stock 0:return item.priceelse:return -1else:return -2else:return -3# 推荐卫语句提前返回def price_good(user, item):if user is None:return -3if not user.is_active:return -2if item.stock 0:return -1return item.price五、字典分派把「值相等」的分支换成查表当分支条件是「某个值和一批常量逐个比较」时用字典把「动作」或「结果」映射起来比一长串elif更好维护。# 适用于 Python 3 全版本def apply_op(op, a, b):operations {: lambda x, y: x y,-: lambda x, y: x - y,*: lambda x, y: x * y,}func operations.get(op)if func is None:raise ValueError(f不支持的运算符{op})return func(a, b)print(apply_op(*, 6, 7)) # 42注意用.get()而不是operations[op]直接下标在没有该键时会抛KeyError除非这正是你想要的错误。字典分派的前提是分派键是可哈希且可比较的常量不适合范围判断。六、match 语句结构化模式匹配Python 3.10从 Python 3.10 起语言引入了match/casePEP 634。它不是switch的翻版没有贯穿fall-through命中一个case就结束能匹配结构序列、映射、类实例不只是值_是通配符相当于默认分支支持守卫子句case ... if 条件:# 适用于 Python 3.10def describe(command):match command.split():case [go, direction]:return f向 {direction} 前进case [look]:return 你环顾四周case [take, item] if len(item) 3:return f拿起一个较长的物品{item}case [take, item]:return f拿起 {item}case _:return 无法识别的指令print(describe(go north)) # 向 north 前进print(describe(take)) # 无法识别的指令需要在 Python 3.10 以下运行时同一段逻辑只能用if/elif判断len(parts)和各位置的值来手写。实战把六种写法用在一个「评分系统」里# 适用于 Python 3.10from dataclasses import dataclassdataclassclass Submission:author: strscore: int | None None # 3.10 的联合类型写法def grade_of(score):if score is None:return 未评分if score 90:return Aif score 80:return Bif score 60:return Creturn Ddef label(submission):if submission.score is None:return f{submission.author}待评分status 优秀 if submission.score 90 else 已评分return f{submission.author}{grade_of(submission.score)}{status}def main():subs [Submission(Ada, 95),Submission(Bob, 72),Submission(Cy, None),]for s in subs:print(label(s))if __name__ __main__:main()输出依次是AdaA优秀、BobC已评分、Cy待评分。注意int | None这种联合类型写法需要 Python 3.10 及以上在 3.9 里要写typing.Optional[int]3.8 同理。常见坑点与混淆❌if code 200:✅if code 200:Python 3 里用在条件位置是语法错误以为and/or返回布尔值❌ 用x and y的结果去做is True判断 ✅ 它们返回操作数本身a and b得到b不是True用or提供默认值把合法假值也替换掉❌return value or default当value是0//[]时误用默认值 ✅return default if value is None else value把match当switch用❌ 期待case会像 C 那样向下贯穿或以为它只比常量 ✅match无贯穿、能做结构匹配、_是通配符需要 Python 3.10字典分派时直接用下标导致KeyError❌operations[op](a, b)✅ 先func operations.get(op)判空后再调用或明确用 try/except 捕获深层嵌套而不使用卫语句❌ 把失败分支一层层缩进到看不见主逻辑 ✅ 不合格输入提前return主逻辑留在最外层把范围判断写进字典分派❌ 试图用{range(0, 60): D, range(60, 80): C}直接查表 ✅range对象相等比较不是区间匹配范围判断仍用if/elif或专门的区间表条件表达式顺序写反❌label 未成年 if age 18 else 成年✅ 真值在前label 成年 if age 18 else 未成年总结写法适用场景注意事项if/elif/else通用分支、范围判断命中即停顺序即优先级条件表达式二选一取值真值在前勿嵌套多层and/or短路简单默认值、守卫返回操作数假值会误触发卫语句消除深层嵌套失败提前返回字典分派常量到结果的映射用.get()防KeyErrormatch结构匹配3.10无贯穿_为通配符判断该用哪种写法只需要问自己两个问题分支条件是「值相等」还是「范围/结构」值是常量就考虑字典分派是结构就用match是范围就用if/elif。至于嵌套过深先想到卫语句而不是继续往里缩进。

相关新闻

知识图谱可视化项目实践:Neo4j、Python与ECharts构建关系大屏

知识图谱可视化项目实践:Neo4j、Python与ECharts构建关系大屏

简介:一份基于知识图谱的医疗问答可视化系统毕业设计源码包,面向计算机、软件工程等专业学生,以及对Neo4j与Python开发感兴趣的学习者。项目以医疗领域数据为对象,完整覆盖数据清洗、知识图谱构建、问答匹配与前端可视化全流程&am…

2026/10/10 20:32:17 阅读更多 →
CSP-J/S初赛备考指南:从知识模块拆解到阅读程序手算技巧

CSP-J/S初赛备考指南:从知识模块拆解到阅读程序手算技巧

简介:这份资料集面向备战NOIP、CSP-J与CSP-S初赛第一轮的选手,尤其适合刚接触信奥、需要系统梳理初赛知识点的入门与进阶学习者。内容围绕计算机结构与组成、进制转换、原反补码、排序与基础算法、字符串与链表、栈队列与树等高频考点展开,并…

2026/10/10 20:32:17 阅读更多 →
H3C网络设备等保测评命令全解析:从身份鉴别到入侵防范的配置核查

H3C网络设备等保测评命令全解析:从身份鉴别到入侵防范的配置核查

1. 等保测评里的网络设备测评到底在做什么很多人第一次接触等保测评项目,拿到测评报告模板一看,网络安全层面的要求密密麻麻,再一看被测对象清单里写着“H3C S5560核心交换机”“H3C SecPath F1080防火墙”,整个人是懵的——华三设…

2026/10/10 20:32:17 阅读更多 →

最新新闻

coding agent 跨界上岗:用它跑通一篇论文的完整文献调研

coding agent 跨界上岗:用它跑通一篇论文的完整文献调研

coding agent 跨界上岗:用它跑通一篇论文的完整文献调研 【免费下载链接】OpenResearch Turn your coding agents into research agents 项目地址: https://gitcode.com/GitHub_Trending/op/OpenResearch 把一篇论文的文献调研交给 coding agent 跑完——这在…

2026/10/10 22:14:02 阅读更多 →
ABAP小游戏实战:从猜数字到井字棋的完整开发解析

ABAP小游戏实战:从猜数字到井字棋的完整开发解析

1. 场景与需求分析:为什么要在ABAP里做小游戏先别笑,用ABAP写游戏这事听起来像“用拖拉机跑F1”,但我真不是来搞笑的。我在SAP项目里待了十多年,从ECC 6.0一路做到S/4HANA,见过太多顾问跟ABAP死磕报表、接口、增强的日…

2026/10/10 22:14:01 阅读更多 →
Java入门完全指南:从字节码到JVM的跨平台原理与实战

Java入门完全指南:从字节码到JVM的跨平台原理与实战

Java 这门语言从1995年发布到现在,掐指一算快三十年了。这些年编程语言一波接一波,但Java依然是企业级后端、Android开发、大数据生态里的主力选手。每次跟刚入行的新人聊天,我都被问同一个问题:Java到底怎么跑起来的?…

2026/10/10 22:14:01 阅读更多 →
UMMA block scaling 原理与实战:矩阵乘加分块缩放量化部署指南

UMMA block scaling 原理与实战:矩阵乘加分块缩放量化部署指南

1. UMMA block scaling 到底在解决什么问题第一次看到“UMMA 的 block scaling”这个说法,很多人会以为是某个新框架的专属名词。其实把词拆开就清楚了:UMMA 通常指一类统一内存访问架构下的矩阵乘加运算单元,而 block scaling 指的是在矩阵运…

2026/10/10 22:13:01 阅读更多 →
e稿使用流程全指南 不同学科人群操作技巧分享

e稿使用流程全指南 不同学科人群操作技巧分享

e稿基础使用流程全梳理 e稿作为一站式AI论文写作软件,操作简单易上手,全流程无需复杂配置即可使用。本章节梳理当前版本的全流程操作步骤,后续版本迭代可能调整,具体以官方最新说明为准。

2026/10/10 22:13:01 阅读更多 →
退货换标真实案例:旺季退货怎么变回库存

退货换标真实案例:旺季退货怎么变回库存

旺季是卖家期待的季节,也是退货多的季节。很多卖家只盯着出库,忽略了逆向,结果货退回来堆在仓里,既占地方又压资金,旺季赚的利润被逆向悄悄吃掉。本文用一个典型卖家的经历,讲清楚退货换标怎么把损失变回库…

2026/10/10 22:13:01 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →