跳到主要内容

Python 字符串格式化

字符串格式化是每个Python程序员必备的基本技能。它允许我们以一种易读、简洁的方式将变量值插入字符串中,或者按照特定格式显示数据。在本教程中,我们将探讨Python中的各种字符串格式化方法,从早期的%操作符到现代的f-strings。

为什么需要字符串格式化?

想象一下,你需要在输出中包含用户名、分数或其他变量:

python
name = "小明"
score = 95
# 不使用字符串格式化
print("学生" + name + "的分数是" + str(score) + "分。")

输出:

学生小明的分数是95分。

这样的代码不仅难以阅读,而且容易出错。字符串格式化提供了更优雅的解决方案。

格式化方法一:%操作符(旧式格式化)

%操作符是Python早期引入的格式化方法,受C语言printf()函数启发。

基本用法

python
name = "小明"
score = 95
message = "学生%s的分数是%d分。" % (name, score)
print(message)

输出:

学生小明的分数是95分。

常用格式说明符

格式符描述
%s字符串
%d整数
%f浮点数
%.<数字>f保留小数点后几位
%x十六进制数

示例

python
# 格式化浮点数
price = 12.5
print("商品价格:%.2f元" % price) # 保留两位小数

# 多个替换
name = "Python教程"
pages = 120
price = 45.8
print("《%s》有%d页,售价%.1f元" % (name, pages, price))

输出:

商品价格:12.50元
《Python教程》有120页,售价45.8元
警告

%格式化方法虽然仍然有效,但在现代Python编程中已经不太推荐使用,因为它有一些局限性,如语法较复杂且不够灵活。

格式化方法二:str.format()方法

Python 2.6引入了str.format()方法,提供了更强大、更灵活的字符串格式化能力。

基本用法

python
name = "小明"
score = 95
message = "学生{}的分数是{}分。".format(name, score)
print(message)

输出:

学生小明的分数是95分。

使用索引

python
message = "学生{0}的分数是{1}分。".format(name, score)
print(message)

# 索引可以重复使用
message = "{0}说:'我的分数是{1}分',{0}很开心。".format(name, score)
print(message)

输出:

学生小明的分数是95分。
小明说:'我的分数是95分',小明很开心。

使用命名参数

python
message = "学生{name}的分数是{score}分。".format(name=name, score=score)
print(message)

# 混合使用位置和命名参数
print("{name}今年{0}岁了".format(18, name="小明"))

输出:

学生小明的分数是95分。
小明今年18岁了

格式化选项

python
# 数字格式化
pi = 3.1415926
print("π值约为{:.2f}".format(pi)) # 保留两位小数

# 填充与对齐
print("{:10}|{:<10}|{:^10}|{:>10}".format("默认", "左对齐", "居中", "右对齐"))
print("{:*<10}".format("左填充")) # 左对齐,使用*填充
print("{:*>10}".format("右填充")) # 右对齐,使用*填充
print("{:*^10}".format("居中")) # 居中,使用*填充

输出:

π值约为3.14
默认 |左对齐 | 居中 | 右对齐
左填充******
******右填充
***居中****

格式化方法三:f-strings(Python 3.6+)

f-strings(格式化字符串字面量)是Python 3.6引入的新特性,提供了最简洁、最直观的字符串格式化方式。

基本用法

python
name = "小明"
score = 95
message = f"学生{name}的分数是{score}分。"
print(message)

输出:

学生小明的分数是95分。

表达式支持

f-strings的一大优势是可以在花括号内放置任何有效的Python表达式:

python
print(f"5 + 3 = {5 + 3}")

# 调用函数
def get_grade(score):
return "A" if score >= 90 else "B"

print(f"{name}的成绩等级是:{get_grade(score)}")

# 使用对象方法
print(f"大写名字: {name.upper()}")

输出:

5 + 3 = 8
小明的成绩等级是:A
大写名字: 小明

格式化选项

f-strings支持与str.format()相同的格式化选项:

python
pi = 3.1415926
print(f"π值约为{pi:.2f}") # 保留两位小数

