最近通过 PEP498 学习到 f-strings 的用法。文档见这里:https://docs.python.org/3.6/reference/lexical_analysis.html#formatted-string-literals

回想起来,已经有三种字符串格式化的方法了。这里简单总结下。

在 3.6 之前,有两种方法: %str.format()

1. printf-style String Formatting (% operator)

String 对象在 python 很早期的时候就已经有了这个内置的 % 操作符。文档见:4. Built-in Types — Python 3.7.0 documentation: https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting

可以看下面的例子来简单地理解:

>>> name = "ruhm"
>>> "Hello, %s." % name
'Hello, ruhm.'

针对多个变量需要使用元组(tuple)。

>>> name = "ruhm"
>>> age = 18
>>> "Hello, %s. You are %s." % (name, age)
'Hello ruhm. You are 18.'

注意:这种方法官方已经不再推荐了。官方文档中提到:

Note: The formatting operations described here exhibit a variety of quirks that lead to a number of common errors (such as failing to display tuples and dictionaries correctly). Using the newer formatted string literals, the str.format() interface, or template strings may help avoid these errors. Each of these alternatives provides their own trade-offs and benefits of simplicity, flexibility, and/or extensibility.

2. str.format

这种方法是 2.6 版本中引入的。文档:https://docs.python.org/3/library/stdtypes.html#str.format

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, ruhm. You are 18.'

str.format 更复杂的用法见:https://docs.python.org/3/library/string.html#formatstrings

现在已经比 % 要稍微简洁一点了。但是表达上还是不够直接。

3. f-strings (String Interpolation)

这个语法从 3.6 引入,可以阅读 PEP498 查看详细资料。

表达式以f或者F开头。这里举几个简单的例子:

>>> name = "ruhm"
>>> age = 18
>>> f"Hello, {ruhm}. You are {age}."
'Hello, ruhm. You are 18.'
>>> F"Hello, {ruhm.st@gmail.com}. You are {age}."
'Hello, ruhm.st@gmail.com. You are 18.'

这里 f-strings 表达式在运行时被计算的,因此可以在括号内使用有效的表达式,比如:

>>> f"{1 * 2}"
'2'

另外,需要特别提出的,从性能考量,f-strings 语法在简单场景下,执行速度大约是 str.format() 的 3.5 倍。有人做了一些测试。见这里 f-strings 还有更多的细节值得讨论,如果项目使用的 Python 版本大于 3.6,可以考虑使用这种语法了,值得后面单独总结一篇文章来探索 f-strings 的更多用法。

refs