
零基础学Python的同学最容易陷入的误区是听课时觉得“都懂”一关掉视频自己动手写马上大脑空白。如果你正好卡在这个位置那问题多半不是语法没记住而是还没理解程序的骨架——程序控制语句。控制语句就是代码里的分岔路口、循环传送带和安全出口。没有它代码只能像购物清单一样从上往下一行行执行有了它程序才知道在什么条件下走哪条路同一件事要重复做多少次什么时候该提前停手。这篇文章会把Python程序控制语句的底子一次讲透既适合完全没接触过代码的小白也适合学过几节课又稀里糊涂忘掉的朋友。跟着敲完你会发现代码真正“活了”起来。1. 程序控制语句是整个Python的“神经系统”1.1 没有控制语句的代码只能像购物清单一样执行先想一个最基础的问题如果没有程序控制语句写程序是什么感觉写出来的代码会像一张购物清单从第一行到最后一行按顺序全部执行一遍。比如你要打印6句“你好”就得写6行print要打印100句就得复制粘贴100次。这还只是打印如果换成“成绩及格就打印通过不及格就打印重考”这种在现实里极常见的需求纯靠顺序执行压根做不到因为你不知道用户输入的成绩到底是及格还是不及格。所以程序员把程序分成了三种基本结构顺序结构、选择结构、循环结构。顺序结构就是“清单模式”一行接一行选择结构对应“如果……就……否则……”循环结构对应“重复做……直到……”——这两种统称为程序控制语句。我经常给零基础的朋友打一个比方顺序执行是一条没有出口的单行道控制语句则是给这条路装上了红绿灯、环岛和出口。车辆能不能转弯、能转几次弯全看这台“红绿灯”怎么设计。Python里面红绿灯就是if、elif、else环路就是for、while此外还有break、continue这类临时变道按钮。理解了这套东西你看任何代码都会轻松很多因为你不再是在“读字母”而是在“读逻辑”。1.2 先装好环境再跟着动手既然是零基础实操环境问题绕不开。我建议你用最新稳定版Python别在版本号上纠结更不要去下那些乱七八糟的“优化版”。安装时有一点非常关键Windows用户记得勾选底部的Add Python to PATH选项。没勾的话后面在命令行输python会提示找不到命令又得多折腾一步环境变量。装完后打开命令行窗口输入python --version能正常输出版本号说明安装成功。写代码我用的是VS Code新手用它记得装Python扩展如果你懒得折腾IDEPython自带的IDLE也完全够用甚至手机上有云端的Python在线环境也能跑通。环境不是学习的拦路虎不要让纠结“哪个编辑器好用”耽误了真正练手的时间。准备好了之后下面所有代码我都建议你亲手敲一遍不是复制粘贴。复制粘贴只能练手指亲手敲才能真让脑子记住“哦原来这一行是这么配合的”。2. 分支判断让代码学会看情况办事2.1 if / elif / else 的基本骨架分支判断是整个控制语句里最常用、也最贴近日常思维的部分。它的核心逻辑就是“如果条件成立就执行这段否则看看下一个条件再不行就走兜底方案”。先看一个最简单的例子判断成绩等级score int(input(请输入成绩: )) if score 90: print(优秀) elif score 60: print(及格) else: print(需要加油)这里面有三个地方新手最容易看漏。第一是判断条件后面必须有一个英文冒号少了冒号代码直接报语法错误。第二是缩进print前面那4个空格不是装饰而是告诉Python“这些代码属于上面那个if分支”。第三是elif和else的写法不是elseif也不是else ifPython里固定写成elif。执行顺序上Python会从上往下依次检查如果score是95第一个条件成立打印“优秀”后面所有分支都不再看如果score是70第一个条件不成立接着看第二个条件发现成立就打印“及格”。这个“从上往下、先到先得”的规则特别重要很多逻辑bug都出在条件顺序排列不佳上。比如有人把条件写成这样if score 60: print(及格) elif score 90: print(优秀)结果一个95分的同学打印出来的是“及格”。因为Python先检查到了score 60成立它不会继续往下看。所以条件顺序要遵守一个原则范围窄的、级别高的条件放在前面。2.2 判断条件是怎么“攒”出来的if后面跟的其实是一个布尔表达式它的结果只能是True或False。一开始可能只有简单的大小比较但现实需求往往不止一个条件。假设你要判断一个人的BMI指数同时满足“身高达到某个范围”和“体脂数据正常”这时候就要把多个条件组合起来。Python给的条件组合方式非常直白运算符含义示例结果大于18 5True小于18 5False大于等于18 18True小于等于18 18True等于9 9True!不等于9 ! 9Falseand并且True and FalseFalseor或者True or FalseTruenot取反not TrueFalse写法和英文一样age int(input(请输入年龄: )) has_ticket True if age 18 and has_ticket: print(可以进入) else: print(无法进入)这里还有一个零基础很容易蒙的点判断相等要用两个等号而赋值用单个等号。新手常年在这里翻车比如在条件里写if score 90程序直接报错因为Python认为你在做一个赋值操作而赋值结果不能用在这种地方。这个习惯除了多敲代码加深肌肉记忆真没有别的捷径。另外一个小技巧Python支持链式比较可以连续写两个判断。比如判断一个数是否在18到60之间if 18 age 60: print(符合要求)看起来就像数学里的区间写法底层其实是“同时满足大于等于18且小于60”但可读性比age 18 and age 60高不少。2.3 一行搞定的三元表达式有些时候if 判断只是为了给一个变量赋不同的值比如if score 60: result 及格 else: result 不及格这种写法没有错但稍微显得啰嗦。Python提供了一种压缩写法叫条件表达式也就是常说的三元表达式result 及格 if score 60 else 不及格读法也很顺如果score 60成立变量取“及格”否则取“不及格”。我自己的经验是表达式越短越适合用三元写法一旦逻辑复杂还是老老实实写完整 if别硬挤成一团。代码是给人读的不是用来展示你一行能写下多少逻辑的。三元表达式还可以嵌套但我坚决不建议新手用嵌套多了读起来像看天书。2.4 实操小结模拟一个账号验证逻辑把分支的东西串起来写一个账号密码模拟登录的小程序print(欢迎登录) username input(请输入用户名: ) password input(请输入密码: ) if username admin and password 123456: print(登录成功) elif username admin: print(密码错误) else: print(用户名不存在)这个例子看起来简单但里面已经包含了很有价值的设计思想先用范围更宽的条件筛掉一部分情况再判断里面的细节。用户给错了用户名时如果直接告诉“用户名不存在”安全性其实更好如果用户名对了只是密码错再提示“密码错误”也合理。从繁琐的多次判断里提炼出清晰的层次正是控制语句的价值所在。你现在这一行一行写的虽然只是玩具但将来做真实项目的登录逻辑时骨架就是这么长出来的。3. 循环结构让代码学会重复干一件事3.1 for 循环遍历才是它最拿手的如果说分支判断让代码“能思考”循环则是让代码“能干活”。循环要解决的核心问题是同样的操作如何不写重复代码却执行N次。for循环在Python里最擅长的就是遍历——把一个序列里的元素挨个取出来处理一遍。这个序列可以是字符串、列表、元组甚至是一段连续的整数。看两个基础例子。word Python for ch in word: print(ch)这段代码会循环6次每次取出字符串里的一个字符打印输出结果依次是 P、y、t、h、o、n。for后面的变量ch就像一个小盒子每次循环Python自动把下一个元素装进这个盒子里。再看遍历列表fruits [苹果, 香蕉, 橘子] for fruit in fruits: print(f我喜欢吃{fruit})这种写法非常直白完全符合自然语言的语感。等以后学到列表推导式、字典推导式会发现它们的基础就是for循环。3.2 range 的三个隐藏参数那如果想“重复执行10次”该遍历什么Python最喜欢用的答案叫range它生成一段连续的整数。for i in range(5): print(i) # 输出 0 1 2 3 4新手最容易忽略的是range(5)生成的是0到4不是0到5。这背后的原因是Python的区间设计统一遵循“左闭右开”——左边包含右边不包含。这个规则无处不在学会了它以后切片、取子串都能少踩很多坑。range可以接受多个参数看这几行range(5) # 0, 1, 2, 3, 4 range(1, 5) # 1, 2, 3, 4 range(1, 10, 2) # 1, 3, 5, 7, 9三个参数的含义分别是起点、终点、步长。最好在纸上先推演一遍再跑到代码里验证比直接硬背高效得多。动手写个经典例子求1到100的和total 0 for i in range(1, 101): total i print(total) # 5050total i是total total i的简写。循环累加的思路很简单初始值为0每轮循环把当前数加进去。这类累加逻辑以后在计算平均值、汇总数据时到处都要用。3.3 while 循环适合不知道要跑多少次的场景for循环适合“知道要循环几次”的场景比如遍历100个数字。但如果循环次数一开始并不确定就得靠while。while的语法格外简单只要条件为真就一直执行循环体。count 0 while count 5: print(count) count 1这个例子每次循环把count加1当它加到5条件5 5变为False循环停止。写while最怕的是忘记让条件改变——比如上面漏了count 1条件永远为真程序就会陷入死循环不得不强制关闭窗口。所以每次写while都默念三遍条件会不会变什么时候停判断用for还是while我的经验是如果能直接数清楚循环次数就用for如果循环次数取决于某个动态条件、或者需要“持续直到满足某条件为止”就用while。比如“不断让用户输入密码直到输入正确为止”这个场景适合while因为你不知道用户会输几次。3.4 break、continue 与 for-else、while-else 的冷门配合光有循环还不够有时需要在循环到一半时改变行为。break用来跳出整层循环continue用来跳过本轮剩余代码、直接进入下一轮。看个例子找出1到20中的第一个质数for n in range(2, 21): for i in range(2, int(n ** 0.5) 1): if n % i 0: break # 能被整除说明不是质数直接跳出内层 else: print(找到第一个质数:, n) break也许你注意到了这里的else不是放在if后面而是放在for后面。这个用法很多老手都不一定常用但非常优雅如果循环完整跑完、没有提前触发break就执行else里面的内容。在质数判断里没有找到任何能整除的数说明它是质数就走else分支。continue更直观一些for i in range(1, 6): if i 3: continue # 跳过3不打印 print(i)输出结果是 1、2、4、5。记住一个区别break是退出整个循环continue只是跳过当前这次。3.5 嵌套循环实战九九乘法表循环里套循环叫嵌套循环。很多零基础朋友看到嵌套就头大其实它就是把“外层决定轮次内层决定每轮做什么”展开来看。实现一个横版的九九乘法表for i in range(1, 10): for j in range(1, 10): print(f{j}x{i}{i*j}, end\t) print() # 换行外层i控制行数内层j控制每行打印多少组。如果你是第一次写嵌套循环强烈建议在纸上画一个3×3的表格模拟一下当i1、j1、j2、j3时程序分别做了什么事。把执行过程拆到这一步嵌套循环再也不会是玄学。把这个九九乘法表稍微改造一下限制内层j i就会得到左下三角的经典款式。这种“限制内层范围”的写法将来处理矩阵、日历、表格打印时特别常见。3.6 一个完整小项目猜数字游戏理论讲了一堆不如动手写个完整的游戏。猜数字的规则很简单程序随机生成一个1到100之间的整数玩家输入猜测程序提示“大了”或“小了”直到猜中为止。import random target random.randint(1, 100) times 0 while True: guess int(input(请猜一个1到100之间的数字: )) times 1 if guess target: print(猜大了) elif guess target: print(猜小了) else: print(f恭喜你猜中了共猜了{times}次) break这个项目麻雀虽小、五脏俱全。while True是一个“永真循环”配合内部的break实现“一直猜直到猜中”的逻辑。你会同时用到输入输出、分支判断、循环、变量累加和随机数生成——几乎覆盖了控制语句的全部知识点。给个小建议做完基本版后给它加一个次数限制超过5次没猜中就自动结束并公布答案。这种“自己给自己提需求再实现”的练习方式成长速度非常快。4. 零基础最容易踩的坑和排查技巧实录4.1 常见报错速查表我整理了一份新手最容易遇到问题清单对照着查比自己瞎猜高效得多现象常见原因解决办法提示IndentationErrorTab与空格混用或缩进不一致统一使用4个空格设置编辑器自动转换Tab为空格提示SyntaxError: invalid syntax忘记冒号、括号不匹配检查 if/elif/else/for/while 后面是否加了英文冒号if条件里报错把写成了判断相等用双等号单个等号是赋值程序一直运行不结束while条件一直为True或循环内没更新退出条件在循环体内修改变量或设置break出口range(5)只输出0到4区间左闭右开需要到N就写range(N1)输入数字后报类型错误input()返回的是字符串不能直接和数字比较用int(input(...))或float()转换类型if结果永远走同一个分支条件顺序不对前面的条件覆盖了后面的把更具体的条件放前面并用不同数据测试这里我想单独强调一下Tab和空格的问题。你肉眼看着缩进好像差不多但在Python解释器眼里Tab是一个\t字符空格是另一个字符混在同一个代码块里会直接报错。几乎所有现代编辑器比如VS Code都可以在设置里开启“按Tab时插入四个空格”。把这个设置改好能省掉你人生中最没有意义的一批报错。4.2 为什么程序“不走我想要的逻辑”代码语法全对但结果不对这是比报错更折磨人的情况。最常见的迷思是“我的条件是顺序写的为什么第一个不执行反而执行了第三个”排查思路其实只有三步。第一步检查条件的边界值。比如判断成绩等级score 89和score 90分别会走哪个分支在纸上列出来确实接近满分但这一步能筛掉一半的问题。第二步打印中间结果。写代码永远不要觉得print很土在判断之前把变量值打出来看看它到底是不是你以为的那个数。第三步把一个复杂判断拆成多个小判断。比如把两个and条件分开写成两个if逐步定位看是哪一个环节出了问题。我还见过不少次变量名前后不一致前面写score后面手滑写成了scroePython把它当成了新变量不会报错但结果全错。所以遇到诡异bug先检查拼写。4.3 三个立竿见影的学习习惯教程看再多、文章读再多都不如每天固定写一页代码。我给零基础学员的建议一直很简单第一每天亲手敲30行以上代码不用多贵在坚持第二每个示例一定要关掉参考代码自己默写一遍第三出了bug先自己看5分钟再问实在想不出来再用搜索引擎查报错原文。我自己当年学Python时把“猜数字游戏”改造了至少五个版本加次数限制、加难度选择、加欢呼音效日志、改成两个人轮流猜……每次改造都要重新梳理一遍控制流程等改造完if、while、break这些词就像长在手上一样自然。编程是熟练工种控制语句更是如此只能靠“用”出来不能靠“看”会。5. 学完控制语句之后还能往哪里走5.1 列表推导式就是 for if 的“浓缩版”控制语句不是孤立的知识点它是后面一切工具的底座。举一个很典型的例子列表推导式。你想取一个列表里所有偶数并放大两倍可以写常规循环nums [1, 2, 3, 4, 5, 6] result [] for n in nums: if n % 2 0: result.append(n * 2) print(result) # [4, 8, 12]同样的逻辑用列表推导式一行搞定result [n * 2 for n in nums if n % 2 0]你仔细一读其实就是“for循环if分支”的压缩版。很多人学到这里觉得列表推导式是全新的语法理解起来有障碍但如果你把这篇的控制语句扎实练熟了推导式只不过是把for和if换了个排版而已。后面还会遇到字典推导式、生成器表达式全都是同一个套路。5.2 控制语句在真实项目里长什么样等你稍微往前走几步会发现爬虫要遍历网页列表数据分析要遍历几千行数据做条件筛选量化回测要用循环模拟每一天的价格变化再套上买入卖出的判断条件——全部都是for套if的应用。举个例子数据分析中最常见的操作“筛选出成绩大于80并且低于90的记录”写出来就是循环遍历加条件判断。所以不要觉得学控制语句只能应付考试它是你将来接触爬虫、数据分析、自动化办公这些“听着很酷”的方向时必须跨过的第一道大门。Python生态再庞大落到代码执行层面依然是按顺序、看条件、打循环这三板斧。5.3 关于学习路径我最后想多说一句控制语句学会的标志不是能背出多少语法而是拿到一个需求后能下意识地用“如果……就……否则……”“循环做……”来描述它。当你发现一大堆看起来毫无规律的代码在自己脑袋里变成“先判断、再循环、遇到异常就跳出”这种结构图的时候就算是入门了。我个人至今都很怀念刚学会while和break的那几天每天写点小东西都觉得特别有成就感。建议你现在立刻做两件事先把自己电脑上的Python环境跑通再照着猜数字游戏的代码亲手敲一遍并改造一个功能。不要等“准备好”才开始代码这东西打开编辑器的那一刻才算真正开始学。