
这次Python3基础课是第三次课的第2篇主题是运算符与条件结构。听起来没有“AI人工智能”那么唬人但这两块恰恰是所有代码的基本功——哪怕你后面去写神经网络、写数据处理脚本也绕不开加减乘除、大小判断、真假分支。这篇文章是我在讲完课之后整理出来的笔记把每一个运算符的坑、条件判断的写法以及一个和AI场景沾边的小实战都放在里面了。不管你是完全零基础还是刚看完语法还在懵的状态今天按这篇文章走一遍再去自己敲几遍这块地基就算打牢了。1. 课程背景与内容定位1.1 为什么学Python要先啃透运算符我接触不少准备转AI方向的新人一上来就急着去啃深度学习框架结果连个损失函数里的求平均值都看不懂更别说理解梯度下降时那些更新公式了。原因很简单底层的Python运算不熟框架代码对你来说就是天书。运算符是程序“做计算”的核心工具加减乘除、取整取余、比较大小、逻辑判断这些看似基础的东西在AI领域里无处不在。举个例子做数据归一化的时候要找出特征列的最大值和最小值这就是比较运算把原始数据减去均值再除以标准差这是算术运算判断一个样本是否满足筛选条件比如年龄大于18且收入不低于5000这就是逻辑运算和条件结构。没有这些东西程序只能一条路走到黑AI模型也就谈不上智能决策了。这一节我建议你把它当作“查漏补缺”来看别觉得简单就跳过。尤其是除法/、整除//、取余%在负数场景下的表现还有和is的区别这些是新手翻车重灾区。1.2 条件结构让程序学会“选择”条件结构对应的是“如果……那么……否则……”的逻辑。在AI应用中这种选择无处不在数据清洗时判断缺失值要不要丢弃训练时判断模型准确率有没有达到阈值推理时根据置信度决定是否输出结果。可以说没有条件结构程序就只能把所有输入一视同仁地处理根本无法适应真实场景。很多新手写条件结构时习惯把逻辑都堆在if里结果代码又长又乱。其实Python的if、elif、else组合起来非常灵活配合逻辑运算符能写出很像自然语言的判断语句。这一篇我不仅会讲语法还会告诉你哪些写法更Pythonic、哪些写法会让后续维护的人骂你。先打好这个基础下一节课循环结构就好学很多因为循环里也会嵌套条件两篇是连在一起的。2. 运算符全景拆解2.1 算术运算符不只是加减乘除Python里的算术运算符一共有7个分别是、-、*、/、//、%、**。前两个不用多解释重点说后面几个。/是普通除法无论除数和被除数是什么类型结果都是浮点数。5 / 2得到2.5这很符合直觉。//是整除中文也叫地板除它会向下取整而不是简单地去掉小数部分。很多人在这踩坑7 // 2是3但-7 // 2不是-3而是-4因为-3.5向下取整是-4。%是取余结果的符号跟除数保持一致。你可以在交互式环境里试试-7 % 3结果是2因为Python会保证被除数 整除结果 * 除数 余数成立也就是-7 (-3) * 3 2。这些规则和我们从小到大的数学习惯不完全一致所以一定要亲手跑一遍。**是幂运算2 ** 3等于8。算术运算符还支持字符串操作AI * 3会得到AIAIAIAI 时代会得到AI时代。这在生成测试文本时偶尔会用到。整体来看算术运算符本身不难难的是不同类型混用时的类型转换新手写代码时最好养成“先把变量类型统一”的习惯。2.2 比较运算符判断的基础比较运算符有六个、!、、、、返回值是布尔值True或False。这是条件判断的底层支撑。判断值是否相等!判断是否不相等这个好理解。比较运算有两个容易出问题的地方。第一浮点数比较要小心0.1 0.2 0.3的结果是False因为浮点数在计算机里是二进制近似存储的0.1 0.2实际上是0.30000000000000004。要比较浮点数最好用abs(a - b) 1e-9这种方式而不是直接。第二和is的区别比较的是值is比较的是两个变量是否指向同一个对象。对于小整数Python有缓存机制a 1000; b 1000; a is b可能为False但a 1; b 1; a is b为True因为小的整数对象被缓存了。新手很容易在这里懵掉记住一条判断值相等用判断身份是不是同一个对象才用is。Python还支持链式比较比如3 x 10写起来非常自然。另外比较运算符不仅能比较数字还能比较字符串字符串比较按字典序逐个字符进行。apple banana是True因为a在b前面。这一块多敲几次就有感觉了。2.3 赋值运算符为变量“贴标签”最基本的赋值符号是它把右边的值绑定到左边变量上。除了单个还有一组复合赋值运算符、-、*、/、//、%、**以及位运算的复合版本。x 1等价于x x 1写起来更简洁也符合“对原变量做修改”的语义。这里提醒一点复合赋值运算符会改变变量的值所以左边必须是一个可以被赋值的变量不能直接对常量操作比如5 1是语法错误。另外x 1和x x 1在大多数情况下等价但当x是可变对象时行为会有微妙差别。比如list_a [1]是在原列表上追加而list_a list_a [1]会创建新列表。这个细节初学者先记着后面讲可变对象和不可变对象时再深入。Python 3.8还引入了一个很有意思的“海象运算符”:它能让你在表达式中直接赋值并返回结果。比如if (n : len(items)) 5:在判断的同时把列表长度存到n里。这个不是必学但刷LeetCode时经常看到了解一下没坏处。2.4 逻辑运算符把条件串起来逻辑运算符有三个and、or、not。它们操作的通常是布尔值但返回值不一定只是True或False。这是新手最容易误解的地方。and和or遵循短路求值规则and只要遇到一个假值就立即返回那个假值不再往后计算or只要遇到一个真值就立即返回那个真值不再往后计算。举个例子print(0 and 10) # 0 print(1 and 10) # 10 print(0 or 10) # 10 print(1 or 10) # 1所以and的结果不一定是True而是在“停止计算时最后看到的那个对象”。这个特性常被用来写简化代码比如从配置文件里取值时name user_input or 默认用户如果user_input是空字符串或Noneor会返回后面的默认值。这个技巧很实用但要注意可读性别把逻辑写得太绕。not很简单就是取反not True为False。逻辑运算符的优先级从高到低是not、and、or所以not a or b and c实际上会被解析为(not a) or (b and c)。当我需要让表达式的意图更清楚时会主动加上括号而不是依赖优先级记忆。这种习惯能省去很多调试时间。2.5 位运算、成员运算与身份运算位运算是直接对整数二进制位进行操作的按位与、|按位或、^按位异或、~按位取反、左移、右移。在AI领域位运算一般用于底层性能优化、图像处理里的像素掩码、或者状态压缩。日常开发中用得不多但面试题里常出现比如用异或交换两个变量、判断奇偶性用x 1。作为基础课我把它们列在这里目的是让你看到运算符的全貌不需要现在死记硬背。成员运算in和not in用来判断一个元素是否存在于某个容器里。这在AI数据处理时非常常用比如判断一个特征名是否在特征列表里、检查某个类别是否在标签集合中。用法很简单if age in features: print(存在年龄特征)身份运算is和is not前面提过判断两个引用是否指向同一个对象。在写代码时判断一个变量是否为None官方推荐用is None而不是 None因为None是单例对象用is更清晰且性能更好。2.6 三目运算符一行代码解决条件赋值三目运算符的语法是值1 if 条件 else 值2它的含义是如果条件成立整个表达式的值是值1否则是值2。这是把一个简单的if-else压缩成一行非常适合对变量做“二选一”赋值。比如status 及格 if score 60 else 不及格比写四行if-else简洁不少。不过三目运算符不要嵌套太多层否则可读性会崩塌。比如# 尽量避免这种写法 result 优秀 if score 90 else (良好 if score 80 else 一般)这种嵌套三目虽然能跑但阅读体验很差。我更推荐在分支超过两个时回到普通的if-elif-else结构代码清楚也方便后续维护。3. 条件结构实战3.1 从if到elif到elsePython条件结构的基本语法是用if关键字开头后面跟一个条件表达式以冒号结尾下一行缩进的代码块就是条件成立时执行的语句。如果条件不成立可以接elif相当于“否则如果”和else相当于“否则”。注意Python里没有switch-case多分支判断一般用elif串起来。写一个最经典的例子——成绩等级判断score 85 if score 90: grade 优秀 elif score 80: grade 良好 elif score 70: grade 中等 else: grade 需要努力 print(grade)这里的关键是分支顺序条件从上往下依次判断一旦某个条件满足后面的elif就不再执行。所以你要把“最严格的范围”放在前面比如90必须先于80判断否则优秀的学生会被先分到良好。另外else不是必须的但加上它能处理“所有未覆盖的情况”提高代码健壮性。写条件时条件表达式本身可以是任意返回布尔值的内容可以是比较运算、逻辑运算甚至直接是一个变量。if 1:是成立的因为1在布尔上下文中为True。这里有一个很重要的隐式规则下面单独说。3.2 嵌套与“卫语句”风格条件结构可以嵌套比如先判断是否有数据再判断数据是否合格。但嵌套层级一旦超过三层代码就会变得很难读。我见过有些新手写四五层嵌套的if后面加个需求改代码人都要疯了。遇到这种情况我更推荐用“卫语句”风格先把不满足条件的场景提前处理掉要么返回、要么跳过让主干逻辑留在最外层避免层层嵌套。举个例子判断闰年的传统写法可能是year 2024 if year % 4 0: if year % 100 0: if year % 400 0: is_leap True else: is_leap False else: is_leap True else: is_leap False这种嵌套虽然对但很绕。闰年的规则可以合并成语能被400整除或者能被4整除但不能被100整除。改成简单条件结构if (year % 400 0) or (year % 4 0 and year % 100 ! 0): is_leap True else: is_leap False一下就清爽了。如果是在函数里还可以这样写def is_leap_year(year): if year % 400 0: return True if year % 4 0 and year % 100 ! 0: return True return False这就是卫语句条件不满足就继续往下走满足就直接返回省掉很多else。写条件结构时我会优先想着“怎么让主要路径平铺”而不是动不动就套一层if。3.3 条件表达式中的“隐形坑”条件判断的不止是比较运算的结果Python中的任何对象都能在布尔上下文里被求值。这个规则是数值0、空字符串、空列表[]、空元组()、空字典{}、None、以及False本身都会被当作“假”其他值都当作“真”。所以很多Python老手会直接写if user_list: # 列表非空才执行这比if len(user_list) 0:更简洁也完全正确。但新手很容易被“明明打印出来是[ ]为什么就是不进这个分支”这种问题卡住。其实原因就是空列表在布尔上下文里是False。另一个常见的坑是混淆赋值和相等判断。Python语法不允许if x 5这种写法它会在编译时报SyntaxError这点还算友好。但在输入时容易漏写一个等号把错打成。一旦出现这种错误优先检查if那一行是不是写成赋值了。此外条件结构里的缩进需要非常敏感。Python用缩进划分代码块同一个块内的缩进必须一致混用空格和Tab会导致IndentationError。我建议代码编辑器里统一把Tab键替换成4个空格并开启“显示空格”功能这样缩进问题一眼就能看到。4. 实战用运算符和条件结构实现一个简易的AI学习状态评分助手4.1 需求拆解讲到这里光看语法肯定不行。我结合AI场景设计了一个很小的练习题模拟一个“AI学习状态评分助手”。假设你是一个在线教育助教每天要处理一批学生的学习数据每个学生有三个指标今日学习时长分钟、今日练习题数、今日平均错误率百分数。我们要根据这三个指标计算出综合评分并给出学习建议。这个需求天然用到了算术运算符加权求和、比较运算符阈值判断和条件结构分类建议很适合当课后的综合练习。同时它非常贴近AI数据清洗的思路拿到原始数据提取特征根据规则打标签。我们要实现的就是一个最简单的规则引擎。4.2 一步一步写代码及解析先写一个基础版本刻意把流程拆得细一点# 输入数据 study_minutes float(input(请输入今日学习时长分钟)) exercise_count int(input(请输入今日练习题数)) error_rate float(input(请输入今日平均错误率百分数例如12.5)) # 用算术运算计算综合评分 # 权重时长0.5、题量0.3、错误率惩罚0.2 # 把错误率转换为正向得分错误率越低越好这里用100 - error_rate duration_score study_minutes * 0.5 exercise_score exercise_count * 0.3 error_score (100 - error_rate) * 0.2 total_score duration_score exercise_score error_score # 条件结构根据总分给出评价 if total_score 85: level 优秀 elif total_score 70: level 良好 elif total_score 60: level 及格边缘 else: level 需要加油 # 用逻辑运算符补充一个特殊建议 if study_minutes 30 and error_rate 30: advice 今天学习时间太短错误率偏高建议明天先复习再做新题。 elif study_minutes 120 and exercise_count 10: advice 状态很好保持这个节奏 else: advice 按计划继续学习即可。 # 输出结果 print(f综合评分{total_score:.2f}) print(f评价等级{level}) print(f建议{advice})这里面有几个值得说的细节。第一input()返回的是字符串必须用float()或int()转成数值否则study_minutes * 0.5会导致字符串重复比如90 * 0.5直接报错。第二total_score是浮点数用f-string里的:.2f保留两位小数这是格式化输出的常见操作用算数运算对数字做舍入展示。第三逻辑运算符and保证了两个条件同时成立才会触发对应的建议这里建议加上括号比如(study_minutes 30) and (error_rate 30)逻辑更清晰。运行一下输入90、8、15计算得到90*0.5458*0.32.4(100-15)*0.217总分64.4输出“及格边缘”建议走最后一条。逻辑没毛病。这个例子虽然简单但它把运算符和条件结构全部串起来了。4.3 对初学者的3个提醒写完这个实战我再啰嗦三点都是我自己上课时看学生最容易出问题的地方。第一转化输入。input()永远返回字符串忘记转换是新手第一坑。而且字符串和整数做比较时Python3会直接报TypeError这其实是好事逼着你早发现。第二条件覆盖顺序。我见过有人先写elif total_score 60再写elif total_score 85结果85分的同学永远命中的是“及格边缘”因为第一个条件已经满足了。条件判断的先后顺序一定要从大到小或者从小到大排列清楚并确保边界值不会重复。第三别迷信权重公式。这里权重是我拍脑袋定的实际AI系统里权重要靠大量数据训练出来。但作为练习理解‘用算术运算把多指标合并成一个分数’这个思路就够了。5. 踩坑经验与后续学习建议5.1 本次课后的常见问题速查表我把这次课最容易踩的坑整理成一张表方便你贴到电脑前面现象根本原因正确做法7 / 2得到3而不是2.5记混了/和//浮点除法用/整除用//-7 // 2结果是-4整除是向下取整用整数除法理解-4 * 2 1 -70.1 0.2 0.3为False浮点数精度误差使用abs(a-b) 1e-9比较a 1000; b 1000; a b为True但a is b可能为Falseis比较对象身份值比较用None判断用isif 0:不执行0在布尔上下文为假了解真值表0/空序列/None为假if x 5:报语法错误把赋值当判断相等判断用and和or返回值不是布尔值短路求值返回对象本身理解短路逻辑别误以为返回True/False这张表里的问题基本覆盖了新手第一次接触运算符和条件结构时80%的报错点。建议你把每一条都在Python交互环境里跑一遍亲眼看看结果印象会深得多。5.2 给新手的练习方法运算符和条件结构的核心是“手熟”没有太多捷径。我的建议是每天花15分钟做两个小练习一是写一个简单计算器支持加减乘除、取余、幂运算输入两个数字和运算符输出结果二是写一个“登录验证”小脚本预设一个用户名和密码让用户输入用和and判断是否正确并给出不同提示。这两个练习练下来算术、比较、逻辑、条件结构就齐了。练习时不要怕报错报错是好事。看到TypeError就去检查类型看到SyntaxError就去检查缩进和标点。每一行代码最好都能在心里预测它输出什么再实际运行验证。如果预测错了说明那个知识点还没掌握停下来搞清楚再继续比闷头刷一百道题都管用。5.3 下一步可以连着学什么这次课掌握的运算符和条件结构是下一课“循环结构”的直接基础。比如for循环里经常要判断元素是否满足条件while循环里常用比较运算控制退出这些都需要今天的内容打底。学完循环之后再配合列表、字典就能写出非常实用的数据处理脚本了。后面还有很多有趣的课题比如列表推导式里其实也藏着运算符和条件判断的影子再往深走还有函数、装饰器、面向对象。Python基础学到现在你已经具备了“把想法变成代码”的最基本能力。接下来就是多写、多用、多踩坑把今天这张速查表上的内容彻底变成自己的肌肉记忆。我个人在带新人的时候从来不会因为运算符简单就跳过。恰恰是这些基础细节决定了一个人后面看框架源码、写AI代码时能走多远。如果你今天把这篇里的示例都亲手跑了一遍并且能闭着眼睛解释清楚and的短路逻辑和elif的执行顺序那这节课就已经达标了。下一篇我们进循环到时候再见。