[Python] f-string字符串格式化语法

发布于 2022-07-28  1198 次阅读


众所周知,前些年 Python org. 准备 pr 前端市场的时候推出了很多狠活,然而今日发现好多人竟不知... 所以打算陆陆续续更几期 Python 新坑。

f-string 字符串格式化语法是 Python 3.6 推出的全新的字符串格式化函数。f-string 在功能上完全包容传统的 %-formatting 语句和 str.format() 函数,同时性能优于二者,对可读性也有提高。因此,对于不存在版本冲突的项目中,推荐使用 f-string 进行字符串格式化。 同时,f-string 的书写逻辑更接近 JavaScript 的槽,更利于面向 Python 前端程序员的理解。

官方文档:Python 3.6 有什么新变化A — Python 3.6.15 文档

官方文档截图

基础语法

f'string{name:format}'

使用方法

在任何字符串前添加修饰符 fF 即可开启 f-string 格式化语法,在槽中填入对应的变量或函数名即可。

>>> a = 10
>>> def f(value):
...     return value + 10
... 
>>> 'the value of a is {a}'
'the value of a is {a}'
>>> f'the value of a is {a}'
'the value of a is 10'
>>> f'the value of a is {a:*>16.2f}'
'the value of a is ***********10.00'
>>> f'the value of f is {f(a)}'
'the value of a is 20'

如上可见,只需要在字符串前添加字母 f 并将对应的变量或函数名放置在槽 { } 中即可。其中,若槽中的是变量名,则输出变量的值;若槽中是函数,则会输出函数的返回值。而格式化的语法与 str.format() 函数无异,仅需在冒号 : 后添加格式即可。

相比于更熟悉的 str.format() 函数语法,f-string 在槽的概念上更接近前端开发的思维逻辑,同时由于 f-string 减少了一次内存的读写,使得效率更高。但也因此带来一个问题:

>>> from random import randint
>>> randint(0, 9)       # 返回 0 ~ 9 之间的随机整数
8
>>> '{0} {0} {0}'.format(randint(0, 9))
'5 5 5'
>>> f'{randint(0, 9)} {randint(0, 9)} {randint(0, 9)}'
'9 9 6'

由上可见,在 f-string 语法中,我们无法通过重用槽来重用一个函数的返回值,而是会多次调用该函数。我们可以通过首先将该返回值存储在变量中来解决此问题:

>>> from random import randint
>>> a = randint(0, 9)   # 返回 0 ~ 9 之间的随机整数
>>> a
6
>>> f'{a} {a} {a}'
'6 6 6'

综上,f-string 语法已经可以实现 str.format() 函数语法的全部功能。

写在最后

当然,是否选择使用该语法仍然需要斟酌。其中的最主要原因是,该语法推出时间较短,只能在 Python 3.6 及以上的解释器中运行,这使得兼容性存在风险。

但无论如何,在前后端语言互相渗透的今天,采用更符合全栈全岗位使用习惯的语法规则必然会成为一种新的趋势。我仍然强烈推荐尝试运用这类新语法。