Python 中的 f-string

127 阅读4分钟

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-stringf"Name: {name}, Age: {age}"简洁、直观、高效需要 Python 3.6+

4. 注意事项

  1. 引号使用:f-string 本身可以用单引号、双引号、三引号,但内部嵌入的字符串要注意引号匹配。

    # 正确
    print(f"He said: '{text}'")
    
    # 错误(引号冲突)
    # print(f"He said: "{text}"")  # 语法错误
    
  2. 表达式复杂度:虽然可以在 {} 中写复杂表达式,但为了可读性,不建议写过于复杂的逻辑。

  3. 性能: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 编程中必不可少的工具。