跳转到内容

Python 字符串格式化

来自代码酷

Python字符串格式化[编辑 | 编辑源代码]

Python字符串格式化是指将变量、表达式或对象的值插入到字符串中的过程。Python提供了多种字符串格式化方法,每种方法都有其特点和适用场景。本教程将详细介绍Python中的主要字符串格式化技术,包括%格式化str.format()方法和f-strings(格式化字符串字面量)。

概述[编辑 | 编辑源代码]

字符串格式化是编程中的常见需求,它允许开发者:

  • 动态构建字符串
  • 控制数字的显示格式(如小数位数)
  • 对齐文本
  • 插入变量值到预定义模板中

Python随着版本演进,字符串格式化方法也在不断改进,目前主要有三种主流方法。

% 格式化(旧式格式化)[编辑 | 编辑源代码]

这是Python最早的字符串格式化方法,借鉴自C语言的printf风格。

基本语法[编辑 | 编辑源代码]

使用%运算符,左边是格式字符串,右边是被格式化的值(可以是单个值或元组)。

name = "Alice"
age = 25
print("My name is %s and I'm %d years old." % (name, age))

输出:

My name is Alice and I'm 25 years old.

格式说明符[编辑 | 编辑源代码]

常用格式说明符:

  • %s - 字符串
  • %d - 十进制整数
  • %f - 浮点数
  • %.2f - 保留两位小数的浮点数

示例[编辑 | 编辑源代码]

price = 19.99
quantity = 3
print("Total: $%.2f for %d items" % (price * quantity, quantity))

输出:

Total: $59.97 for 3 items

str.format() 方法[编辑 | 编辑源代码]

Python 2.6引入的更灵活的字符串格式化方法。

基本语法[编辑 | 编辑源代码]

使用花括号{}作为占位符,调用format()方法传入值。

print("{} comes before {}".format("apple", "banana"))

输出:

apple comes before banana

位置参数和关键字参数[编辑 | 编辑源代码]

可以指定位置或名称引用:

print("{1} is faster than {0}".format("turtle", "rabbit"))
print("Name: {name}, Age: {age}".format(name="Bob", age=30))

输出:

rabbit is faster than turtle
Name: Bob, Age: 30

格式规范[编辑 | 编辑源代码]

可以控制对齐、填充、精度等:

print("{:<10}|{:^10}|{:>10}".format("left", "center", "right"))
print("{:.3f}".format(3.1415926))

输出:

left      |  center  |     right
3.142

f-strings(Python 3.6+)[编辑 | 编辑源代码]

格式化字符串字面量(f-string)是最新且推荐的方式,在字符串前加f前缀。

基本语法[编辑 | 编辑源代码]

直接在字符串中嵌入表达式:

name = "Charlie"
age = 28
print(f"My name is {name} and I'll be {age + 1} next year.")

输出:

My name is Charlie and I'll be 29 next year.

表达式和函数调用[编辑 | 编辑源代码]

f-string中可以包含任意有效Python表达式:

import math
print(f"π的近似值是 {math.pi:.5f}")

输出:

π的近似值是 3.14159

多行f-string[编辑 | 编辑源代码]

使用三引号创建多行f-string:

user = "admin"
is_active = True
message = f"""
User: {user}
Status: {"active" if is_active else "inactive"}
Last login: {datetime.now():%Y-%m-%d}
"""
print(message)

格式规范迷你语言[编辑 | 编辑源代码]

所有格式化方法都支持格式规范迷你语言,用于控制显示方式。

对齐与填充[编辑 | 编辑源代码]

  • < - 左对齐
  • > - 右对齐
  • ^ - 居中对齐
  • = - 填充符号和数字之间
print(f"{'title':*^20}")  # 用*填充,宽度20,居中
print(f"{1234:=+10}")    # 显示符号,填充=

输出:

*******title********
+=====1234

数字格式[编辑 | 编辑源代码]

  • b - 二进制
  • x - 十六进制
  • e - 科学计数法
  • % - 百分比
print(f"{255:b}")  # 二进制
print(f"{0.25:.0%}")  # 百分比

输出:

11111111
25%

性能比较[编辑 | 编辑源代码]

f-string通常性能最好,因为它们在编译时求值:

barChart title 字符串格式化方法性能比较 x-axis 方法 y-axis 执行时间(ns) bar "f-string" : 100 bar "str.format()" : 150 bar "%格式化" : 120

实际应用案例[编辑 | 编辑源代码]

案例1:生成报告[编辑 | 编辑源代码]

def generate_report(data):
    header = f"{'Sales Report':^30}"
    separator = "=" * 30
    rows = "\n".join(
        f"{item['name']:20} ${item['amount']:>7.2f}"
        for item in data
    )
    total = sum(item['amount'] for item in data)
    footer = f"\n{'Total:':20} ${total:>7.2f}"
    return f"{header}\n{separator}\n{rows}{footer}"

data = [
    {"name": "Product A", "amount": 1250.50},
    {"name": "Product B", "amount": 750.25},
    {"name": "Service C", "amount": 420.75}
]
print(generate_report(data))

输出:

        Sales Report        
==============================
Product A           $1250.50
Product B            $750.25
Service C            $420.75
Total:              $2421.50

案例2:日志消息格式化[编辑 | 编辑源代码]

def log_event(event_type, message, severity="INFO"):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    print(f"[{timestamp}] [{severity:^7}] {event_type}: {message}")

log_event("AUTH", "User login successful", "INFO")
log_event("DB", "Query timeout", "WARNING")

输出:

[2023-08-15 14:30:45] [ INFO  ] AUTH: User login successful
[2023-08-15 14:30:45] [WARNING] DB: Query timeout

总结[编辑 | 编辑源代码]

Python字符串格式化方法比较表:

方法 Python版本 优点 缺点
%格式化 所有版本 简单,C风格熟悉 功能有限,易出错
str.format() 2.6+ 灵活,功能强大 语法稍复杂
f-string 3.6+ 简洁,高效,可读性好 需要Python 3.6+

推荐做法:

  • 新项目优先使用f-string
  • 需要兼容旧版本时使用str.format()
  • 维护旧代码时保留%格式化

掌握字符串格式化是Python编程的基础技能,合理选择格式化方法可以使代码更清晰、更易维护。