Python f-string 格式化字符串完全指南:语法、特性与高级用法

江屿
江屿
发布时间:2026-10-14| 6人浏览过
原创

本文深入解析 Python 3.6 引入的 f-string(格式化字符串常量)。文章涵盖其基本语法、表达式求值、引号与大括号处理规则,以及宽度、精度、对齐、千位分隔符等高级格式化功能。通过对比传统 %-formatting 和 str.format(),展示 f-string 在简洁性与性能上的优势,并提供 lambda 表达式和多行字符串等实用技巧。

f-string 简介与核心概念

简介

f-string,全称为格式化字符串常量(formatted string literals),是 Python 3.6 版本中引入的一种全新字符串格式化机制。该特性源自 PEP 498 – Literal String Interpolation,旨在简化字符串格式化的操作流程。在语法形式上,f-string 以 f 或 F 作为前缀修饰符(例如 f'xxx' 或 F'xxx'),并使用大括号 {} 来标识需要被替换的变量或表达式字段。值得注意的是,f-string 在本质上并非静态的字符串常量,而是一个在程序运行期间动态计算求值的表达式。

While other string literals always have a constant value, formatted strings are really expressions evaluated at run time. (与具有恒定值的其它字符串常量不同,格式化字符串实际上是运行时运算求值的表达式。) —— Python Documentation

在功能表现上,f-string 不仅不逊色于传统的 %-formatting 语句和 str.format() 函数,其执行效率更优于这两种方式。同时,f-string 的代码结构更加简洁直观。因此,对于使用 Python 3.6 及后续版本的开发者而言,强烈建议使用 f-string 来处理字符串格式化任务。

f-string 基础用法与表达式

用法

本文内容主要参考了以下权威资料:

Python Documentation – Formatted String Literals

Python Documentation – Format String Syntax

PEP 498 – Literal String Interpolation

Python 3's f-Strings: An Improved String Formatting Syntax (Guide)

python3 f-string格式化字符串的高级用法

Python 3: An Intro to f-strings

简单使用

f-string 利用大括号 {} 来标识替换字段,用户只需将具体的替换内容直接填入大括号中即可。


>>> name = 'Eric'
>>> f'Hello, my name is {name}'
'Hello, my name is Eric'

>>> number = 7
>>> f'My lucky number is {number}'
'My lucky number is 7'

>>> price = 19.99
>>> f'The price of this book is {price}'
'The price of this book is 19.99'

表达式求值与函数调用

在 f-string 的大括号 {} 内部,不仅可以填入变量,还可以直接编写表达式或调用函数。Python 解释器会自动计算这些表达式的结果,并将返回值嵌入到最终的字符串中。


>>> f'A total number of {24 * 8 + 4}'
'A total number of 196'

>>> f'Complex number {(2 + 2j) / (2 - 3j)}'
'Complex number (-0.15384615384615388+0.7692307692307692j)'

>>> name = 'ERIC'
>>> f'My name is {name.lower()}'
'My name is eric'

>>> import math
>>> f'The answer is {math.log(math.pi)}'
'The answer is 1.1447298858494002'

引号、大括号与转义规则

引号、大括号与反斜杠

在 f-string 的大括号内部,所使用的引号类型不能与字符串外部的定界符引号发生冲突。开发者可以根据实际情况灵活切换使用单引号 ' 和双引号 "。


>>> f'I am {"Eric"}'
'I am Eric'
>>> f'I am {'Eric'}'
 File "<stdin>", line 1
  f'I am {'Eric'}'
        ^
SyntaxError: invalid syntax

若单引号 ' 和双引号 " 仍无法满足复杂的嵌套需求,还可以使用三引号 ''' 和三双引号 """ 来定义字符串。


>>> f"He said {"I'm Eric"}"
 File "<stdin>", line 1
  f"He said {"I'm Eric"}"
        ^
SyntaxError: invalid syntax

>>> f'He said {"I'm Eric"}'
 File "<stdin>", line 1
  f'He said {"I'm Eric"}'
         ^
SyntaxError: invalid syntax

>>> f"""He said {"I'm Eric"}"""
"He said I'm Eric"
>>> f'''He said {"I'm Eric"}'''
"He said I'm Eric"

大括号外部的引号还可以使用反斜杠 \ 进行转义处理,但需要注意的是,大括号内部不允许使用反斜杠 \ 进行转义。


>>> f'''He\'ll say {"I'm Eric"}'''
"He'll say I'm Eric"
>>> f'''He'll say {"I\'m Eric"}'''
 File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash

如果需要在 f-string 的大括号外部显示字面意义上的大括号,则应输入连续两个大括号 {{ 和 }}。


>>> f'5 {"{stars}"}'
'5 {stars}'
>>> f'{{5}} {"stars"}'
'{5} stars'

前文提到,f-string 大括号内部不能使用反斜杠 \ 进行转义。事实上,f-string 大括号内部根本不允许出现反斜杠 \。如果确实需要处理包含反斜杠 \ 的内容,应首先将包含该反斜杠 \ 的字符串赋值给一个变量,然后在 f-string 的大括号内直接填入该变量名。


>>> f"newline: {ord('\n')}"
 File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash

>>> newline = ord('\n')
>>> f'newline: {newline}'
'newline: 10'

多行字符串处理

多行f-string

f-string 同样支持用于多行字符串的处理。


>>> name = 'Eric'
>>> age = 27
>>> f"Hello!" \
... f"I'm {name}." \
... f"I'm {age}."
"Hello!I'm Eric.I'm 27."
>>> f"""Hello!
...   I'm {name}.
...   I'm {age}."""
"Hello!\n  I'm Eric.\n  I'm 27."

