- 教程
- 文档
【免费下载链接】30-seconds-of-code
Coding articles to level up your development skills
字符串格式化是 Python 日常开发中使用频率最高的操作之一。本文基于 30-seconds-of-code 仓库中的 fstrings-str-format.md 技巧文档,系统讲解 Python 中两种主流的字符串格式化方式——f-string(格式化字符串字面量)与str.format()方法,并延伸介绍它们的高级格式化能力与实战用法。读完本文,你将掌握两种方式的语法差异、适用场景与选择依据,能够写出更简洁、更可读、更不易出错的格式化代码。
文档背景:这条技巧在仓库中的定位
该技巧文档位于仓库的 Python 内容目录 content/snippets/python/s/fstrings-str-format.md,归属于 Python 字符串集合(slug 为python/string,标签为string)。该集合服务于 Python 3.6 及以上版本,涵盖字符串格式化与操作等常用工具。同一集合中还包含 6-f-strings-tips.md(f-string 的 6 个实用技巧)与 hex-to-rgb.md(十六进制颜色与 RGB 互转)等文章,其中后者的实现正好用到了str.format(),可作为本文的实战佐证。
方式一:f-string(格式化字符串字面量)
格式化字符串字面量(Formatted string literals),俗称f-string,是以'f'或'F'前缀开头的字符串字面量。这类字符串内部可以包含替换字段(replacement fields),用一对花括号{}包裹。f-string 中的替换字段会在求值时被自动替换为对应表达式的值,因此它是三种方式中最直观、最简洁的一种。
原文档给出的基础示例:
name = 'John' age = 32 print(f'{name} is {age} years old') # 'John is 32 years old'可以看到,变量直接写在花括号内,代码与最终输出一一对应,可读性极强。由于 f-string 在 Python 3.6 中才被引入,使用时请确保运行环境满足 Python 3.6+(这与本仓库 Python 集合的版本定位一致)。
花括号内不止能放变量
f-string 的替换字段中可以是任意合法表达式,这正是它相比传统方式的核心优势。结合仓库中的姊妹文章 6-f-strings-tips.md,我们可以延伸出以下高频用法:
1. 打印变量名与值(调试利器)
在花括号内的变量名后加一个等号=,即可同时输出变量名与其值。注意花括号内的空白字符会被原样保留,因此可以借助空格让输出更易读:
str_val = 'apples' num_val = 42 print(f'{str_val=}, {num_val = }') # str_val='apples', num_val = 422. 在花括号内直接做数学运算
你可以在花括号中书写数学表达式,配合=还能同时打印表达式本身与计算结果:
num_val = 42 print(f'{num_val % 2 = }') # num_val % 2 = 03. 获取值的可打印表示(repr)
在花括号内的表达式后追加!r,等价于对该值调用repr(),可以快速得到其可打印表示(例如字符串会带引号):
str_val = 'apples' print(f'{str_val!r}') # 'apples'f-string 的数字与日期格式化
“f” 代表 “format”,意味着 f-string 本身就是为格式化而生的。在花括号内使用冒号:后接格式说明符(format specifier),即可控制值的展示形式。格式说明符也可以与前面的=结合使用,同时打印变量名与格式化后的值。
数字格式化:例如用.2f将数值截取到小数点后两位(注意是四舍五入):
price_val = 6.12658 print(f'{price_val:.2f}') # 6.13日期格式化:日期对象同样支持格式说明符,常用的占位符包括%Y(完整年份)、%m(月份)、%d(日):
from datetime import datetime date_val = datetime.utcnow() print(f'{date_val=:%Y-%m-%d}') # date_val=2021-07-09提示:
datetime.utcnow()在较新的 Python 版本中已被标记为弃用,建议使用datetime.now(datetime.timezone.utc)获取带时区信息的当前时间,格式化语法完全一致。
方式二:str.format()方法
str.format()的格式化能力与 f-string 非常相似,核心区别在于替换字段不再写在字符串内部,而是作为方法的参数传入。字符串模板中的{}占位符与参数按位置或名称对应。
原文档给出的基础示例:
name = 'John' age = 32 print('{0} is {1} years old'.format(name, age)) # 'John is 32 years old'示例中使用的是位置参数:{0}对应第一个参数name,{1}对应第二个参数age。除了数字位置,str.format()还支持以下形式:
- 关键字参数:
'{name} is {age} years old'.format(name='John', age=32); - 空占位符:
'{} is {} years old'.format(name, age),按出现顺序自动匹配参数; - 属性与下标访问:
'{0.first_name}'.format(user)、'{0[0]}'.format(items)。
str.format()在仓库中的实战案例
同属 Python 字符串集合的 hex-to-rgb.md 中,RGB → Hex转换函数正是一个典型的str.format()应用——它利用'{:02X}'占位符构造零填充的大写十六进制格式,并将模板复制三次后一次性填充三个通道值:
def rgb_to_hex(r, g, b): return ('{:02X}' * 3).format(r, g, b) rgb_to_hex(255, 165, 1) # 'FFA501'这段代码的价值在于展示了str.format()的三个特性:
- 占位符可以携带格式说明符:
{:02X}表示“两位宽度、前置零、大写十六进制”; - 模板可以动态拼接:
('{:02X}' * 3)在运行时生成'{:02X}{:02X}{:02X}'; - 位置参数按序填充:
r、g、b依次填入三个占位符。
两种方式如何选择?
| 维度 | f-string | str.format() |
|---|---|---|
| 引入版本 | Python 3.6+ | Python 2.6 / 3.0+ |
| 语法形式 | 表达式直接内嵌于字符串 | 占位符模板 + 参数传入 |
| 可读性 | 值就在字符串中,直观清晰 | 模板与参数分离,长模板时较难对应 |
| 延迟求值 | 字符串创建时立即求值 | 模板可先构造、后填充 |
| 典型场景 | 日常拼接、调试输出、日志 | 需要复用/预定义模板、跨 Python 2 代码 |
选择建议:
- 日常开发优先用 f-string。正如 6-f-strings-tips.md 所述,f-string 比传统方式更可读、更简洁、更不易出错,配合
=调试技巧与!r/格式说明符,几乎覆盖所有格式化需求; - 需要“模板复用”时用
str.format()。例如上面rgb_to_hex的写法,模板字符串可以先独立构造、按需填充;在需要把格式化模板作为配置项或消息模板传递的场景(如 i18n、日志模板)中,str.format()更为合适; - 兼容老版本 Python 时用
str.format()。若代码库需要运行在 Python 2.x 或 3.0–3.5 环境,f-string 不可用,此时str.format()是较好的选择。
小结
本文围绕 30-seconds-of-code 仓库的 fstrings-str-format.md 技巧,完整讲解了 f-string 与str.format()两种字符串格式化方式的语法、区别与选择依据,并结合仓库中的 6-f-strings-tips.md 与 hex-to-rgb.md 两篇同集合文章,补充了变量名打印、表达式计算、repr转换、数字与日期格式化、占位符模板复用等实战用法。掌握这两种方式,足以应对 Python 开发中绝大多数字符串格式化场景。
- 教程
- 文档
【免费下载链接】30-seconds-of-code
Coding articles to level up your development skills
相关推荐
Flipper Zero 如何运行拓麻歌子模拟器:ROM 放置、fbt 构建到按键存档,一次跑通 Tama P1
Flipper Zero 如何运行拓麻歌子模拟器:ROM 放置、fbt 构建到按键存档,一次跑通 Tama P1 🐣 想在 Flipper Zero 上养一只
示例工程WeChatMsg微信聊天记录导出完全指南:3条命令导出Word并生成年度聊天报告
WeChatMsg微信聊天记录导出完全指南:3条命令导出Word并生成年度聊天报告 你手里最完整的数据,是聊天记录,也是最好用的反面:跨设备搜不到、换机带不走、
GameDevMind 开发者工具箱实战:资源依赖检查、日志解析与性能计时三件套的源码级实现
GameDevMind 开发者工具箱实战:资源依赖检查、日志解析与性能计时三件套的源码级实现 导读:本文以 GameDevMind 知识图谱中「二 08 开发者
教程文档
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考