ARTICLE DETAIL

资讯详情

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

Python变量与格式化字符串:从标签模型到f-string的完整指南

Python变量与格式化字符串:从标签模型到f-string的完整指南 打卡营第一天讲变量和格式化字符串很多同学一开始觉得太简单甚至有人问我“这东西还用专门学一天吗”。但真等到自己动手写代码问题就全冒出来了变量名该用什么风格、为什么同一个变量一会儿是数字一会儿是字符串、print出来怎么都对不齐。第一天如果能把变量和格式化字符串这关基础打牢后面几天学列表、循环、函数都会轻松很多。这篇文章就当是给错过直播的同学一份完整笔记也是我自己带新人时反复强调的那套东西。先说结论变量解决的是“数据怎么存、怎么取”的问题格式化字符串解决的是“数据怎么展示、怎么输出”的问题。一个管内部逻辑一个管外部表达两者凑在一起正是任何程序最朴素的闭环拿数据、算数据、给人看数据。1. 第一天为什么要安排变量和格式化字符串很多初学Python的人都有一个错觉觉得变量不就是“a 1”嘛赋值谁不会。但问题恰恰出在这里变量在Python里的运作方式和C、Java很不一样。你不是在声明一个固定类型的内存空间而是在给一个对象贴标签。这个区别第一天不建立起来后面学到列表、字典、函数传参时会反复怀疑人生。格式化字符串也是一样。刚写代码的时候你百分之百会用到print输出结果。如果不能用简洁的方式把变量嵌进文本里你很快就会陷入手动拼字符串的泥潭。比如你要输出“张三今年18岁身高175 cm”最原始的做法是写“print(张三今年 str(age) 岁)”麻烦不说还容易漏掉类型转换。格式化字符串就是解决这个痛点的。更重要的是打卡营的节奏安排得很刻意。第一天不让你碰复杂的语法就让你用最基础的变量和输出把“写代码—运行—看结果”这个反馈闭环建立起来。我见过太多人一上来就啃列表推导式、装饰器结果卡在环境配置上几天就放弃了。第一天慢一点后面反而快。所以这个组合拳本质上是让你先学会“和Python对话”你用变量把数据递给它它用格式化字符串把结果还给你。习惯了这个来回后续所有内容都是在这个基础上加功能。2. 变量的正确打开方式标签模型与命名规范2.1 变量到底是盒子还是标签我之前教过的一个学生用了很长时间才转过这个弯。她总喜欢把变量想象成一个盒子往里面装数据。这个模型在解释“a 1”的时候挺好使但一遇到“a b”就开始混乱。她以为b把a的盒子复制了一份其实在Python里变量不是盒子是贴在对象上的标签。什么意思呢你写a [1, 2, 3]实际上是先在内存里创建了一个列表对象[1, 2, 3]然后把标签a贴到了这个对象上。你再写b a不会新建一个列表而是在同一个列表对象上又贴了一个标签b。这时候如果你改b.append(4)a也会跟着变因为两个标签指的是同一个对象。这个心智模型第一天就要搭对不然后面学列表、字典、函数参数传递、浅拷贝深拷贝全都会晕。我建议所有初学者在脑子里面把“变量是盒子”这个说法扔掉换成“变量是标签”这样理解引用、理解赋值、理解可变对象都会顺畅很多。2.2 命名规范和那些容易踩的坑命名看起来是小事但第一天养成的习惯会影响你后面的代码质量。Python官方的建议是变量名小写单词之间用下划线连接比如user_name、total_count。类名才用大驼峰UserName常量一般全大写MAX_COUNT。这个风格被称为snake_case在Python社区里是默认规矩。还有几个特别注意的地方。第一不能用Python关键字做变量名。if、for、while、class、def这些词已经被语言占了你用它们命名解释器直接报SyntaxError。这个错误其实很容易避免但新手经常不小心用list或str当变量名虽然不报错却会覆盖内置函数。我之前见过有人写list [1, 2, 3]之后再用list(abc)想创建列表结果报错TypeError半天找不到原因。第二注意数字不能开头。1var是非法命名但var1可以。中文变量名虽然在Python 3里能用但我个人不建议跨平台、跨项目协作时大概率出问题。第三下划线开头的变量有特殊含义。_name约定表示“私有”__name还有名称改写机制。第一天不用刻意学这些细节但至少要知道它们存在别乱用。我自己的习惯是给变量起名时考虑“读出声音顺不顺”。cnt、num这种缩写写的时候省事读的时候费劲。代码是给人看的变量名稍微长一点换来的是可读性第一天就建立这个意识后面写复杂项目时会感谢自己。2.3 动态类型Python变量为什么不需要声明类型第一次接触C或Java的人看到Python的age 18会觉得很不踏实你光写个变量名加值没告诉我这个变量是整数还是字符串啊。这就是动态类型语言和静态类型语言的核心区别。在Python里变量本身没有类型类型是跟着对象走的。a 1的时候a指向一个整数对象接着执行a helloa也可以贴上字符串对象的标签。这个特性给了你很大的灵活性但也带来了风险。很多新手发现自己的代码跑着跑着a不知道什么时候变成了字符串运算就出错了。我的建议是享受动态类型灵活性的同时自己心里要有类型意识。多写type()看类型多写程序时注意变量的变化轨迹。等到后面学了类型注解type hints你还可以给变量标注预期类型虽然解释器不强制但对代码阅读和IDE提示都很有帮助。3. 五种基础数据类型一次串讲先知道“有什么”才能“存什么”3.1 整数和浮点数两个数值类型不要混为一谈整数类型int不用多解释就是1、100、-3这种。浮点数float就是带小数点的数比如3.14、-0.5。但有两个细节需要特别记住。第一整数除法/返回的一定是浮点数即使两个整数相除且能整除。比如4 / 2你也许会认为是2实际结果是2.0。如果你需要整数结果要用//这叫整除也叫floor division。7 // 2是3-7 // 2是-4因为向下取整不是向零取整。这两个运算的区别第一天最好亲手试一遍。第二浮点数有精度问题。0.1 0.2大概率不是0.3而是0.30000000000000004。这是二进制浮点数表示导致的所有编程语言都有这个问题不是Python的bug。打卡营第一天如果遇到这种情况不要慌张属于正常现象。等学到decimal模块或者格式化输出时你会有解决方案。我用一个表格把常用数值运算列一下吧运算符号示例结果加法7 310减法-7 - 34乘法*7 * 321除法/7 / 23.5整除//7 // 23取余%7 % 21幂**2 ** 383.2 字符串、布尔值和None看似简单但容易被忽略字符串str是第一天用得最多的类型。它用单引号或双引号括起来两者基本等价但要注意配对。混合使用时比如字符串里本身有单引号你可以用双引号包起来省得转义。还有三引号或用于多行字符串写长文本时很舒服。布尔值bool只有两个True和False。注意是首字母大写的不是Java里的true和false。布尔值其实可以参与运算True相当于1False相当于0所以True True结果是2。这个特性偶尔会坑人但一般情况下你不会主动这么用。None代表“什么都没有”它不是0不是空字符串也不是False它就是一个独立的对象。判断一个变量是不是None应该用is而不是。这个细节第一天可以先听着后面学函数时return None和没有返回值会频繁出现。3.3 类型转换input()出来的一律是字符串打卡营第一天的作业通常要求用户输入信息然后输出。这里就涉及一个非常重要的点input()函数返回的一定是字符串。哪怕你输入了18得到的也是字符串18不是整数18。如果你直接用这个18去做算术运算比如age_input input(年龄)然后写age_input 1会直接报TypeError: can only concatenate str. 正确做法是先转换int(age_input)转成整数float(age_input)转成浮点数。Python提供的类型转换函数很直接int()、float()、str()、bool()。但要注意int(3.14)会报错因为字符串里不是合法整数字面量。保险起见可以先转成float再转成int。我自己在带新人时经常提醒转换前想清楚源数据长什么样转换后要知道目标类型是什么。写程序最怕的就是类型想当然。4. 格式化字符串的三种写法为什么要牢牢掌握f-string4.1 从%格式化说起老代码里经常见到在f-string出现之前Python最古老的格式化方式是%操作符风格和C语言的printf很像。比如name 疏锦行 age 18 print(我是%s今年%d岁 % (name, age))%s表示字符串%d表示整数%f表示浮点数。这种写法在远古Python代码、很多系统脚本里仍然存在你得能看懂。但它的缺点也比较明显占位符和后面的变量一一对应一旦参数多了很容易搞混顺序而且类型写错也会报错。我在维护老项目时见过%s和%d错位导致运行异常的情况排查起来相当费劲。所以我不建议新代码再用%格式化但推荐你花十分钟了解一下它的存在以便读旧代码时不懵。4.2 format()方法比%强但还不够直观str.format()在Python 2.6引入它用花括号{}作为占位符不用关心变量类型。使用方法有两种name 疏锦行 age 18 print(我是{}今年{}岁.format(name, age))你也可以在花括号里加上位置索引实现重复引用比如{0}、{1}。还可以用关键字参数比如{name}今年{age}岁.format(age18, name疏锦行)。这种写法比%灵活很多但也有一点点繁琐因为你要额外调用format()方法。在一行输出里同时格式化多个变量时这个方法的可读性还行但它无法在括号里写表达式比如直接计算age 1就不行这让它相比f-string少了一些灵魂。4.3 f-string最推荐的写法f-string是Python 3.6引入的格式化语法它直接在字符串前面加一个f或F把表达式用花括号括起来内嵌到字符串里name 疏锦行 age 18 print(f我是{name}今年{age}岁)这一下就让代码清爽了很多。更厉害的是花括号里可以直接写表达式比如f明年我{age 1}岁甚至可以直接调用函数f我的名字有{len(name)}个字。你还可以在花括号里加格式说明用冒号引导。在实际应用里f-string不仅用于打印写日志、拼SQL查询条件、生成报告文本时都特别方便。我在处理数据时经常要拼一段描述性的输出用f-string可以保持代码行短、逻辑清楚不用来回掰字符串。有个小细节如果你的字符串里有花括号本身例如输出JSON样例需要写两个花括号{{}}来转义。例子print(f{{name: {name}}})4.4 对齐、补零、千分位让输出更好看f-string的格式说明符是我认为打卡营第二天就能学的进阶内容因为做作业时太常用了。格式说明的通用形式是{value:format_spec}冒号后面跟对齐方式、宽度、精度等参数。我用几个典型示例来说明。补零num 7 print(f{num:03d}) # 输出007宽度为3不足补零保留小数位数pi 3.14159265 print(f{pi:.2f}) # 输出3.14四舍五入到两位小数千分位分隔符price 1234567 print(f{price:,}) # 输出1,234,567对齐和宽度name Python print(f{name:10}|) # 左对齐宽度10 print(f{name:10}|) # 右对齐宽度10 print(f{name:^10}|) # 居中宽度10这几个格式符在后续处理表格、对齐输出时很实用。我第一次让学员做“打印购物小票”的作业时大家就靠这些格式符解决了对齐问题。打卡营第一天做简单练习时不用贪多慢慢加进自己的代码库就好。5. 第一天的打卡作业与真实报错复盘5.1 抄作业环节做一个个人信息卡片为了让变量和格式化字符串落地训练营第一天的作业我通常会设计成这样让用户输入姓名、年龄、城市然后打印一个格式规整的信息卡片。下面是参考代码name input(请输入姓名) age_input input(请输入年龄) city input(请输入所在城市) age int(age_input) print( * 30) print(f姓名{name}) print(f年龄{age}岁) print(f城市{city}) print(f明年你就{age 1}岁了) print( * 30)这段代码看似简单其实把今天学的内容都串起来了变量存储输入、类型转换、f-string表达式、字符串乘法 * 30。运行示例请输入姓名疏锦行 请输入年龄18 请输入所在城市杭州 姓名疏锦行 年龄18岁 城市杭州 明年你就19岁了 我特别鼓励学员不要只抄我的代码而是改成自己的信息再加入身高、爱好等字段顺便练习f-string格式符。有些同学做完之后还自己加了行分隔线、右对齐的字段名编程的乐趣就从这个小小的自定义开始了。5.2 第一天最常见的报错看见不等于理解第一天大家提交的作业里报错集中在几个地方我梳理一下NameError: name xx is not defined原因是变量名拼错或漏定义。比如定义的是user_name后面用成了username。这个错误最好解决但要学会看报错信息里的变量名定位到对应行。TypeError: can only concatenate str (not int) to str这是忘记类型转换导致的。比如把input()的结果直接和整数拼接或者把字符串变量和数字变量用加号连接。解决办法就是先int()转换或者用f-string让Python自动处理类型转换。ValueError: invalid literal for int() with base 10: abc这是你试图把非数字字符串转成整数的时候报的。比如输入年龄时输入了“abc”int(abc)自然失败。解决办法很简单输入时按要求输入数字或者后面学了异常处理try...except再做防御性处理。SyntaxError: invalid syntax这个报错范围很广常见原因包括括号没匹配、字符串引号没闭合、行首用了中文标点、用了中文字符当引号等。我每次都会提醒学员如果报SyntaxError先检查括号和引号是否成对再检查是否有中文标点混入。很多人在中文输入法状态下写代码看起来差不多的符号其实是全角的Python不认。第一天看到报错心态比技术重要。报错是Python在帮你定位问题不是针对你。我自己的习惯是读报错信息时先看最下面一行它会明确说出错误类型和出错的代码行号然后看箭头指向的具体位置。把报错当成提示信息而不是“编程失败”的象征这个心态能让你在训练营里活过第一周。5.3 字符串拼接和转义另一个常见混淆点格式化字符串其实是对字符串拼接的替代方案但第一天不少学员还会遇到转义问题。比如你要输出他说你好直接写print(他说你好)会报错因为引号配对乱了。两种解决办法用单引号包字符串或者用反斜杠转义print(他说你好) print(他说\你好\)f-string里如果想输出大括号也需要双写。这些细节不整理一遍等自己手写时总会卡壳。6. 第一天的三条铁律后续二十九天都用得上带了几期打卡营我发现第一天表现好的学员都有一个共同特点他们不只“看懂了”还“敲出来了”并且在敲的过程中自己动手改过代码。所以我特别想给零基础的你三条铁律这几条不是Python语法但比语法管用。第一每天至少自己敲100行代码。这里的“敲”不是抄是不能看答案凭记忆把示例代码恢复出来。你第一天把变量赋值、print、input、格式化输出练熟了第二天学分支结构、循环时就不会被语法拖后腿。我经常说编程是技能不是知识技能只能用时间换。第二变量名要用心。第一天你可能觉得变量名无所谓反正自己能看懂。但等你三天后写一个上百行的脚本再回来找bug你会感谢那些起名清楚的变量。我个人的习惯是“命名即注释”与其写一堆注释解释这个变量是什么不如直接把变量名起得让人一目了然。比如max_score显然比ms好raw_age_str显然比a1好。第三格式化输出要多用f-string。从现在开始写日志、写提示、写报错信息都用f-string。时间久了你会形成肌肉记忆字符串拼接的旧习惯就再也影响不到你。我从Python 2转过来的人当年也是旧习惯根深蒂固但坚持用了半年f-string以后回头再写拼接代码会觉得又丑又容易错。打卡营是三十天的长跑第一天的“变量与格式化字符串”看似只是热身但它把后续所有内容的地基扎牢了。我见过很多人学Python的时候卡在变量类型和格式化输出上很久然后误以为自己不适合编程。其实不是你不行是这一关缺了一个清晰的口授。第一天能够踏踏实实把变量和格式化字符串啃下来你已经把Python徒步旅行中最磨脚的那段路走完了。最后分享一个小习惯每天关掉电脑前把当天写的代码统一放进一个文件里标注日期运行一遍再写三行笔记说明今天学到的关键点。坚持三十天回头看你能清晰地看到自己从变量都拿不稳到能写出完整小脚本的全过程。这个记录习惯比任何学习资料都珍贵。
返回列表