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

Python字符串格式化全面教程 - 高效处理文本的必备技能 | Python编程指南

Python字符串格式化全面指南

掌握高效处理文本数据的必备技能

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

字符串格式化是Python编程中的基础技能,它允许你将变量、表达式或计算结果动态插入到字符串中。无论你是生成报告、创建用户界面还是处理数据,字符串格式化都能让你的代码更简洁、更易读、更高效。

主要优势:

  • 动态创建内容丰富的字符串
  • 精确控制数字、日期等数据的显示格式
  • 提高代码可读性和可维护性
  • 减少字符串拼接错误
  • 提升代码执行效率

三种主要字符串格式化方法

1 使用 % 操作符(传统方法)

这是Python最早的字符串格式化方法,使用类似C语言中printf风格的格式说明符。

name = "Alice"
age = 30
height = 1.68

# 基本使用
print("Name: %s, Age: %d" % (name, age))

# 浮点数格式化
print("Height: %.2f meters" % height)

# 字典格式化
print("User: %(name)s, %(age)d years old" % {"name": name, "age": age})

格式说明符:

  • %s - 字符串
  • %d - 十进制整数
  • %f - 浮点数
  • %x - 十六进制整数
  • %% - 百分号字符

2 使用 str.format() 方法(Python 2.6+)

这种方法更加灵活,使用大括号 {} 作为占位符,支持位置参数和关键字参数。

# 位置参数
print("{} is {} years old.".format("Bob", 25))

# 索引参数
print("{0} scored {1} points. Good job, {0}!".format("Charlie", 95))

# 关键字参数
print("Name: {name}, Email: {email}".format(name="David", email="david@example.com"))

# 数字格式化
pi = 3.14159265
print("Pi: {:.2f}".format(pi))  # 保留两位小数
print("Hex: 0x{:X}".format(255))  # 十六进制

# 对齐和填充
print("{:<20} | {:^10} | {:>10}".format("Left", "Center", "Right"))
print("{:*^30}".format("Centered Title"))

格式规范:

  • {index/key:format_spec} - 通用格式
  • :.2f - 保留两位小数的浮点数
  • :<20 - 左对齐,宽度20
  • :^10 - 居中对齐,宽度10
  • :>10 - 右对齐,宽度10
  • :, - 千位分隔符

3 使用 f-strings(Python 3.6+)

格式化字符串字面值(f-strings)是最新且推荐的方法,在字符串前加 f 前缀,直接在占位符 {} 中嵌入表达式。

# 基本用法
name = "Emma"
age = 28
print(f"My name is {name} and I'm {age} years old.")

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

# 函数调用
def to_upper(s):
    return s.upper()
    
print(f"Shout: {to_upper('hello')}")

# 格式规范
price = 49.99
print(f"Price: ${price:.2f}")

# 多行f-string
message = (
    f"User Information:\n"
    f"Name: {name}\n"
    f"Age: {age}\n"
    f"Next year: {age + 1}"
)
print(message)

f-strings 优势:

  • 语法简洁直观,提高可读性
  • 直接嵌入表达式和函数调用
  • 执行速度比%操作符和str.format()更快
  • 支持多行字符串和复杂表达式
  • Python 3.6+推荐使用

字符串格式化高级技巧

数字格式化技巧

# 千位分隔符
num = 1234567890
print(f"{num:,}")  # 1,234,567,890

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

# 科学计数法
small_num = 0.000000123
print(f"{small_num:.2e}")  # 1.23e-07

# 不同进制
n = 42
print(f"Hex: {n:#x}")  # 0x2a
print(f"Binary: {n:b}")  # 101010
# 固定宽度
for i in range(1, 6):
    print(f"{i:02d}: {i**2:3d} {i**3:4d}")

# 输出:
# 01:   1    1
# 02:   4    8
# 03:   9   27
# 04:  16   64
# 05:  25  125

# 符号显示
temps = [12.5, -3.4, 0, 5.6]
for t in temps:
    print(f"Temp: {t:+.1f}°C")
    
# 输出:
# Temp: +12.5°C
# Temp: -3.4°C
# Temp: +0.0°C
# Temp: +5.6°C

日期和时间格式化

from datetime import datetime

now = datetime.now()

# 基本日期格式化
print(f"Today: {now:%Y-%m-%d}")
print(f"Time: {now:%H:%M:%S}")

# 完整格式
print(f"Timestamp: {now:%Y-%m-%d %H:%M:%S}")

# 更可读的格式
print(f"Date: {now:%A, %B %d, %Y}")
print(f"Time: {now:%I:%M %p}")

# 输出示例:
# Today: 2023-10-15
# Time: 14:30:45
# Timestamp: 2023-10-15 14:30:45
# Date: Sunday, October 15, 2023
# Time: 02:30 PM

字符串格式化最佳实践

选择正确的方法

  • Python 3.6+: 优先使用f-strings
  • 兼容旧版本: 使用str.format()
  • 维护旧代码: 保留%操作符
  • 需要本地化: 考虑string.Template

性能考虑

  • f-strings在运行时效率最高
  • 避免在循环中使用复杂表达式
  • 对于大量格式化操作,考虑使用生成器
  • 缓存重复使用的格式字符串

安全与可读性

  • 避免从不受信任的来源格式化字符串
  • 对用户输入进行适当清理
  • 使用描述性变量名提高可读性
  • 复杂表达式拆分为多行

何时不使用格式化字符串?

虽然字符串格式化非常强大,但在以下情况下可能有更好的选择:

  • 复杂模板: 对于多段落文本,使用模板引擎(如Jinja2)
  • 用户界面: GUI框架通常有专门的文本布局系统
  • 国际化: 使用gettext等国际化解决方案
  • 超长字符串: 考虑使用字符串构建器或列表join方法

总结:Python字符串格式化核心要点

%操作符

传统方法,适合简单格式化,兼容旧代码

str.format()

灵活强大,支持复杂格式,兼容Python 2.6+

f-strings

现代方法,简洁高效,Python 3.6+首选

关键建议: 在新项目中使用f-strings,确保代码简洁高效。维护旧代码时,保持原有风格一致性。

发表评论