高级格式化:对齐、宽度与精度

自定义格式:对齐、宽度、符号、补零、精度、进制等

f-string 采用 {content:format} 的语法结构来设置字符串格式。其中,content 代表被替换并填入字符串的内容部分,可以是变量、表达式或函数调用等;format 则是具体的格式描述符。当采用默认格式时,无需显式指定 {:format},如前文示例所示,仅书写 {content} 即可满足基本需求。

关于格式描述符的详细语法规范及具体含义,可查阅 Python 官方文档。此处按照使用频率和逻辑顺序,简要介绍常用格式描述符的功能与作用。

格式描述符 含义与作用
< 左对齐(字符串默认对齐方式)
> 右对齐(数值默认对齐方式)
^ 居中

数字符号相关格式描述符

格式描述符 含义与作用
+ 负数前加负号(-),正数前加正号(+)
- 负数前加负号(-),正数前不加任何符号(默认)
(空格) 负数前加负号(-),正数前加一个空格

注:仅适用于数值类型。

数字显示方式相关格式描述符

格式描述符 含义与作用
# 切换数字显示方式

注1:仅适用于数值类型。

注2:# 对不同数值类型的作用效果存在差异,具体表现详见下表。

数值类型 不加#(默认) 加# 区别
二进制整数 '1111011' '0b1111011' 开头是否显示 0b
八进制整数 '173' '0o173' 开头是否显示 0o
十进制整数 '123' '123' 无区别
十六进制整数(小写字母) '7b' '0x7b' 开头是否显示 0x
十六进制整数(大写字母) '7B' '0X7B' 开头是否显示 0X

宽度与精度相关格式描述符

格式描述符 含义与作用
width 整数 width 指定宽度
0width 整数 width 指定宽度,开头的 0 指定高位用 0 补足宽度
width.precision 整数 width 指定宽度,整数 precision 指定显示精度

注1:0width 不可用于复数类型和非数值类型,width.precision 不可用于整数类型。 注2:width.precision 用于不同格式类型的浮点数、复数时的含义有所不同:当用于 f、F、e、E 和 % 时,precision 指定的是小数点后的位数;而当用于 g 和 G 时,precision 指定的是有效数字的位数(即小数点前位数加上小数点后位数)。 注3:width.precision 除浮点数、复数外,还可用于字符串类型。此时,precision 的含义是仅使用字符串中前 precision 位字符。

示例:


>>> a = 123.456
>>> f'a is {a:8.2f}'
'a is  123.46'
>>> f'a is {a:08.2f}'
'a is 00123.46'
>>> f'a is {a:8.2e}'
'a is 1.23e+02'
>>> f'a is {a:8.2%}'
'a is 12345.60%'
>>> f'a is {a:8.2g}'
'a is 1.2e+02'

>>> s = 'hello'
>>> f's is {s:8s}'
's is hello  '
>>> f's is {s:8.3s}'
's is hel   '

千位分隔符相关格式描述符

格式描述符 含义与作用
, 使用,作为千位分隔符
_ 使用_作为千位分隔符

注1:若不指定 , 或 _,则 f-string 默认不使用任何千位分隔符。 注2:, 仅适用于浮点数、复数与十进制整数。对于浮点数和复数,, 仅分隔小数点前的数位。 注3:_ 适用于浮点数、复数与二、八、十、十六进制整数。对于浮点数和复数,_ 仅分隔小数点前的数位;对于二、八、十六进制整数,固定从低位到高位每隔四位插入一个 _(十进制整数则是每隔三位插入一个 _)。

示例:


>>> a = 1234567890.098765
>>> f'a is {a:f}'
'a is 1234567890.098765'
>>> f'a is {a:,f}'
'a is 1,234,567,890.098765'
>>> f'a is {a:_f}'
'a is 1_234_567_890.098765'

