爆米花烘焙
66.80M · 2026-04-14
本文全面讲解 Python 三种字符串格式化方式:% 格式化(旧式)、format 方法(新式)和 f-string(现代)。通过对比分析,帮助读者掌握从基础到高级的字符串处理技能,特别推荐 Python 3.6+ 的 f-string 作为首选方案,享受简洁语法和极致性能。
字符串格式化是编程中最常用的操作之一,Python 提供了三种格式化方式,各有特点和适用场景。
从 Python 诞生之初的 % 格式化,到 Python 2.6 引入的 format 方法,再到 Python 3.6 推出的 f-string,字符串格式化工具不断演进,朝着更简洁、更强大、更高效的方向发展。
本文将系统讲解这三种格式化方式,帮助你:
% 格式化是 Python 最古老的字符串格式化方式,源自 C 语言的 printf 函数,虽然未被废弃,但已不推荐在新项目中使用 ️
name = "Alice"
age = 25
# %s 表示字符串,%d 表示整数
print("Hello, %s! You are %d years old." % (name, age))
# 输出:Hello, Alice! You are 25 years old.
| 占位符 | 说明 | 例子 |
|---|---|---|
%s | 字符串 | "%s" % "hello" → "hello" |
%d | 整数 | "%d" % 3.14 → "3" |
%f | 浮点数 | "%.2f" % 3.1415 → "3.14" |
%r | repr 字符串(带引号) | "%r" % "hello" → "'hello'" |
# %s vs %r 的区别
print("%s" % "hello") # hello(只是值)
print("%r" % "hello") # 'hello'(带引号,repr 形式)
# 浮点数精度(小数点后保留几位)
pi = 3.1415926
print("%.2f" % pi) # .2f 表示保留2位小数 → 3.14
print("%.3f" % pi) # .3f 表示保留3位小数 → 3.142
# 宽度控制(总宽度,正数右对齐,负数左对齐)
print("%10s" % "hi") # 10 表示总宽度10字符,右对齐 → ' hi'
print("%-10s" % "hi") # -10 表示左对齐 → 'hi '
data = {"name": "Bob", "age": 30}
print("Name: %(name)s, Age: %(age)d" % data)
# 输出:Name: Bob, Age: 30
format 或 f-string,但 % 格式化依然被支持format、f-string 混合使用format 方法是 Python 2.6 引入的格式化方式,比 % 更灵活强大
# 空的占位符,按顺序填充
print("Hello, {}!".format("Alice")) # Hello, Alice!
# 多个占位符
print("{} + {} = {}".format(1, 2, 3)) # 1 + 2 = 3
用 {0}、{1} 等数字指定参数位置(0 表示第1个参数,1 表示第2个,以此类推):
# 使用索引
print("{0} {1} {0}".format("Hello", "World"))
# 输出:Hello World Hello
# 调换顺序
print("{1} {0}".format("World", "Hello")) # Hello World
通过名称指定参数:
# 使用关键字参数
print("{name} is {age} years old".format(name="Tom", age=20))
# 输出:Tom is 20 years old
# 混合使用
print("{0} is {age} years old".format("Bob", age=25))
# 输出:Bob is 25 years old
# 用字典传参
data = {"name": "Lily", "age": 18}
print("{name} is {age}".format(**data))
# 输出:Lily is 18
控制数字格式:
# 浮点数精度(:.数字f,:后是数字,f表示浮点数)
print("{:.2f}".format(3.14159)) # .2f 表示保留2位小数 → 3.14
print("{:.3f}".format(3.14159)) # .3f 表示保留3位小数 → 3.142
# 对齐与宽度(:数字表示宽度,>右 <左 ^中)
print("{:>10}".format("hi")) # > 右对齐 → ' hi'
print("{:10}".format("hi")) # 默认左对齐 → 'hi '
print("{:^10}".format("hi")) # ^ 居中 → ' hi '
# 填充(填充字符 + 对齐符号 + 宽度)
print("{:*>10}".format("hi")) # * 填充,> 右对齐 → '********hi'
print("{:*<10}".format("hi")) # * 填充,< 左对齐 → 'hi********'
print("{:*^10}".format("hi")) # * 填充,^ 居中 → '****hi****'
# 千位分隔符(,)
print("{:,}".format(1000000)) # , 添加千位分隔符 → 1,000,000
# 百分比(.数字%)
print("{:.1%}".format(0.25)) # .1% 表示保留1位小数,乘以100加%符号 → 25.0%
f-string 是 Python 3.6 引入的格式化方式,语法最简洁、性能最优,推荐使用!
在字符串前加 f 或 F,用 {} 嵌入变量:
name = "Alice"
age = 25
# f-string 基本语法
print(f"Hello, {name}! You are {age} years old.")
# 输出:Hello, Alice! You are 25 years old.
# 表达式求值示例
a = 5
b = 3
print(f"{a} + {b} = {a + b}") # 5 + 3 = 8
# 变量引用
words = ["hello", "world"]
print(f"Words: {words}") # Words: ['hello', 'world']
# 条件表达式
age = 20
status = "adult" if age >= 18 else "minor"
print(f"Status: {status}") # Status: adult
# 函数调用
def greet(name):
return f"Hello, {name}!"
name = "Alice"
print(f"Message: {greet(name)}") # Message: Hello, Alice!
# 调用字符串方法
name = "alice"
print(f"Name: {name.title()}") # Name: Alice
# 浮点数精度(:.数字f)
pi = 3.14159
print(f"Pi: {pi:.2f}") # Pi: 3.14
# 千位分隔符(,)
print(f"Number: {1000000:,}") # Number: 1,000,000
# 百分比(.数字%)
print(f"Percent: {0.25:.1%}") # Percent: 25.0%
# 进制转换(c=character字符,d=decimal十进制,x=hexadecimal十六进制,b=binary二进制,o=octal八进制)
print(f"Char: {66:#c}") # Char: B
print(f"Dec: {255:#d}") # Dec: 255
print(f"Hex: {255:#x}") # Hex: 0xff
print(f"Bin: {255:#b}") # Bin: 0b11111111
print(f"Oct: {255:#o}") # Oct: 0o377
# 对齐方式(:数字 默认左对齐,:>数字 右对齐,:^数字 居中)
print(f"{'hi':>10}") # 右对齐 → ' hi'
print(f"{'hi':<10}") # 左对齐 → 'hi '
print(f"{'hi':^10}") # 居中 → ' hi '
# 填充字符(填充字符 + 对齐符号 + 宽度)
print(f"{'hi':*>10}") # * 填充,右对齐 → '********hi'
print(f"{'hi':*<10}") # * 填充,左对齐 → 'hi********'
print(f"{'hi':*^10}") # * 填充,居中 → '****hi****'
# 数字填充
print(f"{42:05d}") # 5位数字,不足补0 → 00042
print(f"{-42:05d}") # 负数示例 → -0042(负号占一位)
print(f"{42:+5d}") # 显示正负号 → ' +42'
print(f"{-42:+5d}") # 负数示例 → ' -42'
Python 3.8 引入的 = 说明符是调试神器,可以同时显示变量名和值
name = "Alice"
score = 95.5
# 常规方式:需要手动写变量名
print(f"name={name}, score={score}")
# 输出:name=Alice, score=95.5
# 使用 = 说明符:自动显示变量名
print(f"{name=}, {score=}")
# 输出:name='Alice', score=95.5
# 表达式也可以用
x = 10
print(f"{x * 2 = }")
# 输出:x * 2 = 20
f-string 可以直接访问字典和对象的属性
# 访问字典
user_info = {"name": "Bob", "id": 123}
print(f"User: {user_info['name']}, ID: {user_info['id']}")
# 输出:User: Bob, ID: 123
# 访问对象属性
class User:
def __init__(self, name):
self.name = name
user = User("Charlie")
print(f"Object name: {user.name}")
# 输出:Object name: Charlie
用三引号 """ 或 ''' 创建多行字符串 ️
name = "Alice"
age = 25
# 使用三引号
bio = f"""
Name: {name}
Age: {age}
Profession: Python Developer
"""
print(bio)
# 输出:
#
# Name: Alice
# Age: 25
# Profession: Python Developer
想在 f-string 中显示花括号或引号需要特殊处理 ️
# 显示花括号:用双花括号 {{ }}
print(f"使用花括号: {{ }}")
# 输出:使用花括号: { }
# 显示双引号:外层用单引号
print(f'双引号: "hello"')
# 输出:双引号: "hello"
# 显示单引号:外层用双引号
print(f"单引号: 'hello'")
# 输出:单引号: 'hello'
f-string 可以直接格式化 datetime 对象
from datetime import datetime
now = datetime.now()
# 完整日期时间
print(f"当前时间:{now:%Y-%m-%d %H:%M:%S}")
# 输出:当前时间:2024-05-20 14:30:00
# 仅日期
print(f"今日日期:{now:%Y年%m月%d日}")
# 输出:今日日期:2024年05月20日
# 星期几
print(f"今天是:{now:%A}")
# 输出:今天是:Monday(英文)
print(f"今天是:{now:%w}")
# 输出:今天是:1(数字,0为周日)
| 特性 | format 方法 | f-string |
|---|---|---|
| 语法 | "Hello, {}".format(name) | f"Hello, {name}" |
| 变量嵌入 | 需要传参 | 直接嵌入 |
| 表达式支持 | 有限 | 完整支持 |
| 可读性 | 较好 | 最佳 |
| Python版本 | 2.6+ | 3.6+ |
f-string 是三者中性能最优的!
| 方法 | 相对速度 | 说明 |
|---|---|---|
| f-string | 100%(最快) | 编译期直接解析,运行时直接求值 |
| format 方法 | 约 50-70% | 需要运行时解析模板 |
| % 格式化 | 约 30-50% | 最慢,已不推荐 |
什么时候用 f-string?
什么时候用 format 方法?
"{data[key]}".format(data=data, key=key))什么时候用 % 格式化?
name = "Alice"
age = 25
# f-string(推荐)
print(f"{name} is {age} years old")
# format 方法
print("{} is {} years old".format(name, age))
print("{0} is {1} years old".format(name, age))
print("{name} is {age} years old".format(name=name, age=age))
# % 格式化(不推荐)
print("%s is %d years old" % (name, age))
通过本文的学习,我们掌握了 Python 三种字符串格式化方式:
| 格式化方式 | 推荐指数 | 适用场景 | 核心特点 |
|---|---|---|---|
| f-string | ⭐⭐⭐⭐⭐ | Python 3.6+ 项目 | 语法简洁、性能最优、支持表达式 |
| format 方法 | ⭐⭐⭐⭐ | 兼容旧版本、动态模板 | 功能强大、灵活可控 |
| % 格式化 | ⭐⭐ | 维护 legacy 代码 | 历史悠久、已不推荐 |
应该做的:
= 说明符,如 f"{x=}" 快速查看变量值不应该做的:
转义如果你是 Python 初学者,建议按以下顺序学习:
掌握了字符串格式化后,你可以继续学习:
n、 t 等特殊字符最后更新时间:2026-04-13