你真正会用到的格式化方式
f-string 是现代 Python 代码把值嵌入文本的默认方式。在开头的引号前加一个 f,{...} 里的任何内容都会变成实时求值的表达式:
有三点值得注意。f 前缀把整个字面量变成一个模板。花括号是替换的位置。花括号里的表达式在 print 运行的那一刻才求值,而不是在写下字符串的时候。
你写 f-string 的次数会远远多于其他任何格式化写法。它比 "Hello, " + name + "." 更短,比 "Hello, %s." % name 更清晰,也比 .format() 更灵活。
任何能求值的东西都能放进去
花括号里不限于变量名,任何 Python 表达式都可以:
方法调用、索引、算术运算、条件表达式都没问题。唯一的原则是:花括号里的内容要短。如果你在一个占位符里写了三行计算,就先把结果算到一个有名字的变量里,再把变量名放进去。
格式化数字
表达式后面的冒号开启一段格式说明,这是一种控制值如何显示的小型语言:
各部分的作用速览:
.2f:浮点数,小数点后保留两位,显示时四舍五入。,:用逗号作为千位分隔符,int 和 float 都适用。.1%:乘以 100 并加上%,非常适合比例和比率。.2e:科学计数法,保留两位小数。
它们可以组合使用。f"{total:,.2f}" 得到 "1,234.57"。
填充、宽度和对齐
用来把输出排成整齐的列:
<10 表示“左对齐,至少填充到 10 个字符”。>5 表示“右对齐,填充到 5 个字符”。还可以用 ^ 居中。
把填充字符写在对齐标志前面,就能用空格以外的字符来填充:
格式化日期
同样的 {value:spec} 语法也适用于 datetime 对象:
冒号后面的格式说明是一个 strftime 格式字符串。strftime 支持的每个 % 代码在这里都能用,我们会在 datetime 页面详细介绍。
调试用的 = 技巧
这是最实用的小众功能之一:在表达式后面加上 =,Python 会同时打印表达式的源码和它的值:
你会得到 count=7、price=19.99、count * price=139.93。三个字符就抵得上一整句 print("count =", count)。下次调试时想打印几个值,记得用它。
转义花括号
如果输出中需要字面的 { 或 },就把它们写两遍:
单个花括号会开启一个表达式;{{ 和 }} 在输出中分别代表 { 和 }。
多行 f-string
f-string 可以和三引号配合使用,在代码里直接构建小模板时很方便:
你也可以把一个很长的 f-string 拆成几个相邻的字符串字面量,Python 会自动把它们拼接起来:
旧写法仍然会出现
在现有代码中,你会遇到两种较旧的格式化写法:
三种写法输出相同。十有八九,f-string 的可读性更好。需要一次构建模板、多次套用时,可以用 .format();只有在维护已经用了 % 的旧代码时才用 %。
不适合用 f-string 的场景
有两种情况应该换别的工具。
构建 SQL 查询。 永远不要用 f-string 把用户输入插入 SQL 字符串。请使用数据库库提供的参数化查询。在这里用 f-string,正是 SQL 注入发生的原因。
构建需要翻译的界面文本。 如果你的应用支持多种语言,你需要一个外部翻译工具能识别的模板,通常是 gettext 的 _(...) 或框架自带的辅助函数。f-string 会把结构写死在源码里,让翻译变得困难得多。
除此之外的场景,比如日志、控制台输出、拼接 URL、构建配置字符串、格式化显示的数字,f-string 都是正确的选择。
下一篇:数字和布尔值
f-string 很多时候都用来格式化数字,所以值得更深入地了解一下数值类型。这就是下一篇的内容。
常见问题
Python 中的 f-string 是什么?
f-string 是以 f 为前缀的字符串字面量,其中 {...} 里的内容会在运行时替换为表达式的值。f"Hello, {name}" 会把 name 当前的值插入到字符串中。
f-string 是哪个 Python 版本加入的?
Python 3.6。所有现代 Python 版本都支持它,所以今天写 Python 3 代码时,任何地方都可以用 f-string。旧的格式化写法(% 和 .format())仍然可用,但大多数情况下读起来没那么清晰。
Python 中怎么把数字保留两位小数?
在花括号内的冒号后面写格式说明:f"{price:.2f}"。.2f 的意思是“小数点后保留两位的浮点数”。它只对显示的值做四舍五入,原来的数字不会改变。
f-string 里可以放任何表达式吗?
可以:算术运算、方法调用、函数调用、条件表达式都行。f"{name.upper()}" 和 f"{price * 1.2:.2f}" 都能正常工作。表达式尽量写短;如果花括号里的代码变得复杂,就先把结果算到一个变量里。