Python变量与格式化字符串:从命名到f-string一次讲透 📅 发布时间:2026/9/10 18:19:26 👁 浏览次数: 训练营第一期DAY 1打卡结束了群里陆陆续续收到大家的代码和截图有人一次跑通有人被环境折腾到半夜也有人卡在了变量命名上。作为这一期帮忙整理资料、回答问题的老学长我把自己备课和带打卡过程中的理解重新捋了一遍想用一篇文章把第一天最核心的内容讲透。这次打卡训练营是浙大疏锦行发起的Python打卡训练营第一天不绕弯子直接从变量和格式化字符串这两个基础概念开始。很多人觉得这两个词太基础了不值得专门学一天但等你看完这篇文章会发现变量背后对象引用的机制、f-string的高阶玩法哪怕是写了几年Python的人也未必全弄明白。这篇文章适合三类人第一类是刚接触Python、正在纠结从哪下手的零基础新手第二类是看过语法但总在报错里打转的自学者第三类是打算自己带新人、想找一套现成讲解思路的人。1. 第一天的内容为什么要这样设计1.1 变量和格式化字符串是整个编程思维的入口训练营第一天选这两个知识点不是随便拍的。你回想一下几乎每一个Python程序都由三件事构成数据、操作、输出。变量负责把数据存起来并给个名字格式化字符串负责把数据拼成人类能看懂的文字这两件事一结合你就能写出第一个有生命的程序——输入自己的名字程序叫你一声输入今天的天气程序提醒你带伞。我记得打卡第一天有位同学在群里问为什么学Python不是从爬虫开始而是从变量开始这个问题问得特别好。因为爬虫、数据分析、Web开发、自动化脚本本质上都是在做同样一件事先拿数据存进变量再通过某种方式把结果呈现出来。你第一天没把变量搞明白后面用pandas处理表格、用requests抓网页满屏的赋值语句会直接把你看晕。再说格式化字符串。很多人第一反应是字符串拼接用加号不就行了比如我叫 name 今年 age 岁。这种写法在交互和日志输出少的场合能跑但一旦变量多了、格式复杂了拼接式写法就会变成一场灾难——漏掉加号、忘记把数字转成字符串、括号嵌套错位排查起来特别费劲。所以训练营把格式化字符串放在第一天就是为了让大家从一开始就养成用结构化的方式组织输出的习惯而不是等写出几百行代码后再回来改。1.2 这一天的打卡任务为什么是做个自我介绍如果你看过这次打卡训练营的任务清单会发现DAY 1的打卡题很朴素用变量存储自己的姓名、学校、学习Python的天数再写一段格式化字符串把这些信息拼成一个完整的自我介绍。为什么选这个题目因为它同时覆盖了三层能力。第一层变量定义与赋值——你得知道怎么给数据起名字第二层字符串拼接与格式化——你得把多个片段组合成一个通顺的句子第三层类型转换意识——年龄和天数如果是数字直接拼进字符串大概率会报错你得学会用str()或f-string自动转字符串。这三层刚好是今后写一切代码的最小闭环。实际带练中发现认真完成这道题的同学后面学列表、字典、循环时适应速度明显更快。原因很简单这些数据结构本质上都是用变量装更多数据的扩展第一天把变量 名字 数据 类型这个模型刻进脑子后面所有的语法都只是往这个模型里塞更多花样。2. 变量到底在Python里意味着什么2.1 Python变量和其他语言变量最大的区别如果你之前学过C语言或者Java第一次接触Python变量时可能会觉得这也太随意了。C语言里写int a 5意思是分配一块能存整数的内存名字叫aPython里写a 5意思是给整数对象5贴上一个名为a的标签。这就是变量是标签不是盒子的核心区别。这个区别会导致一个非常反直觉的现象当你执行b ab并不是把a的值复制了一份而是和a指向了同一个对象。这一点在很多新手踩坑之后才会真正理解。举个例子a [1, 2, 3] b a b.append(4) print(a) # [1, 2, 3, 4]你只是改了ba也跟着变了。原因就是a和b这俩名字都指向同一个列表对象。初学阶段这个坑不一定立刻踩到但你记住一条经验可变对象列表、字典、集合的赋值本质上让多个变量共享同一份数据。想真正复制一份以后要用copy模块或者用切片、copy()方法。不过训练营第一天不用急着把不可变对象可变对象这些概念全讲完我通常建议新手先记一个结论数字、字符串、元组是改不动的列表、字典、集合是能改的。等写到后面遇到具体的坑了再回头把这个结论展开理解成本会低很多。2.2 新手必看的命名规则与命名习惯Python对变量名的语法要求就四条只能由字母、数字、下划线组成不能以数字开头不能和Python内置关键字冲突大小写敏感。这四条是硬性规定违反任何一条都会直接报错。但语法之外真正影响代码质量的是命名习惯。训练营第一天我就强调过变量名要能读出来。你写n 10和写student_count 10前者省了几个字符但三天后你自己看代码都得猜n是什么。Python社区的标准习惯是变量名用小写字母加下划线也就是snake_case比如user_name、total_score常量一般用全大写加下划线比如MAX_RETRY、DEFAULT_TIMEOUT。还有两个细节很容易忽视。第一个是不要用拼音缩写比如用xb表示小白不如直接用beginner第二个是避免用单个小写字母做变量名特别是l和o因为它们在很多字体里和数字1、0长得很像。用i、j做循环计数是可以的这是惯例但功能性的变量尽量用有意义的单词。有个很典型的报错场景定义了username后面写print(user_name)结果报NameError。这种问题十有八九不是看不懂代码而是手滑打错了名字。我的排查方法是一眼扫过报错信息如果提到NameError先去看变量名是不是拼写不一致别急着怀疑Python坏了。2.3 赋值、修改与偷偷变掉的细节赋值语句在Python里还有一个容易让人困惑的点a a 1到底做了什么从数学上看这式子不成立但在程序里它的意思是取出a当前的值加1重新贴到a这个名字上。对数字这类不可变对象来说a的值变了但对象本身其实是新建了一个。这带来一个和格式化字符串直接相关的场景循环里累加字符串。很多同学一开始喜欢这么写result for item in [apple, banana, cherry]: result result item , 代码能跑但如果数据量很大这种写法效率比较低因为字符串是不可变对象每次拼接都会创建一个新的字符串对象。第一天不用深究性能问题但你至少要意识到一旦发现程序莫名其妙地慢别只盯着算法看看是不是在循环里反复做字符串拼接。后面学到join()方法后这个场景会彻底改观。另一个值得第一天就掌握的细节是多个变量同时赋值的写法name, age, city 小明, 18, 杭州这行代码优雅地同时给三个变量赋值比写三行赋值语句更清晰。等学到列表、元组时这种解包赋值的威力会更明显地体现出来。3. 格式化字符串的三种主流写法对比3.1 %格式化老代码里最常见的坑Python的格式化字符串有历史演进过程。最早的写法是%运算符它借鉴了C语言的printf风格name 小明 age 18 print(我是%s今年%d岁 % (name, age))%s代表字符串占位%d代表整数占位%f代表浮点数占位。这种方法的问题在于占位符和数据类型必须严格对应一旦写错或者参数个数对不上就会报TypeError排错体验很差。另外当变量特别多时占位符和后面的参数一长串非常容易看错位。但为什么还要提它因为你在看老项目、改历史代码时一定会遇到这种写法。尤其是很多教程里教print(%d %.2f % (num, price))这种用法如果完全看不懂别人贴给你的代码你就没法快速定位问题。我的建议是会读、能改但新代码里优先用下面的方案。3.2 str.format()曾经的主力选手Python 2.6到3.x时代format()方法成了主流因为它的占位符和参数可以分离写法更灵活print(我是{name}今年{age}岁.format(namename, ageage))花括号里的名字可以重复使用也可以不按顺序传参。还支持索引和属性访问比如{1} 和 {0}.format(first, second)。这套写法的可读性比%好不少但是每次都要写.format()代码一多会觉得啰嗦。而且如果字符串里恰好有花括号比如JSON模板就需要用{{和}}转义新手经常在这卡住。3.3 f-string现代Python的主场Python 3.6之后f-string也叫格式化字符串字面量成了官方推荐方案。它直接在被格式化的字符串前面加f然后在花括号里写变量名name 小明 age 18 print(f我是{name}今年{age}岁)注意看花括号里可以直接放表达式不用再调用.format()或者传参数。这行代码的易读性和容错性都比前两种高出一截。训练营里的打卡作业我要求大家一律用f-string写原因就是它最贴近所见即所得。f-string还有几个值得第一天就掌握的技巧。第一可以在花括号里直接做运算score 88 print(f下次目标{score 5}分)第二可以控制数字的小数位pi 3.1415926 print(f圆周率保留两位{pi:.2f}) # 3.14第三可以设置对齐和宽度name 小明 print(f{name:10}) # 右对齐宽度10不够的补空格这个在以后打印表格、输出日志时会非常有用。还有一个高级用法是在f-string里调用函数print(f姓名大写{name.upper()})花括号里不只是变量名而是一段有效的Python表达式。这是f-string真正的杀手锏也是为什么说它能写很多花样的原因。3.4 格式化字符串实战中的对齐、精度与嵌套实战中我见过很多同学在打印商品列表时挨个用制表符\t对齐结果中英文混排时怎么都对不齐。原因是中文字符宽度和英文不一样制表符会错位。这时用f-string的宽度控制就好很多items [(牛奶, 5.5), (面包, 8.0), (苹果, 3.75)] for name, price in items: print(f{name:6}{price:.2f})解释一下表示左对齐6表示占6个字符宽度:.2f表示保留两位小数。这样打印出来的表格中文英文都能基本对齐。如果以后有更复杂的对齐需求还可以用第三方的tabulate库但第一天把f-string的宽度控制用好已经足够了。还有一个容易踩的坑花括号嵌套。当你需要在f-string里使用字典的键时需要小心student {name: 小红, score: 92} print(f{student[name]} 的分数是 {student[score]})注意Python 3.12之前f-string里不能包含反斜杠也不能在花括号内使用与外部相同的引号类型。比如上面用双引号包整体里面字典的键就应该用单引号否则会报语法错误。这个细节不需要死记多写几次自然会形成肌肉记忆。4. 实操从零开始跑通第一个打卡程序4.1 动手前的环境准备下载、安装、验证训练营第一天有很大一部分时间其实是花在环境准备上。不管你用什么系统建议直接去Python官网下载对应版本。Windows用户有一个特别提醒安装时一定要勾选Add Python to PATH否则后面在命令行里输入python会有不是内部或外部命令的报错。装完之后打开命令行Windows是cmd或PowerShellmacOS/Linux是Terminal输入python --version如果输出了类似Python 3.11.5这样的版本号说明安装成功。这个验证步骤虽然简单但非常必要因为很多人装完不看结果直接打开编辑器写代码结果编辑器里找不到解释器、报错一堆折腾半天才发现是路径没配好。编辑器方面推荐VS Code装好Python扩展后体验很顺。在VS Code里按CtrlShiftPmacOS是CmdShiftP输入Python: Select Interpreter选中你刚装好的Python版本。这一步做完之后才能保证你按F5运行的是当前环境的Python而不是某个系统自带的旧版本。第一次跑通print(hello)的时候建议截图留念这是正式踏入编程大门的第一步。4.2 打卡题完整演示一个带反馈的自我介绍打卡任务是写一个自我介绍程序。这里我给一个稍作扩展的版本既覆盖变量和格式化字符串也顺手预演了字符串的常用方法# DAY 1 打卡变量与格式化字符串 name 疏锦行训练营成员 nickname 小白 school 浙江大学 python_days 7 target_skill 数据分析 # 基础自我介绍 intro f大家好我是来自{school}的{name}大家可以叫我{nickname}。 print(intro) # 加入学习进度和目标的句子 plan f我已经学习Python {python_days} 天了目标是掌握{target_skill}。 print(plan) # 用字符串方法做一个更友好的输出 upper_nickname nickname.upper() print(f我的昵称大写是{upper_nickname}) # 一句话总结 print(f今天学会的是变量与格式化字符串{nickname} 打卡完成)运行结果大致是大家好我是来自浙江大学的疏锦行训练营成员大家可以叫我小白。 我已经学习Python 7 天了目标是掌握数据分析。 我的昵称大写是小白 今天学会的是变量与格式化字符串小白 打卡完成这份代码虽然短但把这一天的三个核心点全部覆盖了定义变量name、nickname、school等、类型自动判断python_days是整数拼进f-string时自动转字符串、字符串方法upper()。打卡时不需要写得花哨关键在于每一步都清楚自己在做什么。4.3 提交前用一份自测清单检查训练营里不少同学提交的代码能跑但有隐患。所以我整理了一份检查清单提交前对照一遍能帮你少很多麻烦。变量名是否全部使用有意义的英文单词而不是拼音或单字母。格式化字符串是否优先使用f-string而不是大量加号拼接。打印输出里是否能清晰看出每个人的个性化信息。代码是否保存为.py文件文件名用英文且不包含空格。命令行里是否通过python 文件名的方式运行过一遍。还有一条容易被忽略提交代码时注意别把虚拟环境文件、缓存目录这些零碎文件一起发到群里要么复制代码文本要么只发.py文件干干净净的最省事。5. 打卡中常见的报错与排查方法5.1 变量相关的报错最常见的报错是NameError: name xxx is not defined。新手遇到这个报错的第一反应往往是Python是不是有Bug其实99%的情况是变量名拼写不一致、变量还没赋值就使用、或者把缩进搞错导致变量在内部作用域里定义但外部拿不到。举一个训练营里真实出现过的例子my_name 小明 print(myname)两行代码一个下划线之差直接报错。排查这类问题我的经验是沿着报错信息提示的代码行号往上找先看那个名字到底在哪里定义的。在编辑器里用快捷键搜索变量名能快速定位是哪个地方拼错了。另一种情况是TypeError: can only concatenate str (not int) to str。age 18 print(我今年 age 岁)这在字符串拼接的数字场景里特别常见。解决方案有两个要么先转字符串str(age)要么用f-string后者更推荐。5.2 格式化字符串相关的报错f-string的书写细节比较多常见报错是SyntaxError: f-string: expecting }。这条报错通常意味着你的花括号没有正确闭合或者内部表达式有语法问题。当我看到有人写f{name.upper()时就猜到少了一个右括号。再有一个高频场景是格式化小数位时报错price 99.99 print(f{price:.2f})没问题。但如果误写成f{price:2.f}或者把冒号写成分号就会触发各种语法错误。这类问题没有技巧只能多看遇到报错就回到字符串定义处一行行检查。还有一个中文标点问题这几乎是所有中文用户都踩过的坑。比如把f大家好里的双引号打成了中文引号Python直接SyntaxError。平时写代码时建议把编辑器里的引号、冒号、括号输入法切到英文模式能省下一大半语法报错。5.3 日常写代码容易忽略的代码规范小问题打卡阶段最普遍的问题是一行代码特别长。代码一旦超过屏幕宽度阅读体验就很差。建议在需要拼接长字符串或长逻辑时合理使用反斜杠\或者把表达式拆到多行。比如那句很长的print可以拆开写用括号括起来就会自动处理换行print( f大家好我是来自{school}的{name}。 f我是{nickname}。 )注意每段字符串前都要加f否则后面的变量会被当成普通文本。这个问题在实际编码中特别容易忽视。我在训练营里看到好几个同学因为只在第一行加f后面几行全变成了普通字符串输出结果完全不对。还有一个小习惯写完一段功能就print一下确认输出符合预期再继续下一段。很多同学习惯把所有代码一次性写完再运行报错之后面对一长串代码无从下手。第一天就养成小块验证的思路后面排错会轻松很多。| 报错信息 | 常见原因 | 解决方案 | | NameError: name xxx is not defined | 变量名拼写不一致或未赋值 | 搜索变量名检查拼写和赋值位置 | | TypeError: can only concatenate str | 字符串和数字直接拼接 | 使用f-string或str()转换 | | SyntaxError: invalid syntax | 中文符号、引号不匹配 | 切换到英文输入法检查括号引号 | | SyntaxError: f-string: expecting } | 花括号或表达式未闭合 | 逐字检查f-string内部写法 | | IndentationError: unexpected indent | 缩进不统一 | 统一使用4空格缩进不要混用Tab |6. 把第一天学到的东西延伸到后续学习路径6.1 适合马上动手的三个小练习训练营打卡结束后如果你觉得不过瘾可以试试这几个练习。它们不需要新语法但能把变量和格式化字符串用到更复杂的场景。练习一写一个找零计算器。定义商品价格和支付金额两个变量计算应找零多少并用f-string输出支付XX元商品XX元应找零XX元注意金额保留两位小数。练习二打印一张表格。用多个变量或列表模拟三个同学的姓名和成绩用f-string的宽度控制和对齐方式打印出规整的表格不要求表格有边框但列要对齐。练习三模拟一句动态欢迎语。定义时间变量比如9点根据时间判断输出早上好还是下午好还是晚上好再和姓名一起拼成完整问候语。这个练习会提前用到if判断但第一天试着碰一下也没关系遇到问题正好在群里提问。这三个练习的唯一目的是让你把变量和格式化字符串从语法变成习惯。真正掌握的标准不是你背会了规则而是写任何一行输出时下意识就会想到这个变量该叫什么名字、这个输出用f-string怎么写”。6.2 后续内容的路线参考一天打卡结束后训练营通常会把内容难度慢慢往上提。基于DAY 1的变量基础第二天一般会进入数字运算和字符串方法第三天进入列表和元组第四天进入条件判断第五天进入循环第六天进入字典第七天做一个小项目。整个过程大概两周就能覆盖Python最常用的核心语法。我特别想强调一点不要急着在一周内把所有语法过完也不要因为某一天打卡没赶上就焦虑。我第一次带训练营时发现能真正坚持到最后的同学靠的不是爆发力而是每天固定抽出十几分钟的节奏感。变量和格式化字符串看着简单但它是你后续所有代码的砖头。后面你会写函数、写类、写爬虫、写数据分析脚本这些代码的底层永远都是把数据存进变量再把变量拼成人能读懂的输出。最后分享一个小技巧我写Python这么多年遇到需要临时观察一个变量的值时永远是用一句print(f...)来调试这比任何花哨的调试器都来得直接。所以第一天学到的这个能力不是只用来做打卡作业的——它会陪你走很远的编程之路。