在 Python 中,格式化字符串主要有三种方式:
- 百分号 () 格式化 (旧式,不推荐在新代码中使用)
str.format()方法 (较新,功能强大,灵活)- f-strings (格式化字符串字面量) (Python 3.6+ 推荐,最简洁、最直观、性能最好)
下面我将详细介绍这三种方法,并重点推荐使用 f-strings。
百分号 () 格式化 (旧式方法)
这是 Python 早期版本中使用的字符串格式化方法,类似于 C 语言中的 printf。
基本语法:
"格式化字符串" % (变量1, 变量2, ...)
格式化标记:
%s: 字符串%d: 十进制整数%f: 浮点数%x: 十六进制整数- 输出百分号本身
示例:
name = "Alice"
age = 30
score = 95.5
# 基本格式化
print("My name is %s." % name) # 输出: My name is Alice.
print("I am %d years old." % age) # 输出: I am 30 years old.
# 格式化浮点数,保留两位小数
print("My score is %.2f." % score) # 输出: My score is 95.50.
# 格式化多个变量
print("My name is %s, I am %d years old, and my score is %.2f." % (name, age, score))
# 输出: My name is Alice, I am 30 years old, and my score is 95.50.
# 使用字典格式化
person = {'name': 'Bob', 'age': 25}
print("Name: %(name)s, Age: %(age)d" % person)
# 输出: Name: Bob, Age: 25
缺点:
- 当变量很多时,括号里的列表会变得很长,难以阅读。
- 对于非基本数据类型(如列表、元组),语法容易出错。
- 功能相对有限。
str.format() 方法 (Python 2.6+)
这是一种更现代、更灵活的字符串格式化方法,通过 和 来指定插入的位置和格式。
基本语法:
"格式化字符串 {}".format(变量1, 变量2, ...)
核心概念:
- 一个空的占位符,按顺序填充后面的变量。
{0},{1},{2}: 带索引的占位符,{0}对应第一个变量,{1}对应第二个,以此类推。{name}: 命名占位符,需要通过关键字参数来提供值。
示例:
name = "Charlie"
age = 35
score = 88.0
# 基本用法,按顺序填充
print("My name is {}.".format(name)) # 输出: My name is Charlie.
print("I am {} years old.".format(age)) # 输出: I am 35 years old.
# 使用索引
print("{1} is {0} years old.".format(age, name))
# 输出: Charlie is 35 years old.
# 使用关键字参数
print("Hello, {name}. You are {age} years old.".format(name="David", age=40))
# 输出: Hello, David. You are 40 years old.
# 格式化数字
print("The value of pi is approximately {:.2f}.".format(3.14159))
# 输出: The value of pi is approximately 3.14.
# 格式化百分比
print("Percentage: {:.0%}".format(0.75)) # 输出: Percentage: 75%
# 格式化填充和对齐
print("Left aligned: |{:<10}|".format("test")) # 左对齐,宽度为10
# 输出: Left aligned: |test |
print("Right aligned: |{:>10}|".format("test")) # 右对齐,宽度为10
# 输出: Right aligned: | test|
print("Center aligned: |{:^10}|".format("test")) # 居中对齐,宽度为10
# 输出: Center aligned: | test |
# 使用字典
person = {'name': 'Eve', 'age': 28}
print("Name: {name}, Age: {age}".format(**person))
# 输出: Name: Eve, Age: 28
优点:
- 可读性比 格式化好得多。
- 功能强大,支持命名参数、复杂的格式化选项(对齐、填充、精度等)。
- 可以重用同一个变量。
f-strings (格式化字符串字面量) (Python 3.6+)
这是目前最推荐的方式,它将表达式直接嵌入到字符串字面量中,语法非常简洁直观。
基本语法:
f"前缀{表达式1}后缀{表达式2}..."
核心概念:
- 在字符串前加上
f或F前缀。 - 在 中直接写入 Python 表达式(变量、函数调用、数学运算等)。
- 表达式会被求值,并将结果转换为字符串插入到原位置。
示例:
name = "Frank"
age = 45
score = 99.9
# 基本用法,直接嵌入变量
print(f"My name is {name}.") # 输出: My name is Frank.
print(f"I am {age} years old.") # 输出: I am 45 years old.
# 在 f-string 中进行计算和调用函数
def greet(name):
return f"Hello, {name}!"
print(f"{greet(name)} Your score is {score * 2}.")
# 输出: Hello, Frank! Your score is 199.8.
# 格式化数字
pi = 3.14159
print(f"The value of pi is approximately {pi:.2f}.")
# 输出: The value of pi is approximately 3.14.
# 格式化百分比
percentage = 0.85
print(f"Percentage: {percentage:.0%}")
# 输出: Percentage: 85%
# 格式化填充和对齐
print(f"Left aligned: |{name:<10}|") # 左对齐,宽度为10
# 输出: Left aligned: |Frank |
print(f"Right aligned: |{name:>10}|") # 右对齐,宽度为10
# 输出: Right aligned: | Frank|
print(f"Center aligned: |{name:^10}|") # 居中对齐,宽度为10
# 输出: Center aligned: | Frank |
# 使用字典
person = {'name': 'Grace', 'age': 32}
print(f"Name: {person['name']}, Age: {person['age']}")
# 输出: Name: Grace, Age: 32
# 使用对象属性
class User:
def __init__(self, name, age):
self.name = name
self.age = age
user = User("Heidi", 50)
print(f"User's name is {user.name} and age is {user.age}.")
# 输出: User's name is Heidi and age is 50.
优点:
- 语法最简洁、最易读,代码看起来非常自然。
- 性能最好,f-string 在编译时被求值,比
str.format()和 都快。 - 功能强大,可以包含任意有效的 Python 表达式。
- 是 Python 的官方推荐用法。
总结与对比
| 特性 | 百分号 () | str.format() |
f-strings |
|---|---|---|---|
| 语法 | "text %s" % var |
"text {}".format(var) |
f"text {var}" |
| 可读性 | 较差 | 良好 | 极佳 |
| 性能 | 较慢 | 中等 | 最快 |
| 功能 | 基础 | 强大 | 非常强大 |
| Python 版本 | 所有版本 | 6+ | 6+ |
| 推荐度 | 不推荐 | 可用 | 强烈推荐 |
最佳实践
除非你需要在 Python 3.6 以下的版本中运行代码,否则请始终优先使用 f-strings。
它们是现代 Python 编程中处理字符串格式化的标准方式,兼具了简洁性、可读性和高性能。