# 日期格式化
import datetime
today = datetime.datetime.now()
print(f"今天是{today:%Y年%m月%d日}")

# 数字格式化
big_number = 1000000
print(f"科学计数法: {big_number:e}")
print(f"千分位分隔: {big_number:,}")

输出:

π值约为3.14
今天是2023年11月06日
科学计数法: 1.000000e+06
千分位分隔: 1,000,000
提示

f-strings不仅语法简洁,而且比其他格式化方法执行速度更快,是现代Python编程中推荐的字符串格式化方式。

实际应用场景

1. 生成报告和输出

python
def generate_report(name, scores):
total = sum(scores)
average = total / len(scores)

report = f"学生成绩报告\n{'='*20}\n"
report += f"姓名: {name}\n"
report += f"总分: {total}\n"
report += f"平均分: {average:.1f}\n"
report += f"成绩评级: {'优秀' if average >= 90 else '良好' if average >= 80 else '及格' if average >= 60 else '不及格'}\n"

return report

student_report = generate_report("小明", [95, 88, 92, 86])
print(student_report)

输出:

学生成绩报告
====================
姓名: 小明
总分: 361
平均分: 90.2
成绩评级: 优秀

2. 数据展示和表格

python
def display_table(headers, data):
# 计算每列宽度
col_widths = [len(h) for h in headers]
for row in data:
for i, item in enumerate(row):
col_widths[i] = max(col_widths[i], len(str(item)))

# 生成表头
header_line = " | ".join(f"{h:{w}}" for h, w in zip(headers, col_widths))
separator = "-+-".join("-" * w for w in col_widths)

# 打印表格
print(header_line)
print(separator)

# 打印数据行
for row in data:
row_line = " | ".join(f"{str(item):{w}}" for item, w in zip(row, col_widths))
print(row_line)

# 使用示例
headers = ["姓名", "语文", "数学", "英语", "总分"]
data = [
["张三", 85, 92, 78, 255],
["李四", 92, 88, 95, 275],
["王五", 78, 85, 82, 245]
]

display_table(headers, data)

输出:

姓名 | 语文 | 数学 | 英语 | 总分
----+------+------+------+-----
张三 | 85 | 92 | 78 | 255
李四 | 92 | 88 | 95 | 275
王五 | 78 | 85 | 82 | 245

3. 文件路径和URL构建

python
def build_file_path(base_dir, filename, extension):
return f"{base_dir}/{filename}.{extension}"

def build_url(base_url, endpoint, params=None):
url = f"{base_url}/{endpoint}"
if params:
query_string = "&".join(f"{k}={v}" for k, v in params.items())
url = f"{url}?{query_string}"
return url

# 文件路径示例
file_path = build_file_path("/home/user/documents", "report", "pdf")
print(file_path)

# URL构建示例
api_url = build_url("https://api.example.com", "users", {"id": 123, "format": "json"})
print(api_url)

输出:

/home/user/documents/report.pdf
https://api.example.com/users?id=123&format=json

格式化方法比较

为了帮助你选择最适合的字符串格式化方法,下面是三种主要方法的比较:

总结

Python提供了多种字符串格式化方法,每种都有其特定的用途和优势:

  1. %操作符:Python早期引入的格式化方法,语法类似C语言。
  2. str.format():更现代、更灵活的格式化方法,支持索引和命名引用。
  3. f-strings:Python 3.6引入的最新格式化方法,语法简洁直观,性能最佳。

对于现代Python编程,推荐使用f-strings(如果你的环境支持Python 3.6+),它提供了最清晰、最简洁的语法和最佳的性能。在不支持Python 3.6的环境中,str.format()是一个很好的替代选择。

练习题

  1. 使用三种不同的字符串格式化方法,创建一个包含你的姓名、年龄和城市的自我介绍。
  2. 编写一个函数,接收商品名称、单价和数量,返回格式化的订单信息。
  3. 创建一个简单的发票生成器,包括商品列表、价格、数量和总计。

扩展阅读