Menu

Python f-string 教程:格式化、表达式与数字格式

Python f-string 实用指南:在字符串中嵌入变量和表达式,格式化数字和日期,以及什么时候该用旧的格式化写法。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

你真正会用到的格式化方式

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}" 都能正常工作。表达式尽量写短;如果花括号里的代码变得复杂,就先把结果算到一个变量里。

Coddy 编程语言插图

和 Coddy 一起学编程

开始