Python 3.6 引入了一种名为 "Formatted String Literals" 的新字符串格式化方法,通常被称为 f-strings。通过将字面量字符串前缀从 u
, r
, b
变为 f
或 F
,你可以直接在字符串中插入表达式的值, f-strings 提供了一种非常快捷和直观的方式来格式化字符串。
为何使用 f-strings?
- f-strings 提供了一种极其简洁的方式来嵌入变量或者表达式到字符串中。
- 它们通常比老式的
%
格式化或str.format()
方法更快、更直观。 - 在
{}
中书写的任何有效的 Python 表达式都可以被求值并转换为字符串。
基础用法
使用 f-strings,你只需要在字符串前加上 f
或 F
,然后在 {}
括号中放入变量或表达式:
name = 'Alice'
age = 30
f"Hello, {name}. You are {age} years old."
这段代码将输出:"Hello, Alice. You are 30 years old."
你还可以在大括号中执行简单的计算:
f"{2 * 37}"
输出将是 "74"
。
表达式和函数调用
f-strings 中你可以使用任意类型的表达式,包括函数调用:
def to_uppercase(input):
return input.upper()
name = "Bob"
f"{to_uppercase(name)} is my name."
这将输出: "BOB is my name."
字典和列表
你也可以从字典和列表中提取值:
person = {'name': 'John', 'age': 42}
f"{person['name']} is {person['age']} years old."
这将输出: "John is 42 years old."
格式化
还可以在 f-strings 中执行格式化指令,与 str.format()
方法相似:
import datetime
today = datetime.date.today()
f"{today:%B %d, %Y}"
如果今天是 2023 年 3 月 23 日,这将输出: "March 23, 2023"
。
多行 f-strings
对于跨多行的字符串,f-strings 同样有效:
name = "Alice"
profession = "Programmer"
affiliation = "Python"
message = (
f"Name: {name}\n"
f"Profession: {profession}\n"
f"Affiliation: {affiliation}"
)
print(message)
上面的代码将格式化并打印出:
Name: Alice
Profession: Programmer
Affiliation: Python
大括号字符
如果你需要在 f-strings 中包含大括号,你可以通过双重大括号来实现:
f"{{73}} is my favorite number."
输出将是:"{73} is my favorite number."
进阶
要更深入地探索 f-strings,我们可以讨论它们的一些高级用法,包括复杂表达式、调用方法、使用格式说明符和执行内联字符串操作。
调用对象的方法和属性
您可以在 f-string 表达式中调用对象的方法和属性,例如:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
return f"My name is {self.name} and I am {self.age} years old."
alice = Person("Alice", 30)
message = f"Alice says: {alice.greet()}"
print(message)
这将输出:"Alice says: My name is Alice and I am 30 years old."
复杂表达式和函数调用
f-strings 可以包含复杂的表达式,如列表推导式和函数调用:
numbers = [1, 2, 3, 4, 5]
f"Double of numbers: {[n * 2 for n in numbers]}"
这将输出:"Double of numbers: [2, 4, 6, 8, 10]"
使用格式说明符
通过使用格式说明符(冒号 :
后跟格式代码),你可以控制如何格式化f-string内的值:
import decimal
value = decimal.Decimal("12345.6789")
f"Formatted value: {value:.2f}"
输出:"Formatted value: 12345.68"
动态精度
可以通过另一个大括号表达式来动态地设置格式说明符:
precision = 3
f"Value with dynamic precision: {value:.{precision}f}"
输出:"Value with dynamic precision: 12345.679"
多行 f-strings 和字面量拼接
f-strings 支持多行。如果需要在多行间维持代码的可读性,可以用圆括号括起来实现自然的拼接:
name = "Bob"
profession = "Builder"
age = 25
message = (
f"Name: {name}\n"
f"Profession: {profession}\n"
f"Age in five years: {age + 5}"
)
print(message)
输出将会是:
Name: Bob
Profession: Builder
Age in five years: 30
调试变量和表达式
Python 3.8 引入了一个新的 =
号后缀功能,它允许你在f-string内部嵌入变量名和它们的值,这对于调试非常有用:
x = 3
y = 4
f"{x} times {y} equals {x * y} | x={x}, y={y}"
输出:"3 times 4 equals 12 | x=3, y=4"
或者更简洁的方式:
f"{x=} and {y=}"
输出:"x=3 and y=4"
安全性和局限性
需要提醒的是,由于 f-strings 在运行时进行计算,它们可能引发安全问题,尤其是当它们包含用户提供的输入时。因此,和任何涉及执行代码的特性一样,需要在使用 f-strings 时保持警惕。
此外,f-strings 不能被直接用在那些需要在定义时不立即执行格式化操作的场景中,例如在i18n(国际化)系统中定义翻译字符串。