>>> b = 1234567890
>>> f'b is {b:_b}'
'b is 100_1001_1001_0110_0000_0010_1101_0010'
>>> f'b is {b:_o}'
'b is 111_4540_1322'
>>> f'b is {b:_d}'
'b is 1_234_567_890'
>>> f'b is {b:_x}'
'b is 4996_02d2'

格式类型相关格式描述符

基本格式类型

格式描述符 含义与作用 适用变量类型
s 普通字符串格式 字符串
b 二进制整数格式 整数
c 字符格式,按unicode编码将整数转换为对应字符 整数
d 十进制整数格式 整数
o 八进制整数格式 整数
x 十六进制整数格式(小写字母) 整数
X 十六进制整数格式(大写字母) 整数
e 科学计数格式,以 e 表示 ×10^ 浮点数、复数、整数(自动转换为浮点数)
E 与 e 等价,但以 E 表示 ×10^ 浮点数、复数、整数(自动转换为浮点数)
f 定点数格式,默认精度(precision)是6 浮点数、复数、整数(自动转换为浮点数)
F 与 f 等价,但将 nan 和 inf 换成 NAN 和 INF 浮点数、复数、整数(自动转换为浮点数)
g 通用格式,小数用 f,大数用 e 浮点数、复数、整数(自动转换为浮点数)
G 与 G 等价,但小数用 F,大数用 E 浮点数、复数、整数(自动转换为浮点数)
% 百分比格式,数字自动乘上100后按 f 格式排版,并加 % 后缀 浮点数、整数(自动转换为浮点数)

常用的特殊格式类型:标准库 datetime 提供的用于排版时间信息的格式类型,适用于 date、datetime 和 time 对象。

格式描述符 含义 显示样例
%a 星期几(缩写) 'Sun'
%A 星期几(全名) 'Sunday'
%w 星期几(数字,0 是周日,6 是周六) '0'
%u 星期几(数字,1 是周一,7 是周日) '7'
%d 日(数字,以 0 补足两位) '07'
%b 月(缩写) 'Aug'
%B 月(全名) 'August'
%m 月(数字,以 0 补足两位) '08'
%y 年(后两位数字,以 0 补足两位) '14'
%Y 年(完整数字,不补零) '2014'
%H 小时(24小时制,以 0 补足两位) '23'
%I 小时(12小时制,以 0 补足两位) '11'
%p 上午/下午 'PM'
%M 分钟(以 0 补足两位) '23'
%S 秒钟(以 0 补足两位) '56'
%f 微秒(以 0 补足六位) '553777'
%z UTC偏移量(格式是 ±HHMM[SS],未指定时区则返回空字符串) '+1030'
%Z 时区名(未指定时区则返回空字符串) 'EST'
%j 一年中的第几天(以 0 补足三位) '195'
%U 一年中的第几周(以全年首个周日后的星期为第0周,以 0 补足两位) '27'
%w 一年中的第几周(以全年首个周一后的星期为第0周,以 0 补足两位) '28'
%V 一年中的第几周(以全年首个包含1月4日的星期为第1周,以 0 补足两位) '28'

综合示例


>>> a = 1234
>>> f'a is {a:^#10X}'   # 居中,宽度10位,十六进制整数(大写字母),显示0X前缀
'a is  0X4D2  '

>>> b = 1234.5678
>>> f'b is {b:<+10.2f}'  # 左对齐,宽度10位,显示正号(+),定点数格式,2位小数
'b is +1234.57 '

>>> c = 12345678
>>> f'c is {c:015,d}'   # 高位补零,宽度15位,十进制整数,使用,作为千分分割位
'c is 000,012,345,678'

>>> d = 0.5 + 2.5j
>>> f'd is {d:30.3e}'   # 宽度30位,科学计数法,3位小数
'd is      5.000e-01+2.500e+00j'

>>> import datetime
>>> e = datetime.datetime.today()
>>> f'the time is {e:%Y-%m-%d (%a) %H:%M:%S}'  # datetime时间格式
'the time is 2018-07-14 (Sat) 20:46:02'

Lambda 表达式在 f-string 中的应用

lambda表达式

f-string 的大括号内也可以填入 lambda 表达式。然而,由于 lambda 表达式中的 : 会被 f-string 误认为是表达式与格式描述符之间的分隔符,从而引发歧义。为避免此类错误,必须将 lambda 表达式置于括号 () 内部。


>>> f'result is {lambda x: x ** 2 + 1 (2)}'
 File "<fstring>", line 1
  (lambda x)
       ^
SyntaxError: unexpected EOF while parsing

>>> f'result is {(lambda x: x ** 2 + 1) (2)}'
'result is 5'
>>> f'result is {(lambda x: x ** 2 + 1) (2):<+7.2f}'
'result is +5.00 '

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。