Python f-strings完全指南:掌握PEP 498字符串插值技巧
这是文章《Python f-strings 即 PEP 498 – 字符串插值》的第1部分(共1部分)。
Python f-strings(格式化字符串)是一种新的字符串格式化方法。这个功能是通过PEP-498在Python 3.6中引入的,也被称为字面字符串插值。
我们为什么需要f-strings?
Python提供了多种格式化字符串的方法。让我们快速浏览一下它们以及它们可能遇到的问题。
- % 格式化 – 适用于简单格式化,但仅支持字符串、整数和双精度浮点数。我们不能将其用于对象。
- 模板字符串 – 非常基础。模板字符串只适用于类似字典的关键字参数。不允许调用任何函数,且参数必须是字符串。
- 字符串format() – Python字符串format()函数的引入是为了克服%格式化和模板字符串的问题和功能限制。然而,它过于冗长。让我们通过一个简单例子看看它的冗长性。
>>> age = 4 * 10
>>> ‘我的年龄是{age}。’.format(age=age)
‘我的年龄是40。’
Python f-strings和format函数几乎类似,但是去除了format函数的冗长性。让我们看看如何使用f-strings轻松地格式化上述字符串。
>>> f'我的年龄是{age}'
'我的年龄是40。'
Python f-strings是为了在字符串格式化时提供最简化的语法而引入的。这些表达式在运行时被求值。如果你使用的是Python 3.6或更高版本,你应该使用f-strings来满足你所有的字符串格式化需求。
Python f字符串示例
让我们来看一个关于f-strings的简单例子。
name = 'Pankaj'
age = 34
f_string = f'我的名字是{name},我的年龄是{age}'
print(f_string)
print(F'我的名字是{name},我的年龄是{age}') # f和F是相同的
name = 'David'
age = 40
# f_string已经被评估,现在不会改变
print(f_string)
输出:
我的名字是Pankaj,我的年龄是34
我的名字是Pankaj,我的年龄是34
我的名字是Pankaj,我的年龄是34
Python逐句执行语句,一旦f-string表达式被评估,即使表达式值发生变化,它们也不会改变。这就是为什么在上述代码片段中,即使在程序的后半部分’姓名’和’年龄’变量已经改变,f_string的值仍然保持不变。
1. 表达式和转换的f-strings
我们可以使用f-strings将日期时间转换为特定的格式。我们还可以在f-strings中运行数学表达式。
from datetime import datetime
name = 'David'
age = 40
d = datetime.now()
print(f'五年后的年龄将是{age+5}') # age = 40
print(f'带引号的名字 = {name!r}') # name = David
print(f'默认格式化的日期 = {d}')
print(f'自定义格式化的日期 = {d:%m/%d/%Y}')
输出:
五年后的年龄将是45
带引号的名字 = 'David'
默认格式化的日期 = 2018-10-10 11:47:12.818831
自定义格式化的日期 = 10/10/2018
2. f-strings支持原始字符串
我们也可以使用f-strings来创建原始字符串。
print(f'默认格式化的日期:\n{d}')
print(fr'默认格式化的日期:\n {d}')
输出:
默认格式化的日期:
2018-10-10 11:47:12.818831
默认格式化的日期:\n 2018-10-10 11:47:12.818831
3. 使用对象和属性的f-strings
我们也可以在f-strings中访问对象属性。
class Employee:
id = 0
name = ''
def __init__(self, i, n):
self.id = i
self.name = n
def __str__(self):
return f'E[id={self.id}, name={self.name}]'
emp = Employee(10, 'Pankaj')
print(emp)
print(f'员工: {emp}\n姓名是{emp.name},ID是{emp.id}')
输出:
E[id=10, name=Pankaj]
员工: E[id=10, name=Pankaj]
姓名是Pankaj,ID是10
4. 使用f字符串调用函数
我们可以在f-strings格式化中调用函数。
def add(x, y):
return x + y
print(f'求和(10,20) = {add(10, 20)}')
输出:
求和(10,20) = 30
5. 带空格的f字符串
如果表达式中包含前导或尾随空格,则会被忽略。如果文字字符串部分包含空格,则会保留它们。
>>> age = 4 * 20
>>> f' 年龄 = { age } '
' 年龄 = 80 '
6. 使用f-字符串的Lambda表达式
我们也可以在f-string表达式中使用lambda表达式。
x = -20.45
print(f'Lambda示例: {(lambda x: abs(x)) (x)}')
print(f'Lambda平方示例: {(lambda x: pow(x, 2)) (5)}')
结果:
Lambda示例: 20.45
Lambda平方示例: 25
7. f-字符串的其他例子
让我们看一些Python f-strings的其他例子。
print(f'{"带引号的字符串"}')
print(f'{{ {4*10} }}')
print(f'{{{4*10}}}')
输出:
带引号的字符串
{ 40 }
{40}
关于Python格式化字符串,也就是f-strings,就是这些了。
你可以从我们的GitHub代码库中查看完整的Python脚本和更多的Python示例。
参考文献:PEP-498,官方文档。