资讯动态

Python控制语句详解:条件判断与循环入门指南

发布时间:2026/10/7 4:27:43 来源:尧图企业网站定制
刚学编程的人常问我一个问题代码是一行行往下跑的那它怎么知道什么时候该停下来、什么时候该换个方向答案就在程序控制语句里。Python里的控制语句主要就三类——条件判断if/elif/else、循环for/while再加上几个辅助控制词break/continue/pass。它们是程序“长脑子”的关键也是零基础阶段必须啃透的第一块硬骨头。这篇内容里我会把这三类控制语句从原理到实操拆开讲配合完整可跑的代码示例和常见的坑适合刚装好Python、想把基础打扎实的初学者。1. 条件判断if/elif/else让程序学会“看情况办事”1.1 为什么代码需要“长脑子”程序本质上是在执行你下达的指令但如果所有指令都从上到下直直地执行程序就像一个只会按顺序做事的机器人——你让它做什么它就做什么哪怕条件已经变了它也不管。真实场景里我们希望程序能“看情况办事”比如用户输入的年龄小于18就打儿童价大于等于18就打成人价考试成绩及格就输出“通过”不及格就输出“下次加油”。这种“在不同条件下执行不同代码”的能力就是条件判断。条件判断在Python里的写法非常接近自然语言核心是一个表达式——布尔表达式。布尔表达式的结果只有两种True真或False假。if后面跟的就是这个布尔表达式为True就执行if分支里面的代码为False就跳过或走其他分支。这个逻辑想通了后面所有控制语句都会顺畅很多。1.2 布尔表达式是判断的基石布尔表达式主要由比较运算符和逻辑运算符组合而成。比较运算符就是数学里的等于、大于、小于只是写法上有些区别运算符含义示例结果等于3 3True!不等于3 ! 4True大于5 2True小于5 2False大于等于5 5True小于等于4 3False组合多个条件时使用逻辑运算符and、or、not。and要求两边都是True结果才为Trueor只要一边是True结果就为Truenot则是取反。比如判断一个数是否在合理区间内可以写成if score 0 and score 100:语义就是“分数在0到100之间”。这里有个新手常犯的错把score 0 and score 100错写成了0 score 100以外的东西其实Python支持0 score 100这种连续写法但别把数学里的0 score 100和逻辑运算符弄混——两种写法在Python里都合法看个人习惯。1.3 完整语法与第一次实战成绩等级判断条件判断的基本结构是if 条件: 执行语句A elif 其他条件: 执行语句B else: 执行语句C重点来了Python用缩进表示代码块而不是像C语言或Java那样用花括号{}。if下面的语句必须统一缩进通常是一个Tab键或4个空格这决定了哪些代码属于这个分支。缩进一旦混乱程序要么报IndentationError要么执行逻辑完全不对。下面是一个完整例子根据分数判断等级。你在自己的IDE里跑一下改变score的值观察程序走向score 85 if score 90: print(优秀) elif score 80: print(良好) elif score 60: print(及格) else: print(不及格)执行到elif score 80时前面的score 90为False继续判断85 80为True所以输出“良好”。注意elif的顺序很重要如果把score 60放在score 80前面那85分就会先命中“及格”结果就错了。条件从上到下要把范围更精确的写在前面。1.4 嵌套判断与缩进陷阱判断语句里还可以再套判断这就是嵌套。比如既要判断是否及格还要判断成绩是否缺考score -1 if score 0: if score 60: print(及格) else: print(不及格) else: print(成绩录入有误)嵌套让逻辑层次变深但代价是代码可读性下降。我的建议是嵌套最好控制在两层以内再复杂就考虑用逻辑运算符把条件合并。比如上面可以改写成if score 0 and score 60:不过这样语义没那么清楚有时候拆开写反而更好维护。缩进是新手最容易翻车的地方。我之前带过不少同事他们写的代码逻辑看起来完全没错但就是跑不起来十有八九是缩进问题——要么if下面没缩进要么混用了Tabs键和空格。Python官方推荐用4个空格但关键是一份代码里不要混用。你在VSCode或PyCharm里如果看到红波浪线多半就是缩进或语法解析出了问题先把编辑器右下角Tab Size设置成4然后养成“按Tab键缩进别手动敲空格”的习惯。2. for循环把“重复劳动”打包交给电脑2.1 range()生成的数字序列判断解决的是“走哪条路”循环解决的是“同一件事重复做N遍”。拿打印1到10来说写10行print太蠢了循环写一遍就行for i in range(10): print(i)你可能会注意输出的结果是0到9而不是1到10。这正是新手最容易懵的地方。Python里range(10)表示从0开始生成0, 1, 2, ..., 9总共10个数最后一个数不包含。想要1到10得写成range(1, 11)。这种“取头不取尾”的设计在Python里非常普遍不止range后面讲列表切片时还会遇到一次记住受益终身。range还可以指定步长三步一跳for i in range(1, 10, 2): print(i)这段输出1、3、5、7、9。写循环时经常要用这个技巧来取奇数或偶数序列。2.2 遍历才是for的日常主场虽然用range控制“循环次数”很常见但Python的for循环真正的拿手好戏是遍历可迭代对象——列表、字符串、元组、字典、集合都能一个个取出来。你可以把可迭代对象想象成一条队伍for循环就是一个点名的人从队头走到队尾挨个念名字。names [小明, 小红, 小刚] for name in names: print(f{name}欢迎参加活动)输出三行欢迎语。遍历字符串时每个字符都会被取出来word Python for ch in word: print(ch)这里输出P、y、t、h、o、n六行。除了列表和字符串字典的遍历也很常用默认遍历的是键keyuser {name: 阿光, age: 18} for key in user: print(key, user[key])如果想把键和值同时拿过来可以直接写for key, value in user.items():这个等学到字典时再深入。2.3 for与if组合数据筛选循环单独用只能做“重复动作”一旦和条件判断组合起来程序的“聪明度”就上来了。最常见的场景就是数据筛选给你一个列表把满足条件的元素挑出来。numbers [12, 5, 8, 3, 17, 6, 20] even_numbers [] for num in numbers: if num % 2 0: even_numbers.append(num) print(even_numbers)这段代码找出所有偶数。num % 2 0是判断偶数最经典的写法一个数能被2整除就是偶数。循环负责逐个访问if负责筛选逻辑清晰直白。你在处理Excel导出数据、爬虫抓回来的列表时这种“循环判断”的组合是天天都在用的。2.4 一个练手任务自动整理购物清单把学到的for、if、range串起来做一个模拟购物金额统计。规则有5件商品售价记录在列表里超过50元的打九折最后打印每件商品实际应付金额和总价。prices [45, 68, 12, 99, 30] total 0 for index in range(len(prices)): price prices[index] if price 50: final_price price * 0.9 else: final_price price print(f商品{index 1}原价{price}元应付{final_price}元) total final_price print(f总价{total}元)range(len(prices))生成索引0到4然后靠prices[index]取原始价格。这里我用了“根据索引循环”而不是直接遍历列表原因是需要在打印时知道商品的序号。实际项目里这种需求用enumerate(prices)更优雅会让你同时拿到索引和值for index, price in enumerate(prices): ...两种写法结果一样零基础阶段先用range练手理解原理之后再过渡到enumerate。3. while循环与三大“刹车键”break、continue、pass3.1 while和for到底怎么挑for循环擅长“我知道要循环多少次”比如遍历一个确定长度的列表。但很多场景下循环次数事先不知道只直到一个终止条件——比如不断让用户输入直到输入正确为止。这时就该用while循环。while的写法while 条件: 执行语句只要条件为True里面的代码就会一遍遍执行。条件在每轮循环开始时重新判断。一个最简单的例子倒计时发射。count 5 while count 0: print(count) count - 1 print(发射)注意count - 1这行千万不能少它的作用是让条件逐渐趋近于False。少了它count永远大于0循环永不停歇——这就是所谓的“死循环”。3.2 break/continue/pass三兄弟分工除了循环条件本身Python给了三个辅助控制词它们的作用经常有初学者搞混控制词作用什么时候用break立刻结束整个循环找到了想要的结果不再继续continue跳过本轮剩余代码直接进入下一轮当前元素不符合要求但后面还得继续pass什么都不做占个位置语法上需要语句但逻辑上暂时没内容拿个具体例子理解。假设你从1开始逐个判断找到一个能被7整除的数就停下来num 1 while True: if num % 7 0: print(f找到了{num}) break num 1这里while True是故意构造的一个死循环配合break才能跳出。这种写法的场景是循环条件不容易反推干脆先无限循环在循环体里用if判断何时结束。continue则相反它不是跳出循环而是跳过“当前这一轮”的剩余部分。比如只打印1到10之间的奇数for i in range(1, 11): if i % 2 0: continue print(i)当i是偶数时continue直接跳过了后面的print进入下一轮。这个效果其实也可以用if i % 2 1:条件打印来实现但continue在处理“多步循环中某个分支需要提前结束”时会很顺手。pass最简单就是个“空语句”。if x 0:下面不写任何代码会报语法错误但你暂时没想好要干嘛就可以先写个pass占位程序能正常运行回头再补逻辑。3.3 输入验证例子与防死循环的经验while一个非常实用的场景是输入验证——让用户反复输入直到数据合法。比如模拟登录系统密码错误就重新输入password 123456 guess while guess ! password: guess input(请输入密码) print(登录成功)运行起来后程序会一直等你输入直到你输入123456才结束。这里就有一个小坑guess ! password这样的字符串比较是初学者练习while时最容易犯错误的是把等式比较的运算符!写错或漏掉了重新赋值的语句。输入验证这段逻辑是以后做命令行工具、交互式脚本的标配。关于防死循环我个人的实操经验有三条看到while第一件事就是问自己循环体里哪个变量在变化这个变化能不能让条件最终变成False不确定时先在循环体里加一行print打印关键变量的值观察它是否朝预期方向变化。部署到服务器或运行耗时任务时可以加一个循环上限或超时机制避免程序卡死不退出。这也是一个进阶的防御式编程习惯。4. 综合实战猜数字游戏把控制语句全部串一遍4.1 设计思路需求拆解学了条件判断、for、while不做个综合项目很难真正消化。猜数字是个特别合适的练手项目——它短、有意思而且把本节所有知识点都用上了。需求拆解一下程序随机生成一个1到100之间的整数。用户输入猜测的数字。猜大了提示“太大了”猜小了提示“太小了”猜对了输出“恭喜”。只有10次机会次数用完游戏结束。输入非数字时不崩溃提示重新输入。这个需求需要用到random模块random.randint(1, 100)生成随机整数。整个逻辑是“循环一直猜直到猜对或次数耗尽”天然适合while break的组合。4.2 完整代码与运行效果import random answer random.randint(1, 100) chances 10 print(猜数字游戏开始范围是1到100你只有10次机会。) while chances 0: text input(请输入你猜的数字) if not text.isdigit(): print(你输入的不是数字请重新输入。) continue guess int(text) if guess answer: print(恭喜猜对了) break elif guess answer: print(太小了再往大了猜。) else: print(太大了再往小了猜。) chances - 1 if chances 0: print(f机会用完了正确答案是{answer}下次加油)text.isdigit()用来判断字符串是否完全由数字组成这是防止用户输入abc导致int()转换崩溃的常用手段。注意循环里用continue保证了“输入非数字”时不消耗机会因为continue会跳到while下一轮chances没减少。而猜错时chances - 1正常扣次数。这段代码跑起来你能完整感受if、else、while、break、continue在真实程序里的协作过程。你能看到程序不再是一根筋地从头跑到尾而是根据你的输入实时切换行为——这就是“让代码变聪明”最直接的体感。4.3 游戏改进方向两则猜数字跑通后你可以试着往这几个方向改一改每改一处都会强迫你加深对控制语句的理解增加“记录历史输入”的功能用一个空列表把每次猜的数字append进去游戏结束时把列表打出来。这能练习“循环内积累数据”的思维。改成“猜单词”版本准备一个单词列表随机抽一个然后让用户逐个猜字母、显示遮盖的单词。这会用到字符串遍历、字母判断和字符拼接复杂度刚好进阶。把次数限制去掉改成统计“猜了多少次”最后按次数打印评语。这会用到循环计数变量。我个人特别推荐第一个方向因为“循环内积累数据”是从控制语句过渡到数据处理的必经之路。大多数人学Python前期最大的问题不是语法不熟而是不知道循环里能做什么——猜数字游戏会让你在几分钟内产生几十种“原来这里可以放一段逻辑”的想法。5. 零基础阶段最容易踩的四个坑附调试思路5.1 缩进错误看着像代码其实不合法Python的缩进不是风格问题而是语法问题。它用缩进划分代码块所以在if、for、while、def定义函数后面下一行必须缩进。常见的报错是IndentationError: expected an indented block意思是“这里该缩进但你没缩进”。还有种更隐蔽的情况代码能跑但结果不对。比如if True: print(第一行) print(第二行) if True: print(第一行) print(第二行)上面两段代码第一段的两个print都属于if分支第二段只有第一个print属于if分支第二个print在if之外、会无条件执行。缩进不同程序逻辑完全改变。排查这种问题最有效的方法是打开编辑器里的“显示空格和制表符”功能或使用Python的python -m tabnanny命令检查缩进一致性问题。5.2 input()返回的是字符串别直接比大小这是条件判断结合input()时新手踩得最频繁的坑。age input(请输入年龄) if age 18: print(成年)这段代码在Python 3里会直接报错TypeError: not supported between instances of str and int。原因很简单input()永远返回字符串即使你输入的是数字它也只是字符串18不是数字18。把字符串和整数比大小Python不允许。解决方案是显式转换age int(input(请输入年龄)) if age 18: print(成年)但如果用户输入abcint()又会报ValueError。稳妥做法是像猜数字游戏里那样先isdigit()判断再转换。控制语句的练习阶段就养成“先验证、后转换”的习惯以后写爬虫、写数据处理脚本时会少很多崩溃问题。5.3 range的“顾头不顾尾”边界range(1, 10)生成1到9不包含10range(len(list))生成0到len-1的索引。这是Python的惯例很多新手一开始都会问“为什么不是10”。原因在于Python遵循半开区间设计即左闭右开这种设计在计算长度为10的序列时非常方便——range(len(seq))的结束值直接等于len(seq)不用减1同时range(0, n)恰好生成n个元素。但代价是你必须在脑子里时刻想着边界。练习时可以打印验证list(range(1, 10))输出什么看清楚再编逻辑。有个口诀帮你记写range(1, 10)就当“从一开始到10以前”。所有取切片、取子串的场景都遵循同一个规则融会贯通就不容易错了。5.4 死循环与print调试法死循环是所有循环初学者的噩梦。最常见的原因有两个忘记更新循环变量或者更新方向把条件越推越远。i 1 while i 0: i 1这个循环永远不会停。条件是i 0i却一直变大越来越满足条件。其实你想的可能是while i 10但写成了大于。遇到程序卡死不退出我的建议是先在循环体内第一行加print(变量名)看看变量到底在怎么变化输出几次大概率就能定位问题。很多老手排查循环问题也不靠脑子硬想而是靠print把每一轮的状态打出来。跑完删掉调试print就行。除了printPython的breakpoint()内置函数可以进入pdb调试器但零基础阶段用好print就够了。定位到问题变量后再去修正条件或变量更新语句基本上没有解决不了的死循环。最后分享一点我的体会控制语句是Python里最“无聊”却最“值钱”的知识点。它的语法半小时就能讲完但真正的掌握标志是——你看任何一段代码都能下意识地画出它的分支和循环路径。达到这个状态没有捷径就是把if、for、while一个个组合起来写小项目。猜数字游戏跑通后再试着给程序加个“再玩一局”的循环提示用户输入y或n你会发现while里套while也不难了。控制语句就是这样看着简单用熟了之后你写出来的程序才真正开始具备逻辑复杂度。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