格式化输出:str.format()
str.format() 是 Python 2.6 引入的字符串格式化方法,功能比 % 操作符更强大、更灵活。它使用 {} 作为占位符,支持位置参数、关键字参数、索引访问等多种方式。
基本用法
# 位置参数
print "{} + {} = {}".format(1, 2, 3)
# 1 + 2 = 3
# 指定位置
print "{1} {0}".format("world", "hello")
# hello world
# 关键字参数
print "{name} is {age} years old".format(name="Alice", age=25)
# Alice is 25 years old
# 混合使用
print "{0} + {1} = {result}".format(1, 2, result=3)
# 1 + 2 = 3
访问对象属性
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 25)
print "{0.name} is {0.age} years old".format(p)
# Alice is 25 years old
0.name 表示第 0 个参数的 name 属性。
访问字典元素
data = {"name": "Alice", "age": 25}
print "{0[name]} is {0[age]} years old".format(data)
# Alice is 25 years old
# 用 ** 解包更简洁
print "{name} is {age} years old".format(**data)
# Alice is 25 years old
格式规范
在 {} 内用 : 分隔字段名和格式规范:
# 对齐
print "|{:<10}|".format("left") # |left |,左对齐
print "|{:>10}|".format("right") # | right|,右对齐
print "|{:^10}|".format("center") # | center |,居中
# 填充
print "|{:0>5}|".format(42) # |00042|,前导零
print "|{:*^10}|".format("hi") # |***hi****|,* 填充
# 精度
print "{:.2f}".format(3.14159) # 3.14
print "{:.5}".format("hello world") # hello,截取 5 个字符
# 千位分隔符
print "{:,}".format(1234567) # 1,234,567
# 进制
print "{:b}".format(10) # 1010,二进制
print "{:o}".format(10) # 12,八进制
print "{:x}".format(255) # ff,十六进制
print "{:X}".format(255) # FF,大写十六进制
# 百分比
print "{:.1%}".format(0.25) # 25.0%
宽度与精度组合
# 宽度 10,精度 2,右对齐
print "|{:10.2f}|".format(3.14159) # | 3.14|
# 宽度 10,精度 2,左对齐
print "|{:<10.2f}|".format(3.14159) # |3.14 |
# 宽度 10,精度 2,居中
print "|{:^10.2f}|".format(3.14159) # | 3.14 |
实际应用
表格格式化:
data = [
("Alice", 25, "Engineer"),
("Bob", 30, "Designer"),
("Charlie", 35, "Manager"),
]
print "{:<10} {:<5} {:<10}".format("Name", "Age", "Job")
print "-" * 27
for name, age, job in data:
print "{:<10} {:<5} {:<10}".format(name, age, job)
# 输出:
# Name Age Job
# ---------------------------
# Alice 25 Engineer
# Bob 30 Designer
# Charlie 35 Manager
数字格式化:
# 货币
print "${:.2f}".format(1234.5) # $1234.50
# 科学计数法
print "{:.2e}".format(1234567) # 1.23e+06
# 带符号
print "{:+d}".format(42) # +42
print "{: d}".format(42) # 42(正数前加空格)
与 % 格式化的对比
| 特性 | % 格式化 | str.format() |
|---|---|---|
| 位置参数 | %s %s | {} {} |
| 关键字参数 | %(name)s | {name} |
| 对象属性 | 不支持 | {0.name} |
| 字典元素 | %(name)s | {0[name]} 或 {name} |
| 格式规范 | %10.2f | {:10.2f} |
| 千位分隔符 | 不支持 | {:,} |
| 居中 | 不支持 | {:^10} |
str.format() 功能更强大,语法更统一。Python 2.7 项目中推荐优先使用 str.format(),但 % 格式化在旧代码中仍然大量存在,需要能读懂。