前面我们已经学了字符串的切片、查找、替换这些操作。 但在真实开发里,字符串还有一个特别高频的用途:
把变量、数字、文本,有条理地塞进一句完整的话里。
比如:
输出一句欢迎语 打印成绩单 显示商品价格 生成日志信息 整理一条提示文本 把多个数据拼成更专业的展示内容
很多新手一开始会直接用加号拼接:
name = '张三'age = 18print('我叫' + name + ',今年' + str(age) + '岁')
这当然能跑。 但一旦变量多一点、格式复杂一点、数字需要保留小数、输出需要更整齐,这种写法就会越来越别扭。
这时候,字符串格式化就派上用场了。
这一章,我们专门把两个重要阶段讲清楚:
老牌写法 %更灵活的 format()
你先别急着觉得它们像历史包袱。 就算后面你更喜欢用 f-string,这一章也非常有必要学。 因为你以后看别人代码、看旧项目、看很多教程时,依然会经常遇到它们。
一、什么叫字符串格式化
你可以把字符串格式化理解成一句特别直白的话:
先把句子模板写好,再把具体数据填进去。
比如这句话:
我叫某某,今年多少岁
这其实就是一个模板。
如果把具体数据填进去,就变成:
我叫张三,今年18岁
编程里的字符串格式化,本质上就是在做这件事。
它不是单纯拼接文本, 而是先留出位置,再往里面填值。
这种写法最大的好处就是:
更清晰 更规范 更适合处理复杂输出
二、为什么不建议总是用加号拼接
先看一个最常见的例子:
name = '李四'score = 95print('学生' + name + '的成绩是' + str(score))
能跑,没问题。 但你已经能感觉到一点别扭:
数字要手动 str()句子一长,眼睛会很累 中间漏一个加号就报错 变量一多,代码会越来越乱
再比如:
product = '机械键盘'price = 299.9stock = 120print('商品:' + product + ',价格:' + str(price) + ',库存:' + str(stock))
这种写法还能忍。 可如果后面再加日期、再加状态、再加折扣、再加格式控制,就会明显不顺手。
所以,字符串格式化真正解决的问题,不是 能不能拼, 而是 怎么拼得更整齐、更自然、更容易维护。
三、先认识老牌写法:% 格式化
这是 Python 里比较早期、也特别经典的一种格式化方式。
先看最简单的例子:
name = '张三'print('你好,%s' % name)
输出:
你好,张三
这里的 %s 就像一个占位符。 意思是:
这里先留一个位置,后面再把值塞进来。
后面的 % name,表示把变量 name 填到前面的 %s 位置里。
你可以把它理解成:
模板 % 数据
虽然这个写法看起来有一点年代感,但逻辑其实并不难。
四、%s 是最常见的占位符
在 % 格式化里,%s 非常常用。
它通常表示:
这里放一个字符串形式的内容
看几个例子:
name = 'Python'print('我正在学习%s' % name)
输出:
我正在学习Python
再比如:
city = '杭州'print('我来自%s' % city)
输出:
我来自杭州
你甚至会发现,%s 不只可以放字符串,很多其他类型也能放进去。
比如:
age = 18print('年龄是%s' % age)
输出:
年龄是18
也就是说,%s 很像一个比较宽容的占位符。 它会尽量把数据转换成适合展示的字符串形式。
这也是为什么很多入门教程会先从 %s 讲起。 因为它最省心。
五、如果有多个值,要怎么填
如果模板里有多个占位符,后面就不能只放一个变量了,而要放一个元组。
看例子:
name = '张三'age = 18print('我叫%s,今年%s岁' % (name, age))
输出:
我叫张三,今年18岁
这里你要注意:
前面有两个占位符 后面就要提供两个值 顺序要一一对应
再看一个:
product = '鼠标'price = 59.9print('商品:%s,价格:%s元' % (product, price))
输出:
商品:鼠标,价格:59.9元
这个写法在很多老代码里特别常见。 你以后只要看到:
'某段文本 %s %s' % (值1, 值2)
就知道它是在做字符串格式化。
六、%d 和 %f 是什么
除了 %s,你还经常会看到 %d 和 %f。
%d 通常表示整数%f 通常表示浮点数
看例子:
age = 20print('年龄:%d岁' % age)
输出:
年龄:20岁
再看浮点数:
price = 19.8print('价格:%f元' % price)
输出:
价格:19.800000元
这里很多新手会愣一下。
为什么后面多出一串 0?
因为 %f 默认会保留 6 位小数。
这不是错,而是它的默认行为。
七、如何控制小数位数
这在实际开发里特别重要。
因为价格、平均分、比例这些数据,通常不想显示 6 位小数。 我们更常见的是保留 2 位。
写法如下:
price = 19.8print('价格:%.2f元' % price)
输出:
价格:19.80元
这里的 %.2f 可以这样理解:
f 还是浮点数.2 表示保留 2 位小数
再看一个:
score = 93.4567print('成绩:%.1f分' % score)
输出:
成绩:93.5分
这个功能在金额、温度、平均数、百分比显示里非常高频。
八、% 格式化最容易犯的几个错
先说第一个。
占位符数量和数据数量对不上。
比如:
name = '张三'age = 18print('我叫%s,今年%s岁' % name)
这里前面有两个占位符,后面却只给了一个值,就会报错。
第二个错,是类型不匹配。
比如:
text = '十八'print('年龄:%d' % text)
这里 %d 期待整数,但你给的是中文字符串,就不合适。
第三个错,是忘了多个值要放在元组里。
比如:
name = '张三'age = 18print('我叫%s,今年%s岁' % name, age)
这样写就不是你想要的格式化效果了。
所以 % 格式化虽然不难,但它有一个特点:
写法简洁,但对顺序和类型比较敏感。
九、什么时候 % 写法会开始显得吃力
当模板变复杂时,它就会越来越别扭。
比如:
name = '张三'score = 95.6rank = 3print('学生%s,本次考试成绩%.1f分,班级排名第%d名' % (name, score, rank))
这还能接受。 但如果字段更多、顺序更复杂、一个值重复出现、格式控制更细,阅读体验就会明显下降。
你会开始有这种感觉:
我知道它能跑 但看起来有点绕 尤其是值一多,后面的元组很容易眼花
这也是为什么后面慢慢有了更灵活的 format() 写法。
十、format() 是什么
format() 可以理解成:
另一种更现代、更灵活的字符串格式化方式
先看最简单的例子:
name = '张三'text = '你好,{}'.format(name)print(text)
输出:
你好,张三
这里的 {} 也是占位符。 意思是:
这里先留空,后面再填值
而 .format(name) 就是把变量 name 填进去。
你会发现,这种写法比 % 更直观一点。 尤其是占位符看起来更清爽。
十一、format() 也能一次填多个值
看例子:
name = '李四'age = 20text = '我叫{},今年{}岁'.format(name, age)print(text)
输出:
我叫李四,今年20岁
这和 % 的效果类似, 但读起来通常会更顺一点。
再看一个商品例子:
product = '机械键盘'price = 299.9stock = 50text = '商品:{},价格:{}元,库存:{}'.format(product, price, stock)print(text)
输出:
商品:机械键盘,价格:299.9元,库存:50
对于初学者来说,format() 的一个明显优点就是:
不用再记 %s、%d、%f 这些占位符就能先跑起来
十二、format() 可以按位置指定
这是它比 % 更灵活的一点。
比如:
name = '王五'age = 19text = '我叫{0},今年{1}岁,{0}正在学Python'.format(name, age)print(text)
输出:
我叫王五,今年19岁,王五正在学Python
这里的 {0} 表示用第 1 个值{1} 表示用第 2 个值
这就有什么好处?
如果一个变量在字符串里要重复出现,你不需要重复写多次参数。 直接用位置编号重复引用就行。
这在长文本里很方便。
十三、format() 还能按名字填值
这个功能非常适合可读性要求高的场景。
看例子:
text = '姓名:{name},年龄:{age},城市:{city}'.format(name='张三', age=18, city='北京')print(text)
输出:
姓名:张三,年龄:18,城市:北京
这种写法最大的优点是:
一眼就知道每个位置填的是什么
尤其是变量多的时候,按名字写会比按顺序写更稳。
再比如:
message = '商品:{product},价格:{price}元'.format(product='鼠标', price=59.9)print(message)
你会发现,这种写法很像在给模板字段赋值。 可读性非常强。
十四、format() 为什么在复杂文本里更舒服
因为它更像搭积木。
你可以按顺序填 可以按位置填 可以按名字填
尤其是按名字填这件事,特别适合长句子。
比如:
text = '用户{name}在{city}登录,账户余额为{money}元'.format(name='小王', city='上海', money=520.8)print(text)
你一眼就能看明白,谁对应谁。 不用像 % 那样一直回头数第几个值对应第几个占位符。
这就是 format() 最大的魅力之一:
更适合复杂模板 更适合可读性要求高的代码
十五、format() 也能控制小数位数
这个功能和 % 一样,也非常实用。
比如保留 2 位小数:
price = 19.8text = '价格:{:.2f}元'.format(price)print(text)
输出:
价格:19.80元
这里的 :.2f 可以理解成:
冒号后面写格式规则.2f 表示保留 2 位小数
再比如:
score = 93.456print('成绩:{:.1f}'.format(score))
输出:
成绩:93.5
你会发现,这一套逻辑和 % 其实是相通的。 只是写法换了一种风格。
十六、format() 还能控制对齐
这一点在做表格输出、日志对齐时很有用。
比如:
name = 'Tom'print('|{:10}|'.format(name))
输出大概会是:
|Tom |
这表示给它留出 10 个字符宽度,默认左边正常、右边补空格。
如果你想右对齐:
print('|{:>10}|'.format(name))
输出大概是:
| Tom|
如果你想居中:
print('|{:^10}|'.format(name))
输出大概是:
| Tom |
这种写法在初学阶段可能不是天天用, 但一旦你做成绩单、报表、命令行输出,就会觉得特别好用。
十七、来看一个更像样的成绩单输出
比如有下面这些数据:
name = '张三'chinese = 96math = 91english = 88.5
如果只用加号拼接,句子很容易看着乱。 用 format() 写会舒服很多:
text = '学生:{},语文:{}分,数学:{}分,英语:{:.1f}分'.format(name, chinese, math, english)print(text)
输出:
学生:张三,语文:96分,数学:91分,英语:88.5分
这已经非常接近真实项目里的展示逻辑了。
你会发现,格式化的重点不在技术有多难, 而在于它让你的输出开始变得整齐、清晰、专业。
十八、再看一个商品展示案例
比如:
product = '蓝牙耳机'price = 199.0discount = 8.5stock = 36
用 % 写:
text = '商品:%s,价格:%.2f元,折扣:%.1f折,库存:%d件' % (product, price, discount, stock)print(text)
用 format() 写:
text = '商品:{},价格:{:.2f}元,折扣:{:.1f}折,库存:{}件'.format(product, price, discount, stock)print(text)
两种都行。 但你会开始慢慢感受到:
简单场景下都差不多 一旦格式要求多起来,format() 往往更清楚
十九、格式化最常见的一个用途:提示信息输出
比如登录欢迎语:
username = 'admin'print('欢迎你,{}'.format(username))
比如成绩提示:
name = '小明'score = 92print('恭喜{},你本次考试得了{}分'.format(name, score))
比如错误提示:
filename = 'data.csv'print('文件{}读取失败,请检查路径'.format(filename))
你会发现,很多程序表面上在做功能, 实际上最后都要把结果组织成一段话展示出来。
而这一步,就是字符串格式化的主战场。
二十、% 和 format 到底该怎么理解它们的关系
你可以先这样理解:
% 是老牌写法,简洁、常见、很多旧代码里都有format() 更灵活,表达能力更强,复杂场景更舒服
它们都不是错的。 只是风格不同,能力层级也略有差别。
入门阶段你最重要的不是站队, 而是都能看懂、都能写基础用法。
因为你后面看别人代码时,很可能两种都会遇到。
二十一、什么时候 % 还挺顺手
比如特别简单的一两项输出:
name = 'Tom'print('你好,%s' % name)
或者保留两位小数:
price = 9.9print('价格:%.2f元' % price)
这类写法很短,很快,也不难看懂。
所以 % 并不是不能用。 只是你要知道,它更适合简单场景。
二十二、什么时候 format 更有优势
比如下面这种情况:
变量多 一个变量要重复出现 有些地方要按名字填 有些数字要控制格式 输出模板比较长
这时候 format() 往往会更舒服。
比如:
text = '用户{name}在{city}下单成功,订单金额为{money:.2f}元,请尽快通知{name}确认收货'.format( name='张三', city='杭州', money=299.9)print(text)
这种写法就很明显比 % 更适合长模板。
二十三、这一章最容易犯的几个错
先说 % 写法里最常见的。
第一,占位符和数据数量不一致。 第二,多个值忘了放进元组。 第三,%d、%f 和实际类型不匹配。
再说 format()。
第一,花括号数量和参数数量对不上。 第二,位置编号写乱了。 第三,按名字填值时,模板里的名字和后面的参数名写不一致。
还有一个共同的坑:
很多人以为格式化会修改原字符串。 其实不会。 它们都是返回一个新字符串。
所以你一般要么直接 print(),要么把结果接住。
二十四、别把格式化当成死板语法,要把它当成写句子的工具
这一点特别重要。
很多人学这一章时,会把注意力全放在符号上。 看 %s、{}、:.2f 看得眼花。
其实你只要换个角度,就会轻松很多。
字符串格式化,本质上是在做两件事:
先把句子模板写出来 再把数据优雅地塞进去
这样想以后,你就不会觉得它只是语法题。 而会觉得它是在帮你把输出组织得更像人话。
这在写提示语、日志、报表、消息通知时,真的特别重要。
二十五、练习题:这章一定要手敲
下面这些练习很典型,建议你自己敲一遍。
1. 用 % 格式化输出一句自我介绍
name = '张三'age = 18print('我叫%s,今年%d岁' % (name, age))
2. 用 % 保留 2 位小数输出价格
price = 29.9print('价格:%.2f元' % price)
3. 用 format() 输出姓名和城市
name = '李四'city = '上海'print('姓名:{},城市:{}'.format(name, city))
4. 用 format() 按名字填值
print('姓名:{name},年龄:{age}'.format(name='王五', age=20))
5. 用 format() 保留 1 位小数输出成绩
score = 93.56print('成绩:{:.1f}'.format(score))
6. 把下面这句商品信息格式化输出
product = '机械键盘'price = 299.0stock = 20text = '商品:{},价格:{:.2f}元,库存:{}件'.format(product, price, stock)print(text)
这些题你自己敲顺以后,格式化这件事就会从 眼熟 变成 手熟。
二十六、本章小结
这一章你要真正带走的,不只是 % 和 format 两种写法,而是一种更专业的输出思维。
加号拼接能解决最基础的问题, 但字符串格式化,才更适合真实开发里的文本组织。
% 写法是经典方式,适合简单场景。format() 更灵活,适合复杂模板和更清晰的表达。%s、%d、%f 是 % 写法里的常见占位符。{}、{0}、{name} 是 format() 里的常见占位方式。%.2f 和 {:.2f} 都能控制小数位数。
这一章学会之后,你写出的提示信息、成绩展示、商品信息、日志文本,都会明显更整齐。
下一章我们继续讲 f-string 为什么成了最推荐的格式化方式。 到了那里,你会发现,前面 % 和 format() 已经很实用了,但 Python 后来又把这件事做得更自然了一步。