Python顺序结构入门:从变量、数据类型到输入输出的基础实战
很多刚接触编程的朋友拿到一本教程翻到“第1章 Python 顺序结构”看两眼就划过去了——觉得无非是“从上往下执行”嘛有什么好学的但实际带过几个零基础的朋友入门之后我发现这一章恰恰是劝退率最高、也是理解门槛最容易埋雷的一章。顺序结构看着简单但它背后藏着变量从哪来、数据怎么存、输出怎么排版、输入怎么转类型这一连串基本功。这一章要是没吃透后面学分支、循环、函数每写几行代码就要回来翻笔记。这篇文章就围绕 Python 顺序结构这一章拆开揉碎讲清楚它到底在学什么、每个语法点的原理是什么、实操时怎么避坑。有经验的读者可以直接跳到自己薄弱的小节纯新手建议从头到尾顺着读一遍跟着代码敲一遍这章过完之后你的 Python 地基就算真正打稳了。1. 顺序结构的本质程序为什么默认“从上往下”1.1 计算机没有“大局观”只有“执行序列”顺序结构在教科书里的定义通常是程序按照代码书写的先后顺序从上到下、一行一行依次执行每条语句执行完再执行下一条。这话没有错但只记住了定义没有理解它的分量。我经常用排队打饭来类比你站在食堂窗口前师傅不会因为你昨天在他窗口买过饭就先给你打也不会因为你长得着急就少收你钱。他只能按照队列顺序第一个人打完第二个上第三个接着上。Python 解释器也是这样它不聪明没有一个“整体预览”的能力它拿到你的.py文件后就是逐行扫描、逐行解释、逐行执行。前面一行报错后面的一律不碰。这一点在初学者写代码时体现得特别明显。有人写了三行代码第二行有语法错误他来问我“为什么第三行没执行”我说你第二行就挂了解释器当场罢工第三行根本没机会运行。这就是顺序结构的第一条铁律执行顺序 书写顺序并且错误会中断整个执行流程。print(第一步买票) print(第二步过安检) print(第三步上车)这段代码没有任何复杂逻辑但它反映的就是顺序结构的全部本质。你把它倒过来写输出顺序就倒过来。Python 不会“聪明地”帮你调整顺序它绝对服从书写顺序。1.2 流程图的思维任何程序都能拆成“步骤清单”顺序结构对应到流程图就是从上到下一串矩形框一个框接一个框。看起来很简单但真正写复杂项目时能把一个需求拆成顺序步骤的人写出来的代码才清晰。我见过很多新手拿到需求直接开写写一半发现逻辑乱成一团就是因为脑子里没有“先做什么、再做什么、后做什么”这层拆解。举个例子写一个“计算梯形面积”的程序。正常人的第一反应是先读上底、下底和高然后套公式最后输出结果。这本身就是天然的三个顺序步骤输入 → 处理 → 输出。计算机程序几乎全是这种模型的变体。输入可能是键盘敲进去的可能是文件读进来的也可能是网络请求带过来的处理可能是数学运算可能是字符串拼接也可能是复杂的数据整理输出可能是屏幕打印可能是写入文件也可能是返回给其他系统。所以学顺序结构真正的核心不是记住“从上往下”这四个字而是养成一个习惯拿到任何需求先强迫自己写出“步骤清单”再对照清单写代码。步骤清单写不顺的时候代码肯定也写不顺。2. 三大基础能力print输出、input输入、变量赋值2.1print()不只是“打印”它是你窥探程序唯一的窗口第一个要掌握的语句就是print()。教科书上管它叫“输出语句”但我更喜欢叫它“调试之眼”。程序跑起来之后是个黑盒里面变量是什么值、走到了哪一步你全看不见。唯一能看见的方式就是用print()把它打印出来。print()的基本用法是print(要输出的内容)括号里可以是字符串、数字、变量也可以是它们的组合。这里面有几个细节新手容易懵第一是引号问题。你想输出一句中文“你好”必须写成print(你好)引号告诉 Python“这是一个字符串”。如果你写成print(你好)Python 会以为你好是变量名然后报NameError。见过太多零基础学员在这个地方踩坑然后一脸茫然地问我“明明照着书打的为什么报错”十有八九是print(你好)少了引号。第二是单引号和双引号可以混用。print(你好)和print(你好)完全等价。但如果你要输出的内容里本身带有引号比如要输出他说你好最省事的办法是外层用单引号内层用双引号写成print(他说你好)。反过来外层双引号、内层单引号也行。如果内外都是双引号就得用转义字符\。这一章不用急着背转义知道这个处理方法就够了。第三是多值输出。print()括号里可以用逗号隔开多个内容比如print(面积是, area)运行时会在逗号对应位置自动加一个空格。这个特性在调试时特别有用可以同时打印多个变量的值一眼看出谁对谁错。2.2 变量赋值数据得有“盒子”才能存下来学顺序结构绕不开变量。Python 变量和其他编程语言的变量有个显著区别它不需要声明类型。你在别的语言里可能要先写int x;再x 5;Python 直接一行x 5就完事。但“不用声明类型”不代表“没有类型”只是类型是在赋值那一刻由 Python 自动判断的。变量赋值的基本原则是变量名在左边值在右边等号表示“把右边的值放进左边的盒子”。新手最容易犯的经典错误是把等号当成数学里的“等于”。在数学里x x 1是不成立的但在程序里它就是一句话把x原来的值取出来加 1再放回x这个盒子里。这个“取出来、算出新值、放回去”的三步动作就是程序最重要的思维模型之一。还有一个常见迷惑为什么不能用中文做变量名其实 Python 3 允许中文变量名姓名 张三也能运行。但业内规范强烈不建议这么做一是因为键盘输入麻烦、跨平台兼容性差二是因为代码是写给团队看的不是写给 Python 看的保持英文变量名是基本职业素养。变量名建议用“蛇形命名法”小写字母开头多个单词用下划线连接比如total_score、student_name可读性远高于totalScore或totalscore。变量这块还有一个重要的点变量可以被重新赋值。第二次赋值不是把盒子里的值改掉那么简单而是让变量名重新指向一个新的值对象原来的值如果没人使用Python 的垃圾回收机制会把它清理掉。这个细节在讲“引用”概念时才会真正展开但顺序结构阶段只需要形成“变量名是贴纸不是盒子”的印象后面学列表、字典时你会感谢这个印象的。2.3input()输入程序从此会“听人话”只用print()输出程序就像只会广播不会接收的收音机。加上input()程序才具备交互能力。input()的作用是程序暂停运行等待用户从键盘输入一行内容然后把这一行内容作为字符串返回赋值给变量存储起来。基本用法name input(请输入你的名字) print(你好, name)运行这段程序时控制台先显示“请输入你的名字”然后光标闪烁等你敲键盘。你敲完按回车输入的内容就被装进name这个变量里下一行print再把它打印出来。这个过程就是一次完整的“输入 → 处理 → 输出”顺序结构示例。input()最大的坑初学者十有八九会踩它返回的一定是字符串。哪怕你输入的是数字18input()给你的也是字符串18而不是数字18。打个比方你对着话筒喊“18”话筒传出去的是“18”这个声音不是阿拉伯数字18这个数值。两者在计算机里是天壤之别。这个坑会在什么时候暴露当你试图做数学运算时。比如你直接写age input(请输入年龄) print(age 1)程序会直接报TypeError因为字符串和整数不能相加。正确的做法是先做类型转换age int(input(请输入年龄))把用户输入的内容先转成整数再参与运算。这也顺理成章地把我们引向了下一个重点数据类型和类型转换。3. 数据类型与转换程序语言的“普通话”和“方言”3.1 四种最基础的数据类型Python 里数据类型很多但顺序结构这一阶段最常用的是四种整数int、浮点数float、字符串str、布尔值bool。int整数比如3、-100、20240没有小数点。float浮点数比如3.14、2.0、-0.5带小数点。有些同学疑惑2.0明明是整数为什么称为浮点数因为计算机存储小数的方式是浮点表示法只要带小数点无论数值大小一律是float。str字符串用引号包起来的内容比如hello、Python。bool布尔值只有两个值True和False用于表示真和假。这个类型在分支结构章节会大展身手顺序结构阶段先认识一下即可。用type()函数可以查看一个变量或值的数据类型print(type(3))会输出class int。调试时用这招能快速确认变量到底是什么类型。3.2int()、float()、str()三个转换函数必须烂熟于心类型转换是顺序结构章节里衔接“输入”和“处理”的关键桥梁。既然input()返回字符串而数学运算需要数字就必须做转换。Python 提供了几个内置转换函数int(字符串) # 把字符串转成整数 float(字符串) # 把字符串转成浮点数 str(数值) # 把数字转成字符串三个函数有个共同特点把括号里的内容转换成目标类型。但要注意转换的边界条件。int(18)没问题结果是 18int(18.5)就会报错因为“18.5”不是合法的整数格式int(abc)同样报错因为根本没有对应的数字语义。换句话说int()只认“长得像整数”的内容。反过来float(18)是可以的结果是 18.0float(18.5)也可以结果是 18.5。str(18)更简单结果是字符串18这个操作经常用在拼接输出时。比如你想输出“我今年18岁”可以直接print(我今年 str(18) 岁)不加str()的话字符串和整数用相连照样报TypeError。还有一个实际开发中经常出现的需求连续输入多个数字并参与运算。初学者往往这样写a int(input(请输入第一个数)) b int(input(请输入第二个数)) print(两数之和是, a b)这里int(input(...))的嵌套写法本质就是“先获取字符串再立刻转成整数”。把它拆开写也可以temp input(请输入第一个数) a int(temp)嵌套写法和分步写法等价只是嵌套更简洁。初学阶段建议先拆开写看清楚每一步发生了什么再逐步使用嵌套写法。4. 格式化输出让你的结果既有颜值又有清晰度4.1 三个时代的三种写法很多新手学顺序结构只会最原始的逗号拼接输出name 张三 score 85 print(姓名, name, 成绩, score, 分)这样写能用但美观度和可维护性都很差。逗号分隔在输出时会自动加空格导致中文前后出现莫名其妙的空格比如输出变成“姓名 张三 成绩 85 分”看上去非常别扭。解决这个问题Python 先后有几种方案。早期版本常用%格式化操作符写法类似print(姓名%s成绩%d分 % (name, score))后来的版本又推出了format()方法print(姓名{}成绩{}分.format(name, score))。这两种方案现在还能在旧代码里看到但 Python 3.6 以后我强烈推荐直接用 f-string格式化字符串字面量写法最简洁name 张三 score 85 print(f姓名{name}成绩{score}分)f-string 的规则很简单在字符串前加一个f然后字符串内部用花括号{}包裹变量名或表达式Python 运行时会自动把这些位置替换成变量的值。这种写法的最大优点就是直观——你看一眼就知道输出结果会长什么样完全不用像%格式化那样来回对照占位符和参数列表。4.2 f-string 的进阶细节表达式、精度与对齐f-string 不只是简单的变量替换花括号里可以直接写表达式。比如a 10 b 20 print(fa与b的平均值是{(a b) / 2})花括号里先计算(a b) / 2再格式化输出。这样省掉中间变量代码更紧凑。保留小数位数也是控制台输出的高频需求。比如计算出来的平均值可能是 15.333333333333334你只想保留两位小数这时在花括号内加格式说明符average (a b) / 3 print(f平均值为{average:.2f}):.2f表示把average当作浮点数格式化保留两位小数。这个语法在后续做数据分析和报表输出时非常常用值得现在就记下来。对齐和补零这两种需求在按表格显示数据或生成定长编号时经常出现。对齐的写法是{变量:10}表示占用 10 个字符宽度如果是字符串默认左对齐数字默认右对齐。补零常见写法是{number:03d}比如把数字 7 输出成 007这在生成订单号、节拍号时极其实用。等你有天用 Python 批量生成文件名时就会后悔当时怎么没把这一页多看两眼。格式化输出看似是个“面子工程”实际上它对调试效率的影响非常大。输出信息清晰、对齐、带单位你扫一眼控制台就能定位变量异常输出全挤在一起、没有标签一行数据里哪个是年龄哪个是成绩都分不清调试体验会非常差。把输出当成面向自己的一面镜子去打磨是值得的。5. 表达式与运算符优先级顺序结构里的“隐形规则”5.1 算术运算符全家福顺序结构章节一定会出现的另一块内容是算术运算符。Python 支持的算术运算符包括加法-减法*乘法/除法结果是浮点数//整除结果是整数向下取整%取余结果是整数**幂运算这七个运算符里/和//的区别是初学者重灾区。7 / 2的结果是 3.57 // 2的结果是 3。如果你需要的是精确小数用/如果你需要的是整除后的整数部分用//。%取余运算在现实场景中用途极广但初学阶段很难体会到。最常见的例子是判断奇偶number % 2等于 0 就是偶数等于 1 就是奇数。再比如取一个两位数n的个位数n % 10。这些技巧在你学到分支结构时马上就会用上。**幂运算也很好记2 ** 3表示 2 的三次方结果是 8。初学者容易写成2 ^ 3这是很多语言的历史遗留写法Python 里^是位异或运算不是幂运算用错了结果会很诡异。5.2 优先级口诀与“括号拯救世界”混合运算时Python 按照数学里的惯例优先级执行先算乘除和取余整除、幂运算优先于乘除、加减最后同级运算从左到右。如果记不住全排列只记一条口诀就够了乘方 乘、除、整除、取余 加减括号最优先。实际写代码时我坚持一个原则能加括号就加括号。不是因为记不住优先级而是为了让读代码的人不需要动脑回忆优先级。代码是写给人看的顺带让计算机执行。你用一堆隐式优先级写出result a b * c ** 2 // 3 % 2这种表达式后续维护时自己看着都头疼。该加括号的地方加括号不用怕别人说你啰嗦清晰的优先级表达本身就是代码质量的一部分。这里还要提醒一个顺序结构阶段的隐性议题赋值语句的右侧先计算再赋值。比如total 0 total total 10第二行代码执行时是先把右侧total 10算出来再赋值给左侧的total。如果你把理解顺序搞反以为“先赋值再计算”后面学循环时total total i这种累加器就会云里雾里。右侧先算、再赋值这个规则要刻在脑子里。6. 顺序结构实战从需求到代码的完整流程拆解6.1 实战案例计算圆的周长和面积纸上谈兵到这里不如来一个完整案例。需求输入圆的半径输出圆的周长和面积结果保留两位小数。按我们前面说的步骤清单法先拆步骤提示用户输入半径转换成浮点数。根据公式计算周长周长 2 × π × 半径。根据公式计算面积面积 π × 半径²。输出结果保留两位小数。写成代码import math r float(input(请输入圆的半径)) circumference 2 * math.pi * r area math.pi * r ** 2 print(f圆的周长为{circumference:.2f}) print(f圆的面积为{area:.2f})这里有三个值得注意的细节。第一import math导入了 Python 的数学模块。模块是 Python 的重要组成部分顺序结构阶段先知道“想用更高级的数学函数就 import math”这个基本套路即可。后面学到函数和模块时会系统展开。第二为什么用float而不是int接收半径因为半径可能是 2.5、3.14 这类小数。用int的话输入 2.5 会直接报错。做带小数的计算时统一用float转换更稳妥。第三面积公式里r ** 2表示半径的平方比写r * r更清晰、更贴近数学表达。我把这段代码给零基础的朋友跑了一遍他问了一个特别好的问题“公式里的乘法能不能像我手写一样2πr直接写”答案是否定的。计算机语言里乘号不能省略2 * math.pi * r才是合法的表达式。这是很多新手从数学写法转向编程写法时必须跨过的坎。6.2 实战案例两数交换的三种方式两数交换是顺序结构章节的经典题目。需求输入两个整数a和b交换它们的值并输出。这道题看着简单但真的有人会写出“用了第三方变量”之外方案的困惑。最传统、最稳妥的写法a int(input(请输入第一个整数)) b int(input(请输入第二个整数)) temp a a b b temp print(f交换后 a {a}b {b})temp就是那个“临时中转站”。生活化类比是你有两个杯子一杯装可乐一杯装雪碧想互换内容必须借助第三个空杯子。偷懒的写法是a b; b a——这样两个变量最终都会变成原b的值因为第一句a b已经把原来的a覆盖掉了。Python 里还有一个更优雅的写法a, b b, a一行搞定。这行代码利用 Python 的元组打包和解包机制等号右侧先打包成一个元组(b, a)再整体解包赋值给a和b。不需要中间变量理解起来也不难。同时掌握两种写法既能理解底层原理又能写出简洁代码两全其美。6.3 实战案例把秒数转换成“时:分:秒”再上一个综合案例把输入的总秒数转换成“几小时几分钟几秒”的格式。比如输入 3661 秒输出1小时1分钟1秒。拆解步骤总秒数先除以 3600 取整除得到小时数剩余秒数除以 60 取整除得到分钟数再取余得到秒数。total_seconds int(input(请输入总秒数)) hours total_seconds // 3600 minutes (total_seconds % 3600) // 60 seconds total_seconds % 60 print(f{hours}小时{minutes}分钟{seconds}秒)这个例题完美展示了//和%的配合之道//用来取高位部分%用来留下低位剩余。先取走能整除的部分剩余部分继续处理这是顺序结构加运算符综合应用的极佳练习。我建议初学者把 3661、7199、3600 这几个边界值都输入一遍看看输出是否符合直觉。特别是秒数为 0 时输出“0小时0分钟0秒”虽然在语义上有点冗余但逻辑正确这正是程序“不会思考、只会执行”的体现。7. 常见问题与排查技巧实录学顺序结构阶段新手按错误频率排列基本就那几类。把这些记牢可以少走很多弯路。报错信息出现原因处理思路NameError: name x is not defined变量名拼错或字符串没加引号检查引号检查变量名是否前后一致TypeError: can only concatenate str字符串和数字用拼接用str()转换后再拼接或用 f-stringValueError: invalid literal for int()int()转换了非整数内容检查输入内容是否真的是整数SyntaxError: invalid syntax引号不匹配、括号不闭合检查当前行及上一行是否完整输出结果和预期不符运算符优先级错误加括号明确优先级拆开多种验证第一个NameError里有个特别经典的“假象”我见过一个同学写name input(...)下一行写print(nmae)把name拼错成了nmae程序报错他死活看不出来。这种“眼睛自动纠正”的毛病排查时最有效的办法是逐字读代码不要整句读只看字母拼写。或者借助编辑器的代码高亮——变量名如果没被正确识别颜色会不一样。第二个TypeError在格式化输出还没普及的代码里很常见。如果只是字符串和数字拼接报错优先换成 f-string 就完事。有些老 Python 教程让你用拼接现在这习惯可以放下了f-string 才是主流。第三个ValueError通常发生在input和类型转换嵌套时。用户手滑输入了18.5而程序里用的是int()就会报“无效的 int() 字面值”。如果你期待小数就用float()如果你就是想要整数那么提示用户时把要求写清楚从源头降低错误概率。排查工具方面我强烈建议初学阶段养成一个习惯在可疑代码行附近插入临时print()把中间变量的值打出来。用久了你会发现很多“玄学” bug 本质都是变量值和预期不符而print()就是最直接的照妖镜。等以后接触调试器debugger了这个习惯依然有用。8. 顺序结构章节学习路线建议8.1 学到什么程度算“过关”顺序结构虽然是 Python 的第一座小土丘但它的验收标准并不低。我给自己定的过关标准是拿到一个需求能快速拆出“输入什么、处理什么、输出什么”并且能写出至少一种可行实现看到报错信息时能根据错误类型判断问题出在“语法”“类型”还是“逻辑”上能在不查资料的情况下独立完成“输入两个数交换并输出”“根据半径计算圆周长面积”这类经典练习题。这三个标准里最后一条“不查资料独立完成”尤其重要。编程是手上功夫跟学游泳一样看一百遍视频不下水永远学不会。顺序结构看似简单不实际操作的话连int(input(...))这种嵌套结构都会觉得自己会了但写不出来。8.2 往后章节的衔接关系顺序结构学扎实了后面自然会遇上的东西是分支结构if、循环结构for、while、列表、函数。顺序结构是这些章节的地基。学分支结构时你需要判断用户输入的年龄是否大于 18这依赖你已经掌握input和类型转换。学循环结构时最经典的题目就是“累加求和”而累加的实质就是total total i这正是顺序结构赋值语句“右侧先算再赋值”的延伸。学列表时你需要“输入多个成绩”这一口气读入多个值并逐个处理的能力也建立在理解数据怎么进、怎么存的基础上。所以不要再觉得“顺序结构简单翻翻就过去了”。地基打得稳不稳决定你之后楼能盖多高。我见过不少同学跳过基础直接学爬虫、学网页开发结果遇到异常报错反而回来补基本功兜了一大圈。老老实实把这一章过一遍后面学什么都会顺很多。最后说一点个人体会我自己每次教新人都会把顺序结构这一章的教学时间拉得比教材建议的长一点。不是因为难而是因为初学者的畏难情绪往往就藏在这种“看起来简单”的章节里。当你亲手敲出第一个能运行的程序看到控制台打出自己设计的一句话时那种成就感是后续学习最好的燃料。希望你也能沉下心来把每一个print、每一行赋值都亲手敲一遍别复制粘贴。代码这个东西只有手指敲过才是真正学会的。如果你在练习过程中卡住了欢迎带着报错信息和你的代码来找我聊聊。排查问题的过程往往比答案本身更有价值。