这次课是AI方向零基础班Python3基础系列的第二次正式配套练习主题锁定在运算符与条件结构。说实话这两块内容单拎出来每个点都不难但组合在一起初学者最容易踩坑的地方几乎全在这。很多同学上课听懂了、示例也看得懂一到自己动手写就卡壳问题往往出在优先级搞混、条件分支的顺序不对、或者和还分不清理。今天这套练习题就是专门针对这些问题设计的一共十道热度从低到高全部手敲过、带学员跑过适合零基础巩固语法也适合刚学完Python但基础不牢的读者拿来查漏补缺。1. 为什么这组练习题这样设计1.1 知识点在Python基础里的位置运算符和条件结构是Python里“计算”和“决策”的骨架。运算符解决的是“怎么算”条件结构解决的是“怎么选”。如果把这个基础打不牢后面学循环、列表推导式、函数封装甚至做AI相关的数据处理都会回来翻车。我上课时反复强调一句话你可以暂时不背框架但运算符优先级和if条件分支是绕不过去的基本功。这里“基本功”具体对应三件事一是能准确写出混合运算的表达式并推算结果二是能读懂逻辑运算符的短路行为和返回值三是面对一个多分支场景能用条件结构写出逻辑清晰、边界安全的代码。这套练习完全按这个标准来设计不是随便出几道题凑数。1.2 题目设计的三个递进层次我把这十道题分成三个层级热身题先扫平算术运算的细节包含幂运算方向、整除和取余的区别、数字拆位这三个高频考点进阶题集中处理赋值、比较、逻辑、三目和位运算重点考察“运算符的返回值到底是谁”实战题则用成绩判断、闰年判断、石头剪刀布三个场景把条件结构的分支顺序和嵌套逻辑练扎实。题目之间是有意做了难度衔接的比如第5题连续比较和第6题短路求值前一天学的是、这样的比较后一天突然发现逻辑运算返回的不一定是布尔值这个跨度很多人会懵。所以我把这些点放在相邻的练习题组里让学员边做题边完成思维切换。1.3 每道题都挖了“坑”我刻意在部分题目里埋了容易误判的写法比如幂运算符的右结合、负数取余、and和or的返回值。学员如果只在REPL里跑一下不看原理很容易把错误结论记住。所以每道题后面我会给参考实现和完整解析重点说明“为什么是这个结果”而不只是给出正确答案了事。2. 热身题先搞定算术运算的三层细节2.1 第一题幂运算符的结合方向题目直接说出下面代码的输出结果不要运行先自己推算。print(2 ** 3 ** 2) print((2 ** 3) ** 2)大多数同学第一次看到这个题目会下意识认为幂运算跟加减乘除一样按从左到右算于是两行结果都写成64。实际上Python里的**是右结合运算也就是说2 ** 3 ** 2等价于2 ** (3 ** 2)先计算指数部分3 ** 2 9再计算2 ** 9 512。而加了括号的第二行才是(2 ** 3) ** 2 8 ** 2 64。这个点为什么值得单独出题因为幂运算的右结合在官方文档里是“反常规”的很多教辅资料一句话带过学生根本没印象。我见过有学员在写方程、算复利、处理指数衰减场景时因为这里少括号结果差了十万八千里。我的建议是凡是幂运算套幂运算一律用括号把意图写死别依赖记忆。2.2 第二题除法、整除、取余到底怎么选题目用一个身高换算场景输入厘米数输出“x米x厘米”。total_cm 178 meters total_cm // 100 cm total_cm % 100 print(f{meters}米{cm}厘米)这道题把三条常用算术运算符一次练全了。/是浮点除法只管除//是地板除结果向下取整数%是取余得到除法后的余数。很多人学完三个符号平时写代码却只会用/一到实际换算出问题。像这里用身高换算就很典型178厘米除以100得到1.78米但题目要的是“1米78厘米”所以必须用整除拿整数部分用取余拿剩余部分。易错点我还要单独讲一句负数参与整除和取余时的规则跟C语言不一样。在Python里-7 // 2的结果是-4因为地板除是“向下取整”-3.5向下取整就是-4而不是向零截断的-3。配合取余来看-7 % 2结果是1因为Python保证a (a // b) * b a % b这个等式恒成立即-7 (-4) * 2 1。这个点我放在热身题里当附加思考不强求零基础一次全懂但至少要知道有这回事。2.3 第三题取余和整除组合取数字的每一位题目输入一个三位数打印它的百位、十位、个位数字。num 456 hundreds num // 100 tens num // 10 % 10 ones num % 10 print(hundreds, tens, ones)这题是2.2的升级应用也是面试题里经常出现的“拆数字”基础。核心思路想拿高位就整除想拿低位就取余。拿十位时先整除10把个位“挤掉”再取余10把剩下高位的中间数抠出来即num // 10 % 10。有些同学会写成num % 100 // 10顺序反一下也完全正确先取余100得到后两位再整除10得到十位。两种写法站在运算优先级上看都是先乘除后加减、从左到右执行。练习这道题时我建议顺手用divmod()验证一下divmod(num, 100)会返回百位以上的部分和剩下的后两位能更直观理解取余和整除的分工。这里我不展开太多重点是让学员体会“运算符只是工具组合起来才能解决实际问题”。3. 进阶题赋值、比较与逻辑运算的思维切换3.1 第四题链式赋值与复合赋值题目用一行代码把三个变量赋成相同值再用复合赋值运算符完成累加。a b c 10 a 5 b - 3 c * 2 print(a, b, c)这道题要区分两个概念链式赋值和复合赋值。链式赋值a b c 10在Python里是合法写法本质是把同一个整型对象10同时绑定给三个名字适合初始化多个变量。复合赋值、-、*是简写但要注意它内部执行的其实是“读出原值、做运算、写回新值”。有个细节我想特别提一下对列表这类可变类型来说lst [4]和lst lst [4]有本质区别前者是调用__iadd__就地修改后者是新建列表再重新绑定。这个点零基础阶段可以先不深究但一旦开始写函数、传引用就会踩到。当时的练习题我先用整数例子让学员掌握语法后续讲到可变对象时再回来看这个坑。还有一个经典错误不少学员会写成a 5这是把的符号顺序记反了语法不报错但含义变成“a等于正5”完全不相关。这类问题出现在平时作业里很频繁所以我把它列进这组练习的附加题让大家自己试一试a 5和a -5的实际效果。3.2 第五题连续比较与隐式and连接题目判断一个变量是否在某个区间内比如判断x 15是否在10到20之间。x 15 if 10 x 20: print(在区间内) else: print(不在区间内)Python支持连续比较10 x 20等价于点10 x and x 20而且x这个变量在整个表达式中只会被求值一次。这个设计在阅读上比x 10 and x 20更直观很多初学其他语言的人会惊讶Python居然允许这么写。我在这组题后面加了一个衍生问题字符串也可以比较大小abc abd为True因为逐字符按Unicode码点比较。这种“比较运算不光能比数字”的认知对后续处理文本数据非常重要。延伸思考题我还放了一个容易混淆的知识点比较的是值is比较的是对象身份。零基础阶段不必深入驻留但至少要记住1 1.0为True而1 is 1.0不一定为True。这也是逻辑运算旁边的经典考点。3.3 第六题逻辑运算符的短路规则与返回值题目预测下面的输出。print(0 and 10) print(1 or 10) print(5 3 and 5)这题几乎是本组练习的“分水岭”。大量学员会认为and和or最终结果一定是布尔值于是第一行猜False第二行猜True。实际上Python逻辑运算符遵循短路求值并且返回的是决定结果的那个操作数不强制转成布尔类型。具体来说and从左往右评估如果左侧为假整个表达式必为假直接返回左侧值如果左侧为真继续评估右侧返回右侧值。所以0 and 10返回05 3 and 5返回5。or则相反左侧为真时直接返回左侧值左侧为假才返回右侧值所以1 or 10返回1。我出这道题的目的不是为难人而是告诉学员一个实战经验短路求值是可以当if简化条件用的。比如写name input(输入名字) or 匿名用户如果输入为空字符串假值or会自动取右侧的默认值。这个小技巧在配置项、默认参数、表单处理里非常常用。运算符返回值不一定是布尔这一点是迈向“Pythonic写法”的第一级台阶。3.4 第七题三目运算符的嵌套与可读性题目输入两个数输出较大值再加一个数输出三个数中的最大值。a, b, c 5, 12, 8 max_two a if a b else b print(两个数中的最大值:, max_two) max_three a if a b and a c else (b if b c else c) print(三个数中的最大值:, max_three)三目运算符写法是真值 if 条件 else 假值跟C语言条件 ? 真值 : 假值的顺序不一样这个一定要适应。第一行求两个数最大值很直白大多数人都能写对。第二行求三个数最大值就开始有人绕晕了核心是嵌套先判断a是否是最大的如果不是问题就缩小成“在b和c里挑最大”于是内层再套一个三目。从教学上看我更推荐学员用清晰优先的写法先定义一个函数来求最大值或者干脆用max()内建函数。但练习题里故意要求用三目实现是为了让大家体会“表达式是有值的可以作为另一个表达式的一部分”。如果看不懂这种嵌套完全可以拆开写可读性永远是第一位的。能写出复杂嵌套值得鼓励但生产环境里别这么干维护成本太高。3.5 第八题位运算的几个反直觉结果题目说出5 3、5 | 3、5 ^ 3、~5的结果。print(5 3) # 1 print(5 | 3) # 7 print(5 ^ 3) # 6 print(~5) # -6位运算平时用得不算多但处理权限标记、状态位、二进制协议时绕不开。5的二进制是1013的二进制是011。按位与只有两个位同时为1才为1所以101与011逐位计算得到001即1。按位或|只要有一个为1即1得到111即7。按位异或^相同为0、不同为1101异或011得到110即6。最反直觉的是~5很多学员以为结果是一5。实际上按位取反会把符号位也一起取反Python里~x恒等于-x - 1所以~5 -6。这个公式记下来比反复推导更快。如果你有兴趣可以用bin()函数去观察这些整数的二进制表示把5 3的过程逐步印出来理解。4. 条件结构实战多分支与嵌套怎么写不翻车4.1 第九题成绩等级判断——多分支顺序不能乱题目输入成绩输出等级90分及以上为A80到89为B70到79为C60到69为D60分以下为E。score int(input(请输入成绩: )) if score 90: grade A elif score 80: grade B elif score 70: grade C elif score 60: grade D else: grade E print(等级:, grade)这道题考的是if/elif/else的执行顺序。很多学员会写出下面这种代码if 90 score 100: grade A elif 80 score 90: grade B elif 70 score 80: grade C elif 60 score 70: grade D else: grade E这种写法也没错但非常啰嗦。因为elif天然表示“前面的条件已经不满足了”所以判断完 90之后走到下一个分支的一定是小于90的值根本不需要再重复一个 90。多用这种“连续排除”的思路代码会更简洁也能避免因为区间边界漏掉分数。这题最大的坑其实在数据输入input()返回的是字符串你必须用int()转成整数再比较否则字符串和数字比较会在Python3里直接报错。我特意把这行写在参考代码里就是提醒学员在真实项目里输入边界问题最常见的就在这里。附加一个边界思考如果输入101分按上面的代码会判定为A这在逻辑上是不合理的。实际项目里通常要再检查一下分数是不是在0到100之间。这一层“合法性校验”也是条件结构的经典场景我建议学员自己尝试补上这个判断。4.2 第十题闰年判断——嵌套条件与逻辑组合题目判断某一年是否为闰年规则是“能被4整除但不能被100整除或者能被400整除”。year 2000 if (year % 4 0 and year % 100 ! 0) or year % 400 0: print(year, 是闰年) else: print(year, 不是闰年)这题把所有算术运算符和逻辑运算符一次性结合起来。判断结果的表达式整体是一个or左侧是“普通闰年”的条件能被4整除且不能被100整除右侧是“世纪闰年”的条件能被400整除。由于and的优先级高于or所以不加括号也能正确执行但我推荐始终用括号把优先级写明白。练习这道题最好的办法是拿几个年份验证2000是闰年1900不是闰年2400是闰年2016是闰年。这里有个隐藏考点很多人只记“4年一闰”忘了“逢百年不闰”的修正以及“逢四百年再闰”的修正。用代码表达这个规则实际上是在训练把自然语言规则翻译成逻辑表达式的精度。这个能力在AI、规则引擎、数据清洗里都很重要。4.3 第十一题石头剪刀布小游戏——随机数与条件判断联动题目程序随机出一个石头、剪刀或布玩家输入自己的选择判断胜负。import random options [石头, 剪刀, 布] computer random.randint(0, 2) player int(input(请出拳0石头 / 1剪刀 / 2布: )) print(f电脑出:{options[computer]}你出:{options[player]}) if player computer: print(平局) elif (player - computer) % 3 2: print(你赢了) else: print(你输了)这题我给了两种常用解法第一种是上面这个数字映射加模运算的技巧0代表石头、1代表剪刀、2代表布。胜局的情况是玩家出0电脑出1、玩家出1电脑出2、玩家出2电脑出0计算差值会发现(player - computer) % 3恒等于2输局则恒等于1。这个规律靠穷举一遍很容易发现但真正理解它需要能同时接受“胜负是循环关系”这个抽象思路。第二种解法是穷举判断适合逻辑上不擅长模运算的学员if player computer: print(平局) elif (player 0 and computer 1) or (player 1 and computer 2) or (player 2 and computer 0): print(你赢了) else: print(你输了)我上课时鼓励学员先把穷举写法写对再去理解模运算写法。从实战角度讲判断胜负逻辑本身并不复杂复杂的是处理非法输入、控制整个游戏循环。这里我已经用了random.randint如果随机数刚好和玩家输入的值对不上号就会出现数组越界这也成了后续学异常处理的引子。5. 常见问题与排查技巧实录5.1 学员高频报错速查表我整理了这轮练习中学员最常见的几类问题直接做成速查表方便对照排查。错误现象出错代码示例本质原因解决建议SyntaxError: invalid syntax指向附近if a 10:条件判断里用了赋值号而不是比较号改成if a 10:TypeError: not supported between instances of str and intscore 90其中score是input返回的字符串没有把字符串转成整数用int(score)转换后再比较逻辑结果与预期不符if score 60: 及格 elif score 90: 优秀分支顺序反了前面的条件先拦截从高到低排列分支条件数字拆位结果错误tens num % 100没有先整除再取余改成num // 10 % 10三目运算符语法错误x y ? x : y套用了C语言的语法Python写法是x if x y else y这个表我在每次练习后都会发一份给学员。与其让他们在终端里一直对着报错信息发呆不如先知道对应关系再去看报错信息理解速度会快不少。5.2 最容易被忽略的与问题这大概是零基础阶段最经典的问题没有之一。我把这组练习题里所有跟赋值、比较相关的题目串起来看发现一个规律学员写多分支的时候很少在if后面用错反而是在while循环、条件判断嵌套时容易手滑写成单等号。原因很简单单等号表面上看是合法的不会立刻报语法错误只是赋值后返回的值参与了条件判断比如if a 10在Python里会直接语法错但某些在if表达式里强转类型的写法会导致更隐蔽的问题。我的排查建议是当你发现程序没报错但结果奇怪先全项目搜索if .* 这个模式十有八九能找到问题。另外可以用代码编辑器的语法高亮辅助检查等号赋值通常会有一个颜色变化条件判断里的比较符号是另一种颜色。5.3 条件写法上的四个实用建议第一能用elif就不要用嵌套的if。嵌套越多代码缩进越深逻辑越难跟踪。米尔斯的“圈复杂度”概念虽然不要求零基础掌握但记住“分支越少越好”总没错。第二多分支条件尽量按“最严格”到“最宽松”排列或者反过来但一定要保持一致。像成绩等级题从高到低写逻辑清晰如果你从低到高写也能行但每档都要带上限既啰嗦又容易漏。第三边界条件一定要单独想一遍。写 90时问一句“91、90、89分别会走到哪个分支”写x % 100 ! 0时问一句“100、200、400分别是什么结果”。我见过太多学员在边界上差一个等号导致恰好卡在临界值的数据判错。第四条件表达式里用括号把优先级锁死。虽然Python的and优先级高于or但阅读代码的人不一定必背这张表。哪段逻辑复杂就给哪段括号这是给同事和自己省的麻烦。5.4 一套务实的调试手法配合这套练习题我会推荐学员掌握三种调试手段。一是print()大法在关键变量前后打印中间值。比如拆数字题想知道十位怎么算就打印num // 10和num % 10分别是什么。这个手段虽然土但对零基础最有效。二是手动代入法拿具体值人脑模拟代码执行。拿成绩等级题代入95、85、75、65、55各跑一遍看分支会不会落错。写代码和推代码是一体两面的脑袋里能跑起来手上写的正确率才高。三是利用Python交互式环境快速验证单条表达式。遇到(player - computer) % 3不确定直接在交互环境里把0到2的数组全试一遍几秒钟就能确认规律。比闷头读文档快多了。最后分享一点个人体会这套练习我连续给三批零基础学员用过每次跑下来最深的感受是把运算符和条件结构练透比多讲十个语法点有用得多。很多学员第一反应是“题目太少还想多练”实际上把十道题里每一道都研究明白包括所有变形和易错点就已经把这一阶段80%的重难点覆盖了。我自己在带班时还会额外加一两个小测验专门考and/or的返回值和分支顺序每次都能筛出一大批“以为自己懂了实际还没懂”的人。如果你也是自学的Python建议别急着往下翻章节先亲手把今天的代码全部跑一遍再想想每个结果背后的原因。慢才是这一章最快的学法。