首页/新闻资讯/正文详情

Python流程控制入门:if条件判断与for/while循环详解

发布时间:2026/9/24 22:31:51 来源:云帆数科 栏目:资讯中心
Python流程控制入门:if条件判断与for/while循环详解
1. 从写代码到写“会思考”的代码Python流程控制是你说服电脑帮你干活的关键一步。前两课我们把变量、数据类型、输入输出这些“零部件”都装好了但光有这些代码只能从上往下一条线走到底遇到要判断的情况、要重复做的事就完全傻眼了。第三课的核心任务就是给你装上“if”和“for/while”这两套发动机让程序具备做决定和跑循环的能力。这一课适合刚学完Python基础语法、准备开始写真正有逻辑的小程序的朋友也适合那些能跑通“hello world”但对分支循环一头雾水的入门者。学完之后你至少能独立写出登录重试、成绩评级、猜数字这类包含判断和循环的小工具算是真正迈进“编程思维”的门槛了。我现在带学生的时候发现大多数人在前两课都学得挺顺一到流程控制就开始卡壳。卡壳的原因通常不是语法记不住而是“脑子里没有一个模型”不知道程序在运行的时候是怎么一步步走的。所以这一课我不会只甩语法而是想带着你一起把判断和循环的“运行轨迹”在脑子里跑一遍。2. 条件判断让代码学会做选择2.1 条件判断的书写顺序与执行规则Python里做判断靠的是if、elif、else这组关键字。写法很直白和读英语句子差不多score 76 if score 90: print(优秀) elif score 80: print(良好) elif score 60: print(及格) else: print(不及格)很多人第一次写会以为elif是“else if”的缩写确实如此但容易犯一个错误把条件从上到下都写一遍最后忘了执行顺序的规则。这里要特别注意if判断是从上到下按顺序匹配一旦命中一个分支后面的分支就不再执行了。这就引出流程控制里第一个重要的思维习惯写判断时条件的先后顺序本身就是逻辑的一部分。比如上面这个成绩评级如果我先写elif score 60再写elif score 80那一个考了90分的学生也会被归到“及格”里因为90 60为真后面的分支根本没机会执行。所以条件越“苛刻”的范围越窄的越想放在前面。实际开发中我一般建议把边界情况放在最前面比如判断一个数是正数、负数还是零我习惯先判零if num 0: print(零) elif num 0: print(正数) else: print(负数)这样做的理由是排查问题时边界逻辑最容易被漏看放前面一眼扫到不容易出bug。2.2 条件表达式与布尔运算的细节判断条件本质上就是一个表达式表达式的计算结果要么是True要么是False。Python里有一些容易被忽略的细节这里必须说透。第一比较运算符有、!、、、、其中是判断相等是赋值这个没得商量写错就是灾难。Python还支持链式比较比如if 0 x 100这在数学上一个式子代码里也一个式子非常直观。第二逻辑运算符是and、or、not对应“且”、“或”、“非”。这里有一个坑Python的and和or返回的不一定是布尔值而是参与运算的某个值。比如3 and 5的结果是50 or 5的结果是5。这是因为Python在做逻辑运算时会直接返回“最后一个被评估的表达式”的值这在很多老手的代码里会被用来做默认值赋值name input(请输入姓名) or 匿名用户如果用户直接回车input返回空字符串假值or会返回后面的默认值。新手看到这种写法容易懵但你只要知道规则就行and和or的结果是决定整体真假的最后一个值。第三if后面接的不一定是比较运算任何值都可以直接当条件。Python会把以下情况当作False0、空字符串、空列表[]、空字典{}、None其他值都是True。这个特性特别常用比如判断列表是否为空items [] if not items: print(列表是空的需要处理)这种写法比if len(items) 0简洁得多而且符合阅读直觉。我见过不少同学非要写if len(items) 0功能没错但if not items在Python社区里才是约定俗成的风格。2.3 条件判断的缩进和匹配原则Python没有大括号全靠缩进表示代码块。这里有一个新手最容易踩的坑elif必须和对应的if对齐否则Python会报错或者更可怕的是不报错但逻辑错乱。我建议在编辑器里把缩进统一设置为4个空格不要用Tab。VSCode里默认就是4空格PyCharm也是但如果你从网页复制代码很容易粘进来Tab和空格混用运行时报IndentationError表面上看缩进是对的实际上字符不一样。遇到这个问题在编辑器里把空白字符显示出来VSCode按CtrlShiftP搜索“render whitespace”一眼就能看到哪里混用了。理解缩进匹配的一个实用技巧是先看每一行前面的缩进层级把代码“分层”。缩进相同的行属于同一个代码块缩进加深意味着进入上一个代码块的内部。写if的时候if本身是一层内部语句缩进一次后面的elif和else要和if对齐因为它们属于“同一层分支结构”。3. 循环让重复劳动自动化3.1 for循环的遍历本质如果说if是让代码开窍的关键那for循环就是让代码“勤快”的关键。for循环在Python里的核心思想是遍历——把一组数据挨个取出来依次处理一遍。fruits [苹果, 香蕉, 橙子] for fruit in fruits: print(fruit)执行过程是先从fruits里取出第一个元素“苹果”赋值给变量fruit执行打印然后取第二个、第三个直到取完。这种“取一个、处理一个”的模式就是遍历的本质。最常用的搭档是range()函数。range(5)生成0到4五个整数注意不包含5也就是左闭右开[0, 5)。很多初学者不理解为什么不是0到5这里有个记忆窍门range(n)产生n个数正好对应循环n次如果你要循环10次就写range(10)数对得上没人愿意写range(0, 0)之后又踩一手。range还支持两个参数range(起始, 结束)和三个参数range(起始, 结束, 步长)# 打印1到10的偶数 for i in range(2, 11, 2): print(i)range的“左闭右开”设计和Python的切片list[1:3]保持一致这是Python设计上的一贯风格记这一个原则两个语法都能理顺。实操心得在循环内部循环变量i或者fruit会被反复重新赋值循环体里对它的任何修改不影响下一次循环的取值。比如你在循环里写i i 10下一次遍历还是按顺序取下一个元素这个i的修改只对当前这一次生效。这是新手常犯迷糊的点脑子里一定要建立“每次循环开头变量被重新赋值”的模型。3.2 while循环与退出条件设计while循环解决的是“不知道要循环多少次只知道什么时候该停下来”的场景。语法很简单count 0 while count 3: print(正在重试第, count 1, 次) count 1每次进入循环体之前先判断count 3是否为真为真就执行一次循环体执行完再次回到判断语句。只要条件一直是真循环就永远跑下去。这就引出了while循环的核心难点退出条件的设计。你必须确保在循环体内条件相关的变量会发生改变否则等着你的就是死循环程序卡死只能按CtrlC强制终止。我建议所有初学while的人动手写之前先想清楚三件事退出条件是什么比如“重试次数达到3次”、“输入正确密码”、“队列为空”循环体内哪条语句会让条件向“退出”方向推进循环开始前相关变量的初始值是什么把这三个问题写在注释里再开始写代码几乎不会写出死循环。while还有一个经常搭配的写法是while True循环体内部用break跳出。这种模式适合“先执行、后判断”的场景比如用户输入菜单选项while True: choice input(请输入选项1-3输入0退出) if choice 0: break print(你选择了, choice)这里用while True是因为我们没法在进入循环前先问用户“你这次要不要退出”只能进去之后拿到输入再判断。这是很标准的“先跑起来再说”的模式。3.3 循环里的三个控制关键词break、continue、pass是循环体里的三个小控制键各自职能完全不同。break立即结束整个循环不管后面还有多少元素没遍历。适合“找到目标就收工”的场景比如在列表里找第一个满足条件的数字。continue跳过当前这一次循环直接进入下一次。它不结束整个循环只是“这轮我不干了”。比如打印偶数时遇到奇数就跳过。pass什么都不做只是一个占位符保证语法不报错。写代码时先搭框架、后补逻辑就会用到它。举个例子从1到20里找出第一个能被7整除的数for i in range(1, 21): if i % 7 0: print(找到啦, i) break # 输出找到啦7再比如打印1到10里所有的奇数用continue跳过偶数for i in range(1, 11): if i % 2 0: continue print(i)break和continue的使用频率很高但要注意一点嵌套循环里break只跳出它所在的那一层循环不会跳到外层。这个坑很经典后面第4章的案例里我专门安排了场景来说明。还有一个容易被忽略的知识点for循环和while循环后面可以跟else子句当循环正常结束没有被break中途跳出时会执行else里的代码。这个特性在“找不到目标”的场景里特别好用nums [2, 4, 6, 7, 8] for num in nums: if num % 2 1: print(找到了奇数, num) break else: print(没有奇数)我最早学这个语法也觉得奇怪但实际写的时候发现它比设一个found标志位干净得多。判断循环有没有“成功完成”for...else是最Pythonic的写法。3.4 嵌套循环的场景与注意事项嵌套循环就是循环里面套循环。最常见的场景是处理二维结构比如打印九九乘法表、遍历矩阵、生成坐标对。for i in range(1, 4): for j in range(1, 4): print(f({i}, {j}), end ) print() # 换行这段代码输出三行三列的坐标对。执行顺序是外层取i1内层完整跑一遍j1,2,3然后外层取i2内层再完整跑一遍。内层跑完一整轮外层才走一步。嵌套循环的复杂度是乘法级别的。如果外层循环100次内层循环100次那一共就是10000次。实际写代码时遇到嵌套循环先估算一下总执行次数避免程序跑起来卡顿。这里有一个很多教材不会细讲但面试常问的点在外层循环里做break只能跳出内层想跳出外层一般用状态标志或者把逻辑提取成函数后用return。比如# 找到二维列表里第一个值为0的位置 matrix [[1, 2], [3, 0], [4, 5]] found False for i in range(len(matrix)): for j in range(len(matrix[i])): if matrix[i][j] 0: print(找到0的位置在, i, j) found True break if found: break这个用布尔标志跳出外层循环的写法很经典也是很多考试题和面试题的考点。你要是能把这个逻辑讲清楚说明对嵌套循环的理解就到位了。另外提醒一点嵌套循环的缩进特别容易乱。每嵌套一层代码就多一级缩进层级一多眼睛很容易看花。写的时候建议保持嵌套最多不超过三层超过三层就考虑把内层逻辑拆成函数。4. 实操过程与综合案例4.1 案例一登录重试系统这一个案例把while、if、break、计数逻辑全部串起来。需求很简单用户输入用户名和密码最多允许试3次三次都错就锁定提示。直接上代码correct_user admin correct_pwd 123456 attempt 0 while attempt 3: username input(请输入用户名) password input(请输入密码) if username correct_user and password correct_pwd: print(登录成功欢迎回来) break else: attempt 1 remaining 3 - attempt if remaining 0: print(f用户名或密码错误还有{remaining}次机会) else: print(尝试次数已用完请稍后再试)这个案例值得注意的点有三个第一attempt初始为0每次失败加1while attempt 3保证最多执行3次循环体。如果把attempt加到3之后再次回到判断3 3是假循环退出。这是最直接的“用次数控制循环”的写法。第二登录成功后用break跳出循环不会走完剩余的重试次数。这里如果不用break即使登录成功程序也会继续让用户输入体验会很奇怪。第三失败后显示剩余次数这是通过3 - attempt计算的。这里我用了一个小技巧先自增attempt再计算剩下的次数顺序不能反。这个逻辑虽然简单但初写时很容易把加减顺序弄反建议自己动手改一改看看输出有什么变化加深理解。实操心得如果你希望程序更健壮可以给账号和密码输入的判断分别独立写比如先查用户名是否存在再验证密码涉及真实项目时还要加一个“连续失败5次锁15分钟”的机制这就是在工作场景里常见的简单防爆破策略。4.2 案例二批量处理学生成绩这个案例的目标输入一组学生的成绩计算总分、平均分、最高分、最低分并且统计各分数段人数。先定义一个成绩列表再分别统计scores [88, 72, 95, 60, 47, 83, 76, 91, 58, 69] total 0 max_score scores[0] min_score scores[0] count_pass 0 count_good 0 for score in scores: total score if score max_score: max_score score if score min_score: min_score score if score 90: print(f{score}分优秀) elif score 60: print(f{score}分及格) else: print(f{score}分不及格) count_pass sum(1 for s in scores if s 60) avg total / len(scores) print(f总分{total}) print(f平均分{avg:.1f}) print(f最高分{max_score}) print(f最低分{min_score}) print(f及格人数{count_pass})这里用了很多前两课和这一课的知识点。sum(1 for s in scores if s 60)是一种“生成器表达式”的写法原理是把for循环和条件判断压缩成一行如果你读起来吃力可以先把它展开成普通的for循环。count_pass 0 for s in scores: if s 60: count_pass 1展开之后你会发现这其实就是这一课的核心技能用循环遍历每个元素用条件判断做筛选用一个变量累加结果。所有的数据处理本质都逃不开这个套路。另外求最高分最低分我用了“打擂台”的思路先默认第一个元素是最大的然后遍历剩下的遇到更大的就更新。这个思路在很多算法题里都会用到比直接调用max()和min()更能体现你对流程控制的掌握程度。实际上你可以直接调max(scores)但理解擂台赛的底层逻辑以后再遇到更复杂的数据结构就不会束手无策。4.3 案例三猜数字游戏猜数字是一个很经典的入门练习它要求程序随机生成一个1到100的整数用户输入数字猜程序提示“猜大了”或“猜小了”直到猜中。import random target random.randint(1, 100) guess_count 0 print(我心里想了一个1-100之间的数字你猜猜是多少) while True: guess input(请输入你的猜测) if not guess.isdigit(): print(请输入一个数字) continue guess int(guess) guess_count 1 if guess target: print(猜小了再来) elif guess target: print(猜大了再来) else: print(f恭喜你猜对了一共猜了{guess_count}次) break这个案例里有两个亮点。第一个亮点是输入校验。用户输入的内容不一定是数字可能是“abc”或者直接回车这时候用int(guess)会直接报ValueError崩溃。所以我先用guess.isdigit()判断是不是纯数字不是就提示并continue让用户重新输入。这个技巧在几乎所有需要用户输入的场景里都用得上能极大提升程序的健壮性。第二个亮点是把isdigit()和continue配合使用。当输入不合法时continue会跳过后面所有代码直接进入下一轮while True相当于“这一轮白说重新开始”。这种模式在“输入不合法就重新输入”的校验场景里是标配。我还加了一个guess_count来记录猜测次数算是一个隐藏的小指标。你可以把它扩展成“超过7次就提示没机会了”这就和第一个案例的计数逻辑打通了。为什么是7次因为二分查找的最优策略下1到100之间猜一个数最多只需要7次2的7次方是128大于100这是计算机科学里二分法的基础思想流程控制学到后面你会慢慢体会到循环和算法是紧密结合的。5. 常见问题与排查技巧实录5.1 典型报错与逻辑错误速查表这一课的所有内容学完大家常遇到的问题其实可以归纳成一张表。我把这几年反复见到的坑整理一下你遇到问题直接对着查现象原因解决办法IndentationError: unexpected indent缩进不一致可能混用了Tab和空格打开编辑器显示空白字符统一改成4个空格SyntaxError: invalid syntax通常是if后面忘记写冒号或者括号没闭合查看报错行号往前推一行检查冒号和括号循环没反应就停了if条件写反了或比较运算用了而不是打印条件变量的值检查比较运算符程序卡住不动CPU飙升死循环while条件永远是True且循环体里变量没变化按CtrlC强制终止检查退出条件循环次数少了一次或多了一次range边界理解有误左闭右开没吃透用list(range(n))打印看看实际生成哪些数list index out of range访问列表时下标越界记住下标从0开始len(list)是长度最后一个元素是len-1输入数字时程序崩了int(input())输入了非数字内容先用isdigit()检查或用try/except处理异常if条件命中错误分支条件顺序不对先写了宽松的条件把范围更窄、更特殊的分支往前放break跳不出外层循环嵌套循环中break只跳出内层用布尔标志位或把逻辑抽成函数后用return排查问题的时候我的固定流程是先看报错信息里的行号再去那一行往上找原因如果没报错但结果不对就在每个分支里加print把关键变量的值打出来看看跑一遍就知道逻辑在哪一步偏了。不要靠眼睛干瞪print大法是最快的调试方式。5.2 独家避坑经验这一部分是我自己教学和写代码过程中总结出来的不写点“过来人”的东西说不过去。第一永远不要在循环里修改正在遍历的列表。比如你有一个列表想删除里面所有偶数nums [1, 2, 3, 4, 5, 6] for n in nums: if n % 2 0: nums.remove(n) print(nums) # 猜猜结果是什么结果是[1, 3, 5]不一定实际输出是[1, 3, 5]但过程里Python内部游标会被“跳过”元素导致结果不符合预期。正确做法是先生成一个新列表[n for n in nums if n % 2 ! 0]或者遍历原列表的副本for n in nums[:]。这个坑在数据处理里容易踩我见过不少血泪现场。第二while循环里别忘了让条件向“终止”推进。新手写while时经常写着写着就死循环了排查方法很简单在循环体最后一行加print(count)看变量变化。如果发现无论如何都不变说明逻辑写错了位置。第三优先用for循环而不是while。如果循环次数可以先确定比如遍历一个列表、循环10次用for更安全、更可读只有不确定次数、需要靠条件退出的时候才用while。很多同学的代码里while用得太多其实大部分场景for是更优雅的选择这也是Python社区和PEP 8风格里隐含的推荐。第四流程控制代码写完之后一定要测边界值。比如判断成绩等级测试0、59、60、79、80、89、90、100这几个分数循环次数测试0次、1次、刚好等于边界、超过边界。边界是最容易出bug的地方测一遍心里就有底了。6. 从第三课到下阶段的衔接思路课程进行到这里Python流程控制的骨架已经立起来了if负责分叉for和while负责重复break和continue负责在循环里做精细控制。这套能力学扎实之后你就能写出有一定逻辑复杂度的程序了比如命令行小工具、文本处理脚本、简单的数据统计器。我个人在实际教学里有个坚持流程控制这一课不急着学新知识一定先把前面的练习题反复敲。比如今天讲的三个综合案例我不建议看一遍就过而是关掉代码自己写一遍写不出来没关系卡住的地方就是你需要补课的地方。这里的“补课”不是指回去看语法而是回顾“程序执行顺序”的整体思维。接下来如果继续往下走方向大致有两个一个是往数据结构方向把列表、字典、字符串的高级操作玩转把流程控制和数据容器结合起来处理更复杂的问题另一个是往文件读写方向走学会让程序把处理结果保存到文件里。无论哪条路第三课的判断和循环都是地基所有的后续内容都会不断用到。最后再分享一个小技巧初学流程控制可以尝试在草稿纸上把程序的执行流程画出来——画方格代表变量画箭头代表程序走向。把输出结果手动跑一遍再落到代码上。我试过很多学生这样做了之后对if和for的理解速度比直接写代码快很多。别着急多写几次手熟了脑子里的模型也就自然建起来了。

