当前位置:首页 > Python > 正文

Python3字符串格式化输出完全指南 | 从入门到精通

Python3字符串格式化输出完全指南

掌握%操作符、str.format()和f-strings三种格式化方法

Python字符串格式化简介

Python提供了多种字符串格式化方法,每种方法都有其适用场景:

%操作符(旧式)

类似C语言的printf风格,在Python2中广泛使用,现在主要用于兼容旧代码。

str.format()(新式)

Python2.6引入,提供了更灵活和强大的格式化功能。

f-strings(字面量)

Python3.6引入,语法简洁高效,是目前推荐的方法。

%操作符格式化

使用%操作符是最早的字符串格式化方法,格式为:"格式化字符串" % 值

基本用法示例

# 字符串和整数格式化
name = "Alice"
age = 30
print("姓名: %s, 年龄: %d" % (name, age))

# 浮点数格式化
pi = 3.1415926
print("PI的值: %.2f" % pi)  # 保留两位小数

# 十六进制格式化
num = 255
print("255的十六进制: %x" % num)  # 输出 ff

常用格式说明符

说明符 含义 示例
%s 字符串 "Name: %s" % "Bob"
%d 十进制整数 "Age: %d" % 25
%f 浮点数 "Price: %.2f" % 99.95
%x 十六进制整数 "Hex: %x" % 255

str.format()方法

str.format()方法提供了更灵活、更强大的字符串格式化功能,支持位置参数和关键字参数。

基本用法示例

# 位置参数
print("{} 的年龄是 {} 岁".format("Alice", 30))

# 关键字参数
print("姓名: {name}, 分数: {score}".format(name="Bob", score=95))

# 混合使用
print("{1} 的 {0} 成绩是 {score} 分".format("数学", "小明", score=90))

# 数字格式化
print("PI值: {:.3f}".format(3.1415926))  # 保留3位小数
print("科学计数法: {:.2e}".format(0.001234))  # 1.23e-03

# 宽度和对齐
print("{:>10}".format("右对齐"))  # 宽度10,右对齐
print("{:^10}".format("居中"))    # 宽度10,居中
print("{:<10}".format("左对齐"))  # 宽度10,左对齐

高级格式化示例

# 填充字符
print("{:*^20}".format("标题"))  # 居中,宽度20,用*填充

# 千位分隔符
print("{:,}".format(1000000))  # 输出 1,000,000

# 百分比
print("{:.1%}".format(0.875))  # 输出 87.5%

# 访问对象属性
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person("Tom", 25)
print("姓名: {p.name}, 年龄: {p.age}".format(p=p))

f-strings(格式化字符串字面值)

f-strings是Python3.6引入的新特性,在字符串前加f或F前缀,可以直接在字符串内嵌入表达式。

基本用法示例

name = "Alice"
age = 30
print(f"姓名: {name}, 年龄: {age}")

# 表达式计算
a = 5
b = 10
print(f"{a} + {b} = {a + b}")

# 函数调用
def greet(name):
    return f"Hello, {name.title()}!"

print(greet("bob"))

# 字典访问
user = {"name": "Tom", "score": 95}
print(f"用户: {user['name']}, 分数: {user['score']}")

格式化选项

# 数字格式化
pi = 3.1415926
print(f"PI值: {pi:.3f}")  # 保留3位小数
print(f"科学计数法: {0.001234:.2e}")  # 1.23e-03

# 宽度和对齐
print(f"{'右对齐':>10}")  # 宽度10,右对齐
print(f"{'居中':^10}")    # 宽度10,居中
print(f"{'左对齐':<10}")  # 宽度10,左对齐

# 填充字符
print(f"{'标题':*^20}")  # 居中,宽度20,用*填充

# 千位分隔符
print(f"{1000000:,}")  # 输出 1,000,000

# 百分比
print(f"{0.875:.1%}")  # 输出 87.5%

数字格式化详解

整数格式化

# 十进制
print(f"{42:d}")   # 42

