ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Python控制流入门:if条件判断与for/while循环实战笔记

Python控制流入门:if条件判断与for/while循环实战笔记 说实话写这篇记录的时候我刚刚关掉编辑器盯着屏幕上那个跑通了十几遍的“猜数字”程序发了一会儿呆。Day 1 装环境装到怀疑人生Day 2 被变量和数据类型绕得头晕而 Day 3 学的是控制流——如果昨天是“认识工具的零件”今天就是“第一次把它们组装起来让程序真正做点事”。这篇帖子写给两种人一种是跟我一样零基础起步、正在自学编程的人想看看第三天的真实进度到底该是什么样另一种是已经在学但卡在某个地方、想找点对照和鼓励的人。我会把今天学的核心概念、踩过的坑、写过的代码原原本本摆出来包括报错信息包括那些“蠢到不想承认”的错误也包括一些我在实操中总结的、比教程更接地气的经验。1. 前两天的基础没打好地基今天根本走不动1.1 Day 1 的折腾环境不是装完就完了很多人第一天就挂在环境搭建上我也一样。当时纠结了很久选什么编辑器最后听了个老程序员朋友的劝直接上了 VS Code搭配 Python 官方插件。不是说 PyCharm 不好而是对新手来说VS Code 更轻、界面更简洁报错提示也更直观不会一上来就被一堆工程概念吓住。装完 Python 之后我强迫自己干了一件很多人跳过的事在命令行里敲python --version确认解释器真的能用。这一下就暴露了问题——系统里同时存在 Python 2 和 Python 3 的残留路径输错命令会调起旧版本。后来在 VS Code 右下角手动切换了解释器路径才算彻底解决。那天的“作业”是打印三行文字print(Hello, World!)再加两行自我介绍。现在回头看确实简单但当时第一次看到屏幕上出现自己敲的字那种兴奋感是实实在在的。也就是这个小小的正反馈让我撑到了今天。1.2 Day 2 的积累变量、类型和输入输出第二天学的量其实不小变量赋值、整数/浮点数/字符串/布尔值这几种数据类型、input()接收用户输入还有简单的类型转换。当时最懵的是“变量到底是个啥”。后来我用了一个比喻才真正想通变量就像贴了标签的收纳盒age 18就是往盒子里放了个数字 18以后用到age时拿到的就是盒子里的东西。至于类型转换int()、str()这些函数可以理解成把盒子里的东西换一种形态——数字变成文字文字变成数字传错了就会报ValueError。那天的练习是写一个“身高换算器”用户输入身高的厘米数输出对应多少英尺多少英寸。代码本身不长但第一次用到了input()配合int()转换也第一次确认了“用户输入进来的东西永远是字符串”这条铁律。折腾了快一小时跑通的那一刻我对“调试”这件事有了最原始的体感——就是报错、看提示、改代码、再跑循环往复。1.3 为什么前两天的积累决定今天的效果说这些倒不是为了凑篇幅而是想强调一个很现实的事Day 3 的内容密度比前两天大得多如果前面的概念是夹生的今天会非常痛苦。比如今天学 for 循环里面要大量使用range()的边界参数如果你对整数和序列还是不敏感很容易写出“少一个数”的循环。我的经验是每天开始新内容前用 20 分钟把前一天的练习重新手敲一遍不要复制粘贴而是看着题目自己默写。这招很土但真的有效——它逼你回忆语法结构比单纯看笔记管用十倍。今天我就是靠这种复习快速进入了状态。2. Day 3 核心主题程序第一次学会“判断”和“重复”2.1 if/elif/else给程序装上“大脑”控制流是编程里第一个真正“像编程”的概念。之前写的代码都是从上到下一条道走到黑今天学的if语句让程序第一次有了分支——像走到一个岔路口根据条件决定往哪边走。我用了“点外卖”这个类比来理解如果账户余额大于 50 元就加一份甜品否则就只点主食如果连主食钱都不够就退出结算。用代码写出来就是balance 35 if balance 50: print(加一份甜品) elif balance 20: print(点一份主食) else: print(余额不足退出结算)这里有个新手特别容易犯的错把多个 if 写成一串而不是用 elif。一长串独立的 if 会逐个判断哪怕第一个条件已经满足后面的条件照样会执行而 elif 是“只要前面的成立后面的就不看了”。这两个逻辑的差异我在练习里反复踩了好几遍才记住。关于比较运算符我总结了一个口诀是“等于”!是“不等于”和别写反整型别跟字符串比——5 5在 Python 里永远为 False因为一个是数字一个是文字根本不是一种东西。2.2 for 循环让重复劳动交给机器如果说if让程序有了判断力那for循环就是让程序有了“耐心”。它解决的核心问题是如果我想输出一百遍“今天也要加油”难道要写一百行 print 吗循环就是干这个的。Python 写循环的姿势跟其他语言不太一样它是“遍历”思维。最基础的写法是配合range()for i in range(5): print(第, i, 次循环)这里有个第一天就该记住但今天才真正理解的细节range(5)生成的是0到4这五个数字永远到不了 5。这是程序员的“从 0 开始数数”习惯跟现实中“从 1 开始”完全不一样。初学者在这里几乎必踩坑——我第一次写的时候就默认循环会执行 5 次且i从 1 开始结果每次输出的第一个数字都是 0直接懵了。用循环遍历列表也是今天的重头戏fruits [苹果, 香蕉, 橙子] for fruit in fruits: print(我喜欢吃, fruit)这种写法的好处是不用手动管索引下标Python 会帮你把列表里的元素挨个取出来赋给fruit。对比着学的话很多语言里你得写for (int i 0; i len; i)这种带索引的循环Python 把这层脏活累活都省了——对新手来说省掉的这部分恰恰是容易出错的地方所以 Python 特别适合入门。2.3 while 循环当循环次数不确定时for循环适合“我知道要循环几次”的场景while循环则适合“我不知道几次但我知道什么时候该停”。它的逻辑很简单只要条件为真就一直执行。写一个“猜数字直到猜对”的小框架secret 7 guess 0 while guess ! secret: guess int(input(猜一个数字)) print(猜对了)今天我在 while 循环里踩了一个经典的坑忘了更新循环条件里的变量导致死循环。键盘疯狂输出终端一片乱滚最后还是按 CtrlC 强制停止的。这个体验非常直观它让我真正理解了什么叫“循环必须有一个能走向终止的条件”。我的教训是写完 while 后先在脑子里过一遍“这个条件会不会永远为真”养成习惯比事后调试省时间得多。2.4 break、continue 和嵌套控制流的进阶玩法这三样东西今天只算“摸了摸”但已经把循环的灵活性展示出来了。break是“看到这一步立刻结束整个循环”continue是“跳过这一次进入下一次循环”。区分这俩最好的记忆方法是break 是直接拍桌子走人continue 是这次不算、重新排号。for i in range(10): if i 7: break # 到 7 就停 print(i)嵌套循环听起来唬人其实就是循环里面套循环。我写了个例子输出一个 3 行 4 列的星号矩阵。for row in range(3): for col in range(4): print(*, end) print() # 换行今天没能把嵌套循环彻底吃透尤其是end这个参数在做什么我琢磨了好一阵才明白print 默认会在每次输出后加一个换行符end就是告诉它“别换行用空字符结尾”这样才能在同一行里连续打星号。这种“每个小细节都可能藏着一个知识点”的感觉大概就是自学的日常吧。3. 实操记录两道练习题跑通的完整经过3.1 练习一带范围的猜数字游戏今天给自己定的主任务是写一个“猜数字”游戏要求程序随机生成一个 1 到 100 之间的数字用户最多猜 7 次每次提示“大了”或“小了”并在结束时公布答案。这个题目看起来简单但把今天学的 if、while、break、随机数、输入输出全串起来了。我先写了一个没有“7 次限制”的版本跑通了之后再逐步加难。用到随机数要在文件头部加import random然后random.randint(1, 100)生成目标数字。完整代码如下import random secret random.randint(1, 100) tries 0 while True: guess int(input(猜一个 1-100 的数字)) tries 1 if guess secret: print(大了) elif guess secret: print(小了) else: print(恭喜猜中了共用, tries, 次) break if tries 7: print(次数用完答案是, secret) break写完后我故意做了几组测试输入边界值 1 和 100故意输非数字比如字母abc看看程序会不会崩。结果果然崩了——int(input())遇到非数字会抛ValueError。这个 bug 今天不修今天的目标就是先把主体流程跑通异常处理留到后面专题学。这不是偷懒而是有意识地控制学习节奏避免一个临时用不到的坑耗掉整晚精力。3.2 练习二FizzBuzz 的三种写法第二个练习是编程界著名的“筛子题”FizzBuzz从 1 数到 50凡是 3 的倍数输出 Fizz5 的倍数输出 Buzz同时是 3 和 5 的倍数输出 FizzBuzz其他情况输出数字本身。第一版我写得很狼狈for i in range(1, 51): if i % 15 0: print(FizzBuzz) elif i % 3 0: print(Fizz) elif i % 5 0: print(Buzz) else: print(i)用i % 15 0判断“同时被 3 和 5 整除”思路没错但代码的“先见之明”不够——万一哪天规则变了15 这个魔法数字就会埋雷。第二次我改成先判断“同时满足”再判断单个条件for i in range(1, 51): if i % 3 0 and i % 5 0: print(FizzBuzz) elif i % 3 0: print(Fizz) elif i % 5 0: print(Buzz) else: print(i)这里体现了 if 判断顺序的核心逻辑最严格、最特殊的条件一定要放在最前面。如果把i % 3 0放前面那 15 就会被判断成 Fizz永远不会走到 FizzBuzz 的选项——这个顺序问题就是传说中的“分支顺序 bug”。后来我又试着用字符串拼接的写法先拼 Fizz 再加 Buzz再决定是否加数字思路完全不同但也能跑通。同一个问题三种解法让我体会到“编程没有标准答案”这句话不是鸡汤是事实。3.3 时间投入与节奏把控今天的总学习时间约 4.5 小时但我特意把它拆成了三段上午 1.5 小时看视频教程并跟着敲代码下午 1 小时复习前两天的练习晚上 2 小时专心写上面这两道练习题。中间强制休息了几次每次至少 15 分钟站起来走动、看远处而不是刷手机。为什么这么拆因为Day 3 这个节点恰恰是很多自学者放弃的高危期。第一天的鸡血退潮了第二天的“蜜月感”也淡了第三天开始面对真刀真枪的难度挫败感会直线上升。我给自己定的原则是每学 45 分钟必须离开屏幕 10 分钟不要用意志力硬扛。硬扛的后果往往是越学越烦躁最后干脆不学了。学习是马拉松Day 3 拼的不是冲劲是节奏。4. Day 3 新手高频踩坑实录4.1 IndentationError缩进是语法不只是排版Python 用缩进表示代码块这是它和 C 系语言最大的区别。今天练习时我犯了个典型错误某个if下面的print忘记缩进一运行就报IndentationError: expected an indented block一开始我还觉得“这也太严格了吧”后来想通了——缩进在 Python 里就是语法的一部分它决定了哪些代码属于哪个分支就像人体检抽血时护士贴的标签贴错了整个样本就废了。我的建议是编辑器里把“显示空格/制表符”的选项打开强制自己统一用 Tab 或统一用 4 个空格千万不要混用。VS Code 右下角可以切换缩进模式设置好了它就自动帮你转。这个坑我敢说十个新手九个踩。4.2 死循环是怎么炼成的就是前面说的那个 while 死循环。当时代码长这样while answer ! 100: print(再猜一次)猜对了answer却不更新条件永远成立程序就这么卡住了。死循环的教训很简单while 循环体里一定要有一行代码能改变循环条件里的变量。排查死循环有一个朴实的技巧在循环体第一行临时加一句print(当前正在循环中...)然后运行。如果这句话刷屏停不下来说明循环确实没走完如果没刷屏说明问题出在循环进入之前。这个“探针式调试法”非常基础但意外地好用比盯着代码干瞪眼强多了。4.3 变量为什么“顽固地保留旧值”写猜数字游戏时还遇到一个诡异现象程序提示“次数用完答案是 XX”但下次运行后tries竟然不是从 0 开始好像“记住了上一次”的值。我研究了一会儿才发现是自己看岔了——不是程序有记忆是因为我忘了在while之前给tries重置为 0而脚本重新运行时那行tries 0其实一直在问题出在更新顺序上。这事的价值在于让我理解了一个概念变量是会“残留”的它的生命周期从赋值开始到代码块结束为止。如果你的循环里用到累加器像tries 1务必确认它是否在进入循环前被初始化过。这种“边界思维”是靠一个个莫名其妙的 bug 喂出来的。4.4 常见报错信息速查表今天半天的报错我来个现场汇总给后来的新手一个参考报错信息通常原因处理方向IndentationError: unexpected indent多缩进了或混用 Tab/空格统一缩进方式检查代码块对齐SyntaxError: invalid syntax缺冒号、括号不匹配、引号没结束先看冒号和括号再看中英文符号ValueError: invalid literal for int()int()传了非数字字符串检查input()输入或先用.isdigit()判断NameError: name xx is not defined变量拼错或没定义就使用检查变量名拼写和赋值顺序TypeError: not supported拿字符串和数字比较用type()检查变量实际类型必要时转换这个表我贴在笔记开头每次报错先对着表过一遍能省下大量瞎试的时间。报错不是失败是程序给你的提示信息——用排bug的心态去看报错反而是最好的老师。5. 关于“学习记录贴”本身我为什么要公开写 Day 35.1 记录是给自己的第二个大脑今天最让我有收获的其实不是 Python 语法本身而是“记录”这个行为。把每天的代码、报错、思考都写下来一开始是为了逼自己复盘后来发现它的价值远超预期写下来的过程就是在强迫你把模糊的“好像懂了”变成明确的“我确实懂了”。具体怎么记我用的是最朴素的格式日期、今天学什么、写了哪些代码、报了什么错、错在哪、下次怎么避免。不用花哨的笔记软件一个纯文本文件加一个代码文件夹就够。整理笔记时有一个技巧每隔三天回看一次自己的旧笔记你会发现自己曾经卡住的问题现在一眼就能看穿——这种“成长证据”比任何鸡汤都提气。5.2 Day 3 为什么是最容易放弃的一天我查过一些学习行为的资料很多人不是死在 Day 1 的安装配置也不是死在 Day 30 的深入瓶颈而是死在 Day 3 左右。原因很现实Day 1 和 Day 2 的新鲜感能抵消挫败感Day 3 开始接触真正的逻辑复杂度新鲜感没了挫败感上来了又没有外部监督自然就想放弃。应对方法除了上面说的“拆时间、多休息”之外我还做了两件事第一降低期望值不要求自己今天必须掌握所有内容能跑通一小段代码就是胜利第二找个能“接住你”的人——不是要他有问必答而是当你卡住时说一句“这个坑我也踩过正常”就足够让你重新拿起键盘了。5.3 接下来两天的计划Day 4 和 Day 5 我打算把节奏放稳先把今天磕磕绊绊的嵌套循环补扎实用“打印九九乘法表”当练习题然后开始接触列表的增删改查和切片因为这东西跟循环配合起来能让程序处理的数据量有一个质的飞跃。如果进度顺利Day 6 就尝试写一个“待办清单”小工具把输入、判断、循环、列表管理全部串起来。计划不做太满因为我知道自学最容易死在“计划完美但执行不了”上。留出缓冲允许自己哪天状态差就只温习不学新的这种弹性比铁律更有用。说实话今天写到这儿我最大的感受是Learning Day 3 不像前两天的“兴奋型学习”而更像“耐受型学习”——没有那种瞬间的快感但撑过去之后会发现自己能读懂的代码变多了能写出来的东西也不再是 hello world 级别。这个帖子不发出去就是我的私人笔记发出去就是给同路人的一个参照。下一篇 Day 4 见希望到时候我还在写——这本身就是一种胜利。
返回列表