Python 中的 f-string(格式化字符串字面值,Formatted String Literals)。
f-string 是 Python 3.6 引入的一种字符串格式化方法,它速度快、可读性强、使用方便,是目前最推荐的字符串格式化方式。
1. 基本语法
在字符串前加上前缀 f 或 F,然后在字符串内部使用大括号 {} 嵌入变量或表达式。
name = "Alice"
age = 30
# 传统方式
greeting_old = "Hello, my name is {} and I'm {} years old.".format(name, age)
# f-string 方式
greeting_new = f"Hello, my name is {name} and I'm {age} years old."
print(greeting_new)
# 输出: Hello, my name is Alice and I'm 30 years old.
2. 核心特性详解
2.1 嵌入变量和表达式
f-string 最强大的地方在于可以直接在 {} 中写入任何有效的 Python 表达式。
# 简单变量
name = "Bob"
print(f"Name: {name}") # 输出: Name: Bob
# 数学运算
a, b = 5, 3
print(f"{a} + {b} = {a + b}") # 输出: 5 + 3 = 8
print(f"Square of {a} is {a*a}") # 输出: Square of 5 is 25
# 函数/方法调用
text = "hello world"
print(f"Uppercase: {text.upper()}") # 输出: Uppercase: HELLO WORLD
print(f"Length: {len(text)}") # 输出: Length: 11
# 使用对象属性
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person("Charlie", 25)
print(f"Person: {person.name}, {person.age} years old") # 输出: Person: Charlie, 25 years old
# 使用字典
my_dict = {'key': 'value'}
print(f"Value: {my_dict['key']}") # 输出: Value: value
# 三元表达式
score = 85
print(f"Result: {'Pass' if score >= 60 else 'Fail'}") # 输出: Result: Pass
2.2 格式化输出(对齐、精度等)
在 {} 中使用冒号 : 来指定格式化选项,语法为:{expression:format_spec}
数字格式化
pi = 3.1415926535
# 保留小数位数
print(f"Pi: {pi:.2f}") # 输出: Pi: 3.14 (保留2位小数)
print(f"Pi: {pi:.4f}") # 输出: Pi: 3.1416 (保留4位小数,四舍五入)
# 百分比显示
ratio = 0.456
print(f"Ratio: {ratio:.1%}") # 输出: Ratio: 45.6% (转换为百分比,保留1位小数)
# 科学计数法
large_num = 123456789
print(f"Scientific: {large_num:.2e}") # 输出: Scientific: 1.23e+08
# 整数补零
num = 42
print(f"Number: {num:04d}") # 输出: Number: 0042 (4位宽度,前面补零)
字符串对齐
text = "Hello"
# 左对齐(默认)
print(f"'{text:<10}'") # 输出: 'Hello ' (宽度10,左对齐)
# 右对齐
print(f"'{text:>10}'") # 输出: ' Hello' (宽度10,右对齐)
# 居中对齐
print(f"'{text:^10}'") # 输出: ' Hello ' (宽度10,居中对齐)
# 用特定字符填充
print(f"'{text:*^10}'") # 输出: '**Hello***' (用*填充)
2.3 特殊字符转义
如果需要在 f-string 中显示大括号本身,需要使用双重大括号进行转义。
name = "David"
print(f"{{This is in braces}} and this is a variable: {name}")
# 输出: {This is in braces} and this is a variable: David
# 单个大括号也需要转义
print(f"{{Single brace}}")
# 输出: {Single brace}
2.4 多行 f-string
f-string 可以跨越多行,保持格式。
name = "Eva"
age = 28
job = "Designer"
message = f"""
Personal Information:
-------------------
Name: {name}
Age: {age}
Job: {job}
-------------------
"""
print(message)
2.5 嵌套 f-string
可以在 {} 内部再使用 f-string。
width = 10
value = 3.14
print(f"Value: {f'{value:.{width}f}'}") # 动态设置精度
# 输出: Value: 3.140000
3. 与其他格式化方法的对比
| 方法 | 示例 | 优点 | 缺点 |
|---|---|---|---|
| % 格式化 | "Name: %s, Age: %d" % (name, age) | 兼容老版本 | 繁琐,类型容易错 |
| str.format() | "Name: {}, Age: {}".format(name, age) | 功能强大 | 相对繁琐 |
| f-string | f"Name: {name}, Age: {age}" | 简洁、直观、高效 | 需要 Python 3.6+ |
4. 注意事项
-
引号使用:f-string 本身可以用单引号、双引号、三引号,但内部嵌入的字符串要注意引号匹配。
# 正确 print(f"He said: '{text}'") # 错误(引号冲突) # print(f"He said: "{text}"") # 语法错误 -
表达式复杂度:虽然可以在
{}中写复杂表达式,但为了可读性,不建议写过于复杂的逻辑。 -
性能:f-string 在运行时被解析,比
%格式化和str.format()更快。
5. 综合示例
# 创建一个格式化的表格输出
data = [
{"name": "Alice", "score": 95, "grade": "A"},
{"name": "Bob", "score": 82, "grade": "B"},
{"name": "Charlie", "score": 78, "grade": "C"}
]
print(f"{'Name':<10} {'Score':>6} {'Grade':>6}")
print("-" * 25)
for student in data:
# 根据分数添加颜色提示(假设支持ANSI颜色)
color_code = "32" if student["score"] >= 90 else "33" if student["score"] >= 80 else "31"
print(f"{student['name']:<10} \033[{color_code}m{student['score']:>6}\033[0m {student['grade']:>6}")
f-string 让字符串格式化变得异常简单和强大,是现代 Python 编程中必不可少的工具。