我最初学Python时最崩溃的不是语法看不懂而是看懂了每个单词却不知道代码为什么报错。尤其是刚接触数据存储这个概念的时候我一度分不清数字和字符串屏幕上明明显示的是1可一相加结果却是11。后来才想明白这只是因为我没搞懂Python底层是怎么存数据的。Day01这堂课我把这些最基础也最容易劝退新手的点一次性讲透。这份内容适合两类人一是完全零基础、昨天才安装好Python的纯新手二是写过一点代码但从没系统理过变量、类型、运算规则的朋友。只要把今天这几块弄明白后面学列表、字典、循环会顺很多。所有案例我都用最新稳定版Python测过你本地装的是Python 3.8以上版本就能直接跑。下面开始。1. 别急着写代码先把运行环境这件事弄扎实很多新手第一行代码还没写就先被环境变量pip解释器这几个词折腾得想放弃。我遇过太多问为什么我双击Python文件没反应的同学问题基本都出在安装阶段。1.1 安装时最关键的勾选Add Python to PATH不管你是从官网下载的Python安装包还是用Microsoft Store装的安装那一步都有个特别不起眼的复选框写着Add Python to PATH添加到环境变量。中文版可能显示将Python添加到PATH。这个选项默认是没勾的很多人装完没注意直接点Next到底结果在cmd窗口输入python电脑回一句不是内部或外部命令。这时候其实不用急着怀疑自己装坏了。打开安装包重新跑一遍选Modify修改把Add Python to PATH勾上一路下一步就能修好。PATH到底是什么简单理解就是一个通讯录你在命令行里敲python系统就要翻这个通讯录去找到python.exe在哪个目录。通讯录里没登记它自然找不到。如果你确实不想重装也可以手动把Python安装目录和Scripts目录加进系统环境变量。安装目录通常在C:\Users\你的用户名\AppData\Local\Programs\Python\Python311\Scripts目录是它下层的Scripts文件夹。在此电脑右键属性、高级系统设置、环境变量在Path变量里追加这两个路径就行。这个方法我试过很多次唯一要注意的是设置完必须重新打开cmd窗口旧窗口不会读新配置。1.2 用三个命令自检到底装好没有装完以后别急着写代码先做个体检。打开cmdWindows按WinR输cmd回车或者macOS/Linux的终端依次敲下面三行命令python --version pip --version python -c print(hello)理想输出是三行都能看到版本号或hello。如果第一行有版本号但第二行报错说明pip没配好如果python能用但pip报错多数情况是Scripts目录没进PATH。市面上还有一些教程会让你装Anaconda或Miniconda我的个人建议是如果你只是想学Python基础系统自带的官方Python就够了如果你后面要搞数据分析、科学计算、机器学习再换Anaconda也不迟先不用一步到位。另外遇到过不少人问我想装numpy/cv2这种库怎么装。这个等做项目时再学完全来得及。今天你要记住的就一个以后凡是下载第三方库统一在命令行输pip install 库名等进度条跑完就代表装好了。现在你只需要确认pip能输出版本号。2. 变量是贴标签不是存东西理解Python的存储机制我见过很多初学者第一天学变量的时候教材上画了一个盒子说变量就是往盒子里放东西。这个比喻在C语言里勉强说得通但在Python里容易留下一个错误的思维定式。Python里变量和数据的关系更像是在给数据贴名字标签。2.1 标签式存储和盒子式存储的区别C语言里你声明一个变量就是在内存里申请一块固定大小的空间往里放数据变量和空间绑定。但Python不是这个逻辑。Python里有个叫对象的概念所有数据都是对象运行时会为每个对象分配内存变量本身不装数据只是贴在那个对象上的一个名字。用代码演示一下就明白了a 100 b a a 200 print(b) # 结果是100不是200按盒子的思路b应该跟着a一起变成200因为你在同一个盒子里放了新东西。但Python里b只是之前那个100对象上的一个名字后来a重新指向了200这个新对象b还贴在100上不动所以b永远是100。这个差异初看没什么大不了但等学到列表、字典、函数传参的时候如果你一直用盒子思路去想会反复踩坑。2.2 用id()和type()把变量看穿想确认变量到底贴在哪个对象上Python给了两个内置函数id()看身份type()看类型。x 3.14 print(id(x)) # 一个很大很长的整数表示x指向的内存地址 print(type(x)) # class float y x print(id(y)) # 和id(x)完全一样说明y和x贴的是同一个对象这个验证方式特别有意思。当你发现两个变量id一致说明它俩共享同一个对象id不一致说明是两份独立的数据。我写代码排查诡异bug时经常靠id来判断某个变量是不是被意外复制了。2.3 四种基础数据类型各自的地盘和脾气Day01你只需要掌握四类整型int、浮点型float、字符串str、布尔型bool。整型int没有小数点的数可以是正数、负数、0。和其他语言不同Python的int位数没有硬上限大数运算不会直接溢出。浮点型float带小数点的数数学里的小数在计算机里是近似存储这点后面专门讲。字符串str用单引号或双引号包起来的一串字符hello、世界都算。注意12是数字而12是字符串这俩性质完全不同。布尔型bool只有两个值True和False注意首字母大写写成true会直接报NameError。判断一个数据是什么类型除了用type()还可以用isinstance()print(isinstance(123, int)) # True print(isinstance(123, int)) # False字符串不是数字这个函数以后写代码经常用尤其处理用户输入时拿来校验类型非常顺手。3. 运算规则加减乘除之外的坑可能比你想象的更多数据的存储搞清楚了接下来是运算。Python的运算符看着简单里面藏着不少能让你怀疑人生的细节。我记得有次给一个VBA转Python的同事讲/和//的区别他当场表示你们Python怎么这么反人类。3.1 除法、整除和取模一次分清先看这四行代码猜输出print(7 / 2) # 3.5 print(7 // 2) # 3 print(7 % 2) # 1 print(2 ** 3) # 8/是普通除法结果永远是浮点数。就算4 / 2结果也是2.0而不是2。这在Python 3里是硬性规定别想着改成整数。//是整除向下取整。注意它的向下-7 // 2结果是-4不是-3因为它找的是比真实商更小的整数。-3.5向下取整就是-4。很多人在负数这里栽过跟头。%是取余数符号和除数保持一致。**是幂运算。实际应用里%有个很经典的用途判断奇偶。num % 2 0就是偶数 1就是奇数。判断一个年份是不是闰年也会用到(year % 4 0 and year % 100 ! 0) or (year % 400 0)。另外在循环里i % 7 0可以用来做每7个换一行之类的排版逻辑非常高频。运算符优先级如果懒得记一个通用技巧多写括号。(a b) * c一眼就能看懂意图写成a b * c的优先级虽然数学上没错但阅读代码的人容易误解。性能和括号几乎无关宁可多打一个括号也不要留歧义。3.2 浮点数的精度问题0.1 0.2 不等于 0.3这个坑我敢说每个学Python的人都遇过。你在Python里运行print(0.1 0.2)结果不是0.3而是0.30000000000000004。原因一句话计算机用二进制存小数而0.1和0.2的二进制是无限循环小数存的时候就产生误差了加完之后误差还在。这不是Python的bugC、Java、JavaScript全都有。解决办法也简单别直接用浮点数做精确比较。要么用round()限定小数位数print(round(0.1 0.2, 2)) # 0.3要么比较时允许一个极小的误差常见做法是a 0.1 0.2 b 0.3 print(abs(a - b) 1e-9) # True误差小于一亿分之一就算相等如果将来你处理金额这类必须精确的数据别用float用decimal.Decimal那是另一个话题Day01先记住浮点数不可迷信就够了。3.3 比较与逻辑运算短路求值是怎么救你的比较运算符没什么悬念等于、!不等于、、、、。这里只需要注意一个细节判断相等是两个等号一个等号是赋值。手快写错的话代码虽然不报错但逻辑会出大问题。逻辑运算符and、or、not值得好好讲。Python里的and和or有短路求值特性计算左边就已经能确定整个式子的结果时右边就不再执行。举个例子user_input result user_input and int(user_input) print(result) # 输出空字符串而不会执行报错的int()当user_input是空字符串时空字符串是假值and左边为假整个结果已经确定是假所以右边的int(user_input)根本不会被调用自然也不会因为int()报错。这一招可以当成廉价的安全阀后面做配置文件解析、用户输入处理时很实用。or的短路逻辑用来设置默认值也特别好使name input(请输入姓名) or 游客用户直接回车input返回空字符串空字符串是假值于是or继续算右边最终name就变成了游客。用一行代码实现没填就用默认值。4. 类型转换int(3.14)为什么报错数据存储和运算的桥就是类型转换。我见过太多新手卡在这一步尤其是从input()拿到数据之后直接做加法报错然后一脸懵。4.1 显式转换的口诀转什么就调用什么Python提供三个最基本的内置转换函数int(123) # 变成整数123 float(3.14) # 变成浮点数3.14 str(100) # 变成字符串100口诀是转什么就调用什么想转成整型就int()想转成浮点型就float()想转成字符串就str()。必须注意的是int()转换字符串时要求内容本身是合法的整数。int(3.14)会直接抛出ValueError因为3.14不是整数格式。想转带小数点的字符串就得先用float()再考虑要不要int()value float(3.14) print(int(value)) # 3注意这是向下取整不是四舍五入如果你想要四舍五入得用round()round(3.6)结果是4。这几个函数分工不同别混用。4.2 input()返回的永远都是字符串这是Day01最应该刻在脑子里的点。哪怕你输入的是age input(请输入年龄)用户输18你拿到手里的也只是一个字符串18不是数字18。此时如果直接age 1Python会报错TypeError: can only concatenate str。正确做法是先转换再运算age int(input(请输入年龄)) print(age 1)把input包在int()里转一遍就解决了。但这样写有个隐患用户一旦不小心输入了abc程序直接崩溃。所以更稳的写法是配合异常处理这个后面章节会专门讲你现在只要先养成input拿到的就是字符串需要数字就显式转换的意识。4.3 隐式转换与bool为什么True 1 2有些情况下Python会自动转换类型不用你手动调函数。比如整型和浮点型做算术时整型会被隐式提升为浮点型print(1 2.0) # 3.0结果是浮点型bool类型更特殊它是int的一个子类True等同于1False等同于0。所以print(True 1) # 2 print(False * 5) # 0这个特性偶尔会带来意料之外的结果比如列表里统计True的个数时能直接sum()。但初学阶段建议不要依赖这个特性看清类型再写代码避免为省一行代码埋下难读的雷。同样需要留神的是字符串和数字永远没有隐式转换。3 3直接报错必须手动转。Python在这点上比其他一些语言严格但严格其实是好事逼着你把类型意图写清楚。5. Day01收官实战写一个能判分的BMI计算器光看不练记不住。我建议你打开编辑器跟着写一个BMI计算器把今天说的存储和运算全部串起来。5.1 完整代码与逐行拆解BMI的公式是体重公斤除以身高米的平方。下面这个版本我加了最基础的用户输入和判断逻辑# BMI计算器Day01实战 weight float(input(请输入体重公斤)) height float(input(请输入身高米)) bmi weight / (height ** 2) print(您的BMI指数为 str(round(bmi, 2))) if bmi 18.5: print(偏瘦注意营养) elif bmi 24: print(正常范围继续保持) elif bmi 28: print(偏胖注意运动) else: print(肥胖建议咨询专业人士)第一行weight float(input(...))input返回字符串我用float()把它变成浮点数正好解决上一节说的坑。height ** 2是幂运算也就是身高的平方。round(bmi, 2)把结果四舍五入保留两位小数再用str()把数字转回字符串拼进print输出。后面的if、elif、else是条件判断不算今天重点但可以提前感受一下逻辑流程。这段代码你直接抄下来跑一下分别用1.75身高、70公斤体重试试应该能在控制台看到正常的判定输出。如果能顺利跑通说明你的环境、变量、运算、类型转换这四关都过了一遍。5.2 给计算器加一点防御让用户输错也不崩溃上面那版有个薄弱环节用户如果输入负数或者乱输字母程序会直接报错退出。发生这种情况该怎么办Day01你可以先学会这样一个保护写法try: weight float(input(请输入体重公斤)) height float(input(请输入身高米)) except ValueError: print(输入的不是有效数字程序退出) exit()try和except是对可能出错的代码做兜底如果try里面的代码触发了ValueError类型异常程序不会崩溃而是跳到except里执行备用逻辑。这套异常处理的完整规则后面还有更深的内容但今天先把它当成保险丝来用至少能保证你写完的程序不会因为一次误输入就黑屏退出。等你跑通这个版本我建议再亲手改一改比如把体重限制在20到300之间超过就提示数据不正常。这个过程能让你重新体会条件判断和类型转换的配合比再看十篇文章都管用。6. 今天做题时最容易踩的三个认知陷阱每次给新手改代码我都会反复看到同样的错误。这里集中说三个你今晚写作业时对照一下基本能避开七成以上的问题。第一个陷阱以为是等于的意思。是赋值把右边的东西贴到左边的名字上才是比较相等。这不是概念问题而是手速问题。我见过有人写了一整行if a 3然后报SyntaxError眼睛盯了三分钟才发现是少了等号。第二个陷阱混淆字符串和数字的展示结果。print出来都是看起来一样的字符但类型天差地别。建议在代码里多打印type()帮助自己确认。比如你觉得某变量是数字就临时输出一下print(type(变量))看到class str就知道问题出在哪了。第三个陷阱以为浮点数可以做精确计算。0.1加0.2不等于0.3这个例子不是冷门知识你迟早会在项目里撞上。今天提前知道以后真遇到就不慌了。用round()控制输出用误差范围比较大小记住这两个办法就够。这些陷阱本质上是对存储理解不透的连锁反应。你已经知道了Python的变量是标签、input返回字符串、float是近似存储再回头看书本上数据存储与运算这个标题会发现每个字都对应具体的代码行为而不是干巴巴的术语。最后分享一个我的个人习惯。每次装好一个新环境我不会急着写大段代码而是先从变量和运算开始做几个最小实验定义一个字符串、看一眼id和type、把一个字符串转成数字做加法。这个过程只需要两分钟但它能快速帮你确认自己的理解对不对也能验证环境是否真的可用。Day01的内容到这里就足够了剩下的就是在编辑器里多敲、多试、多报几次错——犯错本身就是学习Python速度最快的方式。