相关推荐

从0到1搭建大模型训练推理平台:算力编排、数据管道与稳定性实践
从0到1搭建大模型训练推理平台:算力编排、数据管道与稳定性实践

1. 为什么要自己造轮子:业务需求倒逼的技术决策得物App的商品内容、交易链路里,大模型能落地的场景远比外界想象的要多。商品标题生成、卖点提炼、客服问答、穿搭推荐理由、图片素材生产、搜索词改写、评论舆情分析,每个业务方都在提需求&… · 2026/9/24 22:31:51

基于SpringBoot+Vue的学习平台管理系统设计与实战解析
基于SpringBoot+Vue的学习平台管理系统设计与实战解析

1. 项目概述与定位解读1.1 这套系统到底是个啥第一次看到“基于SpringbootVue的绥大学生学习平台管理系统”这个题目,我第一反应是——这不就是大学里最常见的课程设计/毕业设计选题之一吗?但你仔细扒开看,它其实不只是一个简单的CRUD项目&am… · 2026/9/24 22:31:51

大模型PC服务器时代:本地部署与微调实战指南
大模型PC服务器时代:本地部署与微调实战指南

1. 大模型“PC服务器时代”到底在说什么1.1 从“大型机”到“PC服务器”的类比逻辑蒋涛提的这个说法,我第一次听到的时候愣了一下,然后觉得这个类比确实精准。早期计算机行业,算力集中在少数大型机上,普通人碰不到,只有… · 2026/9/24 22:31:33

