十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Python基础入门:顺序、选择、循环三种核心结构详解

Python基础入门:顺序、选择、循环三种核心结构详解 刚开始学编程的同学十有八九都会选 Python。别的不说光是“像写英语一样写代码”这一点就比 C 或 C 友好太多。但要学好 Python光靠看语法文档是不够的得先理解一件事所有程序无论多复杂本质上都由三样东西组合而成——顺序、选择、循环。这“三种结构”听起来简单却是任何一门编程语言通用的骨架也是从“会读代码”到“会写代码”的一道关键门槛。这篇笔记整理的是 Python 基础知识和三种结构的完整使用思路包含我实际带新人时常讲的一些比喻、踩过的坑、以及调通代码的小技巧。适合刚刚接触编程、或者学过但容易把 if、while、for 搞混的同学也适合想系统梳理一遍基础的人当作复习提纲。看的过程中建议打开电脑跟着敲光看不练语法永远只是“见过但不会用”。1. 内容整体设计与思路拆解1.1 为什么“基础知识”和“三种结构”必须放在一起学很多同学喜欢一上来就学爬虫、学 Flask结果连“变量”和“字符串”都分不清写了两天代码就开始怀疑人生。为什么因为爬虫、数据分析、Web 开发这些实战项目全是建立在基础语法和流程控制之上的。基础知识是砖块三种结构是搭砖块的图纸缺了任何一个你看到的代码都是乱麻。我第一次带人入门的时候习惯先花 30 分钟讲清楚这几个概念变量是什么、数据类型有哪些、条件判断怎么走、循环怎么转。然后马上用一个综合小案例把知识串起来。这种方式的好处是读者不会像看说明书一样学完就忘而是从一开始就知道“这玩意能用来干什么”。所以这篇文章的结构也是刻意按这个思路编排的先铺概念再讲三种结构的底层逻辑最后用一个“猜数字”程序演示它们是怎么协作的。1.2 三种结构在真实程序中的角色类比你可以把一段 Python 代码想象成做菜的流程顺序结构就是你按菜谱一步一步往下操作洗菜、切菜、炒菜。每步做完再做下一步顺序不能乱代码也是这样从上往下逐条执行。选择结构就是“如果盐放少了就加盐如果咸了就加点水”——程序里用 if 判断条件决定执行哪一段逻辑。循环结构就是“搅拌到面糊没有颗粒为止”——不知道具体要搅多少次只能每搅一次检查一下状态直到条件满足才停下来。真实项目里这三种结构是嵌套、组合着用的。理解了这个你再看任何一段代码基本能猜出它在做什么无非是在“按顺序做某事”“做判断分流”“重复做某事”这三者之间切换。2. 基础概念扫盲先认识 Python 的“零件”2.1 变量与赋值帮数据贴上名字变量就像一个贴着标签的盒子。你可以往盒子里放什么东西也可以随时倒掉换新的。Python 里给变量赋值非常简单不需要提前声明类型name 张三 age 18 score 95.5 is_pass True上面四行代码分别把字符串、整数、浮点数、布尔值装进了四个“盒子”里。Python 的动态类型特性意味着同一个变量名可以在程序运行过程中改成其他类型的值比如a 1之后又可以写成a hello这在 C 语言里是做不到的。实际写代码时我给新人的建议就一条变量名要起得有意义。a1和total_score1在运行结果上完全一样但接手你代码的人包括三个月后的你自己看到后者的一瞬间就知道这个变量是干嘛用的。千万别用a、b、c这种取名方式写复杂程序。2.2 数据类型与类型转换Python 中的“分类收纳盒”Python 中常用的数据类型有数字类型int、float、字符串str、布尔值bool还有列表list、元组tuple、字典dict、集合set这些容器类型。入门阶段最最基础的是前三种。有个很常见的坑input()函数不管用户输入什么都会以字符串形式保存。如果你想拿用户输入的年龄做加法直接写age input(请输入你的年龄) next_year_age age 1运行就会报错TypeError: can only concatenate str (not int) to str。这就是因为 type 不匹配。正确写法是先转换再运算age int(input(请输入你的年龄)) next_year_age age 1所以int()、float()、str()这几个类型转换函数必须熟练。我再补充一个经常有人踩的坑用int()转换带小数点的字符串比如int(3.14)会报错ValueError: invalid literal for int()。但int(3.14)不会报错结果是 3因为这是浮点数转整数直接截断小数部分。字符串转整数时字符串里的内容必须长得像一个整数。常用类型转换总结成这样函数作用示例结果int(x)转整数int(18)18float(x)转浮点数float(95.5)95.5str(x)转字符串str(100)100bool(x)转布尔值bool(0)False2.3 运算符给数据建立关系运算符分四类都必须烂熟于心算术运算符、-、*、/、//整除、%取余、**幂运算。特别注意/的结果永远是小数的形式比如8 / 2不是整数 4 而是浮点数 4.0但8 // 2是整数 4。比较运算符、、、、、!比较的结果是布尔值 True 或 False。逻辑运算符and并且、or或者、not取反用于组合多个判断条件。赋值运算符、、-、*、/等a 1等价于a a 1。逻辑运算符是一个很容易被新手忽略的重头戏。比如判断“年龄在 18 到 35 岁之间”数学里常写成18 age 35Python 里确实可以这么写但如果你想用 and 连接就必须写成age 18 and age 35。逻辑运算符的短路特性也很实用多个条件用 and 连接时只要前面一个条件是 False后面就不执行了or 恰好相反前面一个条件是 True后面也就不执行了。3. 顺序结构代码执行的默认逻辑3.1 顺序执行到底是什么意思顺序结构是程序的“默认模式”代码从上到下、一行挨一行执行。说起来简单但很多人调试的时候容易忽略这一点导致逻辑错乱。比如这段代码x 10 print(第一次打印, x) x 20 print(第二次打印, x)输出结果是第一次打印 10 第二次打印 20你可能觉得这没什么技术含量但很多新人犯的错误是以为后面给 x 赋了新值前面打印的结果也会跟着变。不会的变量一变过去已经执行完的代码就永远定格了。变量存储的是某一时刻的值不是一段“引用”。理解这一点后面学列表、字典修改时的“可变”与“不可变”问题会顺利很多。3.2 输入输出与程序对话的基础方式顺序结构里最常用到的两个内置函数是print()和input()。input()的参数是提示文字返回值永远是字符串。print()的用法比较多常用参数有sep分隔符和end结尾字符默认情况下列表项间用空格分隔结束后自动换行print(苹果, 香蕉, 梨, sep、, end。\n)这段代码会输出苹果、香蕉、梨。注意分隔符变成顿号结尾变成了中文句号加换行。print()还支持格式化输出用 f-string 是最方便的方式比如name 阿哲 score 92 print(f{name} 这次考了 {score} 分)f-string 前面那个f是格式化标志花括号里放变量名即可。从 Python 3.6 开始这个写法就内置支持了简单漂亮比过去用%或format()直观得多。我强烈建议新手直接学 f-string省去很多拼接字符串时的引号错乱问题。3.3 顺序结构实操计算圆的面积现在写一个能运行的完整小例子体会顺序结构“每一步有意义”的感觉import math radius float(input(请输入圆的半径)) area math.pi * radius ** 2 print(f半径为 {radius} 的圆面积是 {area:.2f})这个程序分三步接收输入、计算面积、输出结果。三步严格按顺序执行哪一步出问题后面全都执行不到。注意import math放在最顶部是行业通用习惯导入应该集中在文件开头不要写到中间去。格式化输出里的:.2f表示保留两位小数这个技巧很常用。运行这个程序输入一个半径值程序就会给出面积。别看它简单它展示了顺序结构的完整生命周期获取数据、处理数据、输出结果任何程序都逃不出这个模式。4. 选择结构让程序学会“看情况办”4.1 if / elif / else 的底层判断逻辑选择结构就是扮演“路口交警”的角色。Python 使用if、elif、else关键字根据条件是 True 还是 False决定走哪条分支。基本写法score int(input(请输入考试成绩)) if score 90: grade 优秀 elif score 60: grade 及格 else: grade 不及格 print(f成绩等级{grade})注意几个关键细节if、elif后面必须有冒号:这是新手最容易漏掉的地方。条件为 True 时执行的代码块必须缩进通常是 4 个空格Python 靠缩进划分代码块不靠花括号。elif是“else if”的简写可以写多个。从上到下依次判断一旦某个条件成立后面的条件就不会检查了。这里有一个重要的执行机制条件的先后顺序会影响结果。比如上面例子如果把score 60的条件放在最前面那么 95 分也会被归入“及格”因为95 60成立后面score 90根本轮不到判断。所以写多分支条件时你得先想清楚条件的“范围大小”优先判断最严格的小范围条件再放宽到大范围。4.2 布尔表达式与逻辑运算符组合条件判断里能写的表达式不只是比较运算还可以用and、or、not组合更复杂的条件。比如火车票半价判断age int(input(请输入年龄)) is_student input(是否为学生(y/n)) y if age 6 or (age 18 and is_student): print(可以购买优惠票) else: print(需要购买全价票)看这段代码判断逻辑是“6 岁以下儿童”或“成年在校学生”都可以买优惠票。第一个条件age 6是独立判断第二个条件age 18 and is_student是复合判断需要两个条件同时满足。很多人踩过的坑在is_student input(...) y这一行如果写成if is_student y但前面保存的是字符串y结果是能用的。但如果用户输入的是大写Y或中文是条件就不成立了。实际写代码时最好统一格式比如用.lower()把输入转成小写或者写清楚提示文字“请输入 y 或 n”。4.3 嵌套 if 和条件表达式让判断更灵活if 里面还可以再写 if这叫嵌套。嵌套可以处理更复杂的逻辑但层级一多代码就变得非常难读。我的建议是嵌套不要超过三层如果逻辑真的复杂可以用and、or组合条件或者提前用return跳出函数后面学函数时会遇到。来个生活化的例子hour int(input(现在几点(小时制))) if hour 0 or hour 23: print(输入不合法) else: if hour 6: print(凌晨了快睡觉) elif hour 12: print(上午好) elif hour 18: print(下午好) else: print(晚上好)这个例子外层 if 先检查输入是否合法内层 if 再分时段打招呼。你可以看到使用嵌套以后代码结构更清晰了先过滤异常情况再处理正常情况。Python 还支持一种简写形式叫条件表达式三元表达式status 成年 if age 18 else 未成年这行代码等价于if age 18: status 成年 else: status 未成年条件表达式适合简单赋值但别在里面写太复杂的逻辑否则可读性极差。我在代码 review 时见过不少写一行三元表达式套三元表达式的阅读体验堪称灾难。4.4 选择结构实操BMI 指数等级判断综合练习一下写一个根据身高体重计算 BMI 并给出等级的程序height float(input(请输入身高米)) weight float(input(请输入体重千克)) bmi weight / (height ** 2) print(f你的 BMI 是{bmi:.1f}) if bmi 18.5: result 偏瘦 elif bmi 24: result 正常 elif bmi 28: result 偏胖 else: result 肥胖 print(f身体状态{result})注意这里判断条件的顺序是有讲究的。bmi 18.5是最小的范围bmi 24实际上隐含了前一个条件不成立即 bmi 18.5时才轮到判断。这样写既简洁又准确不需要重复写bmi 18.5 and bmi 24这种冗余代码。能省则省但省的前提是你自己看得懂逻辑。如果你觉得bmi 18.5 and bmi 24这种完整写法更方便阅读那就用它代码的首要读者永远是你自己。5. 循环结构重复劳动交给程序5.1 while 循环不知道要循环多少次while循环适合“不知道要执行多少次只知道什么时候停下来”的场景。它的逻辑是只要条件为 True就一直执行循环体里的代码。典型场景是“猜数字”。用户可能猜 1 次就中也可能猜 100 次没办法提前确定循环次数只能用 whilesecret 7 guess 0 while guess ! secret: guess int(input(请猜一个 1-10 之间的数字)) print(恭喜你猜对了)这段代码的关键在于判断条件guess ! secret一旦用户输入的 guess 等于 secret条件变成 False循环自然终止。但这里有个严重问题如果用户永远猜不对程序就永远循环下去。所以写 while 循环时必须确保循环体内最终能让条件变成 False这是最常见的死循环原因。5.2 for 循环与 range()知道要循环多少次for循环适合“知道要遍历多少次”的场景。它不止可以遍历数字区间还可以遍历字符串、列表、元组、字典等任何可迭代对象。for i in range(5): print(f第 {i1} 次打印)range(5)生成 0、1、2、3、4 五个数字。range(start, stop, step)的完整用法比如range(1, 10, 2)生成 1、3、5、7、9。遍历列表是 for 最常见的用法fruits [苹果, 香蕉, 梨] for fruit in fruits: print(fruit)这段代码逐一把列表中的元素取出来赋给变量fruit然后执行循环体。很多初学者会把for fruit in fruits理解成“把 fruits 第 i 个元素拿出来”这种理解其实不准确。实际上 for 循环是逐个“迭代取元素”和索引无关除非你需要知道元素位置才需要用range(len(fruits))配合下标访问。5.3 break、continue 与循环 else流程控制的利器写循环时break和continue是两个非常重要的控制语句经常配合条件判断使用break立刻跳出整个循环。continue跳过本次循环的剩余代码直接进入下一次循环。举个例子打印 1 到 10遇到 5 就结束循环for i in range(1, 11): if i 5: break print(i)输出是 1、2、3、4遇到 5 直接跳出。如果改成continue输出是 1、2、3、4、6、7、8、9、10因为遇到 5 时跳过了这次打印但循环继续执行。break和continue用多了代码可读性会变差。有些公司会建议循环里的判断尽量用 if 组织减少中途跳出。不过对于新手先把这两个语句用熟再谈代码风格。for 循环还有一个冷门但实用的特性else子句。它在循环正常结束没有被 break 中断时执行专门用来处理“没找到”的场景。比如在列表中查找一个元素nums [1, 5, 8, 13, 22] target 9 for num in nums: if num target: print(找到了) break else: print(没找到)如果列表中存在 target触发 breakelse 不会执行如果遍历结束都没找到else 就会执行。这个写法比用一个标志位管理状态干净很多。5.4 循环嵌套打印九九乘法表循环里面套循环叫循环嵌套。外层循环每执行一次内层循环要完整执行一轮。九九乘法表是最经典的嵌套循环案例for i in range(1, 10): for j in range(1, i 1): print(f{j} * {i} {i * j}, end\t) print()外层循环 i 控制行数内层循环 j 控制每行打印几列。end\t让每条乘法结果用制表符分隔不换行内层循环结束后print()换行进入下一行。运行结果1 * 1 1 1 * 2 2 2 * 2 4 1 * 3 3 2 * 3 6 3 * 3 9 ...嵌套循环对新手来说有点绕但核心就一句话内层循环跑完一轮外层循环才跑一次。在纸上画一画循环的轨迹很快就能理解。循环嵌套还经常用来处理二维数据比如表格、矩阵、棋盘这些场景后续学习都会用到。6. 综合实战用三种结构写一个“猜数字”程序6.1 程序功能设计与拆解学完基础知识加三种结构如果不做一个综合小项目总觉得心里发虚。下面设计一个完整的猜数字游戏把顺序、选择、循环全部装进去。功能需求如下程序随机生成一个 1 到 100 的整数。用户输入猜测的数字。如果猜大了提示“太大了”猜小了提示“太小了”。猜对了提示“恭喜”并告诉用户一共猜了几次。如果输入的数字不在 1 到 100 之间提示输入不合法不算次数。不要小看这些需求它已经覆盖了三种结构的全部核心知识点。随机数生成要用到random模块输入校验需要 if 分支猜的过程用 while 循环计次用变量累加。设计思路是先拆解模块画脑图模块 A 生成随机数模块 B 接收用户输入并校验模块 C 比较输入与目标并给反馈模块 D 循环直到猜对。每个模块的实现独立最后在主流程里像拼积木一样拼起来。6.2 完整代码实现与逐行解读直接上完整代码import random secret random.randint(1, 100) attempts 0 print(猜数字游戏开始目标数字在 1~100 之间。) while True: try: guess int(input(请输入你猜的数字)) except ValueError: print(输入无效请输一个整数。) continue if guess 1 or guess 100: print(请输入 1~100 范围内的数字。) continue attempts 1 if guess secret: print(太大了) elif guess secret: print(太小了) else: print(f恭喜你猜对了目标数字就是 {secret}你一共猜了 {attempts} 次。) break逐行解释关键点while True是一个死循环表面看起来危险但配合内部的break就没问题。这种写法常用于“直到满足某个条件才退出”的场景。try / except ValueError是异常处理用来处理输入非数字的情况。int(input(...))如果输入内容是abc会抛出ValueError。异常处理是进阶内容这里顺带展示一下它能防止程序因为非法输入直接崩溃。attempts 1放在输入合法的判断之后确保非法输入不计入次数。判断结果用 if / elif / else 结构分别处理太大、太小、猜对三种情况。猜对后输出结果并break跳出循环。6.3 如何找 Bug模拟一次完整游戏光写完代码还不够你要学会“模拟人脑执行”把代码跑一遍逻辑。假设目标数字 secret 是 67用户输入 80guess 80范围判断通过attempts变为 1if guess secret成立输出“太大了”。用户输入 50guess 50范围判断通过attempts变为 2if guess secret不成立elif guess secret成立输出“太小了”。用户输入 67guess 67attempts变为 3两个分支都不成立进入 else输出“恭喜你猜对了……”break 退出循环。如果用户输入abc程序会走到except ValueError打印“输入无效”然后continue直接进入下一次循环不会崩。这就是异常处理的价值。这个程序还可以扩展比如限制最多猜 7 次猜超了就失败或者记录用户的最低猜测记录或者把目标数字的生成范围改成可配置的。建议你自己改一改这些需求每多改一个功能你对三种结构的理解就更深一层。7. 常见问题与排查技巧实录7.1 缩进错误Python 最经典的报错错误提示IndentationError: expected an indented block是新手见得最多的报错。原因很简单该缩进的代码没有缩进或者缩进不一致。Python 用缩进表示代码块不像其他语言用花括号。解决办法统一使用 4 个空格做缩进不要混用 Tab 和空格。很多编辑器比如 VS Code、PyCharm默认按一次 Tab 键就自动转换成 4 个空格建议开启这个设置。如果代码里混了空格和 Tab大多数代码编辑器底部状态栏会显示缩进方式把全部代码选中用“重新缩进”功能一键统一。7.2 类型错误input() 返回的其实是字符串前面提到过input()的返回值永远是字符串。这个是几乎所有 Python 入门者都踩过的坑age input(请输入年龄) print(age 1)这行会报TypeError: unsupported operand type(s) for : str and int。你需要用int()转换一次age int(input(...))。如果输入的是浮点数比如“18.5”用float(input(...))。这里要特别提醒一个坑点如果你把int()包在外面用户输入了18.5程序会报 ValueError。你可以用float()先转换或者用try/except方式友好处理。实际项目中用户输入什么不可控所以做严格的输入校验是一个习惯问题不是会不会的问题。7.3 死循环程序卡死不动了如果你运行程序时发现光标一直闪、输出一直滚动那多半是死循环了。while 循环的条件永远为 True循环体里又没有 break 可以跳出。最经典的错误i 1 while i 5: print(i)i 的值永远不变化条件永远成立疯狂打印 1。正确的做法是在循环体内加i 1。还有一个很容易犯的错写成。在 if 判断条件里if x 3是语法错误Python 的赋值表达式有限制但while guess ...这种写法可能会引发奇怪的行为。比较用双等号赋值用单等号这两个符号的作用天差地别。7.4 边界值问题区间判断到底用 还是 写条件判断时边界值是很容易出错的地方。你要想清楚“这个范围包不包括边界”。比如打印 1~100 的数字range(1, 101)是从 1 到 100 包含 100。range(1, 100)是 1 到 99不包含 100。range(100)是 0 到 99不包含 100。很多初学者在 range 参数上纠结半天其实规律很简单range 是前闭后开区间起始值包含结束值不包含。你只要记住第二个参数写“想结束的值 1”就可以了。区间类型的选择结构也有同样的边界问题。判断成绩“及格”用 60还是 60含不含 59.5这些细节不同业务要求不同但你自己心里必须清楚“哪个数字算在哪个分支里”否则测试时很容易漏边界。7.5 中文输入法引出的隐藏 Bug这个坑最隐蔽说出来你可能不信很多报错并不是代码逻辑有问题而是输入法的锅。Python 里的标点符号必须是英文的。中文的冒号“”、中文的括号“”、中文的引号““””、中文的逗号“”放在代码里全会报错。写代码的时候建议把输入法切成英文模式或者专门用一个能自动补全符号的编辑器。有时候你会看到程序报错“invalid character in identifier”这就是代码里混进了不可见的 Unicode 字符比如全角空格删掉报错位置附近的代码重打一遍就好。8. 我的几点实操体会最后分享一点个人的经验。我带过不少刚入门的朋友发现大家常见的误区是想一口气学完所有语法再动手写项目。实际上 Python 的基础知识够用到“能写一个猜数字游戏”这个程度就已经可以停下来做项目了。因为后面无论是学列表推导式、函数、类还是学爬虫和数据分析都会在实战中反复用到今天说的这些基础。基础不是靠背熟学扎实的是靠频繁使用练扎实的。学三种结构的时候建议把每个小知识都改一改再运行一遍。比如写完 if 判断把改成看看输出有什么变化写完 for 循环把range(5)改成range(1, 5)看看少了哪个数字。这种“故意改错再观察”的方法比单纯抄正确代码记得牢得多。以后你去看任何 Python 项目源码第一件事不是逐行读而是先找三个东西if 在哪里分支、while 和 for 在哪里循环、主流程从哪里开始执行。一旦找全了这段代码的骨架就被你摸清了。学会用三种结构的视角拆解代码你就完成了从“看热闹”到“看门道”的转变。
返回列表