# 二进制
print(f"{10:b}")   # 1010

# 八进制
print(f"{10:o}")   # 12

# 十六进制
print(f"{255:x}")  # ff (小写)
print(f"{255:X}")  # FF (大写)

浮点数格式化

# 固定小数位数
print(f"{3.1415926:.2f}")  # 3.14

# 总宽度和小数位数
print(f"{3.1415926:8.3f}") #    3.142

# 科学计数法
print(f"{1000000:.2e}")    # 1.00e+06

# 百分比
print(f"{0.75:.1%}")      # 75.0%

对齐与填充

对齐方式 语法 示例 输出
左对齐 :<宽度 f'{"text":<10}' 'text '
右对齐 :>宽度 f'{"text":>10}' ' text'
居中对齐 :^宽度 f'{"text":^10}' ' text '
自定义填充 :填充字符^宽度 f'{"text":*^10}' '***text***'

综合示例

# 表格数据格式化
headers = ["产品", "价格", "库存"]
data = [
    ("笔记本", 5999.99, 120),
    ("手机", 3999.50, 85),
    ("平板", 2999.00, 60)
]

# 打印表头
print(f"{headers[0]:<10} | {headers[1]:>10} | {headers[2]:>10}")
print("-" * 35)

# 打印数据行
for product, price, stock in data:
    print(f"{product:<10} | ¥{price:>9.2f} | {stock:>10d}")

# 输出结果:
# 产品       |        价格 |        库存
# -----------------------------------
# 笔记本     |   ¥5999.99 |        120
# 手机       |   ¥3999.50 |         85
# 平板       |   ¥2999.00 |         60

日期和时间格式化

from datetime import datetime

now = datetime.now()

# 使用strftime格式化
print(now.strftime("%Y-%m-%d %H:%M:%S"))  # 2023-10-15 14:30:45

# 使用f-strings(Python 3.6+)
print(f"{now:%Y-%m-%d %H:%M:%S}")         # 同上

# 常用日期格式
print(f"当前日期: {now:%Y年%m月%d日}")
print(f"当前时间: {now:%H:%M:%S}")
print(f"星期简写: {now:%a}")
print(f"星期全称: {now:%A}")
print(f"月份简写: {now:%b}")
print(f"月份全称: {now:%B}")

# 组合使用
print(f"{now:%Y-%m-%d} ({now:%A})")

常用日期格式代码

  • %Y:四位年份(2023)
  • %y:两位年份(23)
  • %m:月份(01-12)
  • %d:日(01-31)
  • %H:24小时制小时(00-23)
  • %I:12小时制小时(01-12)
  • %M:分钟(00-59)
  • %S:秒(00-59)
  • %a:星期简写(Mon)
  • %A:星期全称(Monday)
  • %b:月份简写(Jan)
  • %B:月份全称(January)
  • %p:AM/PM

最佳实践与总结

选择哪种格式化方法?

  • Python 3.6+:优先使用f-strings,语法简洁,性能好
  • Python 2.6-3.5:使用str.format()方法
  • 旧代码维护:%操作符只建议在维护旧代码时使用
  • 国际化:考虑使用gettext模块进行国际化处理

性能比较

在大多数情况下,三种方法的性能差异可以忽略不计。但在需要高性能的场景下:

  • f-strings通常是最快的,因为它们在编译时解析
  • str.format()次之
  • %操作符在Python3中稍慢

总结建议

  1. 新项目优先使用f-strings(Python 3.6+)
  2. 格式化规范(宽度、精度、对齐等)在三种方法中基本一致
  3. 复杂格式化考虑使用模板字符串或第三方库(如jinja2)
  4. 用户输入格式化要谨慎,避免安全漏洞
  5. 日志记录建议使用%操作符或str.format()以兼容旧Python版本

掌握字符串格式化,提升Python编码效率

合理使用字符串格式化可以使你的代码更简洁、更易读、更专业!

发表评论