六年Intel Mac免费换新M5?售后置换逻辑与老用户升级指南
六年Intel Mac免费换新M5?售后置换逻辑与老用户升级指南

1. 从一台六年前的Intel Mac说起:这件事为什么能引爆讨论先把事情本身说清楚。一台2019年前后入手的Intel芯片Mac,用了六年,按常理早就过了标准保修期,甚至已经进入"维修成本接近残值"的阶段。这种机器一旦出问题&#… · 2026/9/24 23:02:54

学生成绩学分制管理系统设计与实现:从业务规则到数据库落地
学生成绩学分制管理系统设计与实现:从业务规则到数据库落地

第一次拿到“学生成绩学分制管理系统的设计与实现”这个题目,很多同学的判断是:这不就是一个带登录的增删改查吗?先建几张表、写个接口、套个前端模板,能跑就完事了。但你要真抱着这个心态去做,开题答辩大概率没问题&a… · 2026/9/24 23:02:54

开发Android手机安全管家:权限审计与RSA+AES数据加密实战
开发Android手机安全管家:权限审计与RSA+AES数据加密实战

1. 研究思路:为什么需要一套“手机安全管家”智能手机早已不只是通讯工具了。微信里躺着工作群消息,相册里存着身份证照片,备忘录里记着银行卡号,甚至很多人的支付类App还开着免密小额支付。换句话说,手机就是数字身份… · 2026/9/24 23:02:54

Zblog响应式主题开发实战:从免费主题定制到性能优化
Zblog响应式主题开发实战:从免费主题定制到性能优化

1. 项目概述与选型分析1.1 为什么在众多博客程序里选了Zblog做个人博客这件事,最难的其实不是写作,而是选一套顺手、够轻、不折腾的程序。我这些年玩过WordPress、Typecho、Hexo,最后长期留在Zblog上,原因很简单:PHP程… · 2026/9/24 23:02:54

D3D显存占用分析:揭开GPU虚拟地址与设备丢失真相
D3D显存占用分析:揭开GPU虚拟地址与设备丢失真相

1. 项目概述:为什么“D3D游戏显存占用分析”不是性能监控,而是系统稳定性的第一道防线你有没有遇到过刚进《赛博朋克2077》夜之城,还没开枪,屏幕突然一黑,弹出“D3D设备已移除”?或者在《艾尔登法环》打碎第… · 2026/9/24 23:02:41

Deepseek Harness 深度解析:Agent 框架、多智能体编排与本地模型接入实战
Deepseek Harness 深度解析:Agent 框架、多智能体编排与本地模型接入实战

1. 从标题到落地:Deepseek Harness 到底解决什么问题第一次看到 "Deepseek Harness" 这个名字,很多人会误以为它是某个模型权重或者推理加速库。实际上,Harness 这个词在软件工程里一直有"脚手架、约束框架、测试夹具"的… · 2026/9/24 23:02:41

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码