浅析Python 中几种字符串格式化方法及其比较


Posted in Python onJuly 02, 2019

起步

在 Python 中,提供了很多种字符串格式化的方式,分别是 %-formatting、str.format 和 f-string 。本文将比较这几种格式化方法。

%- 格式化

这种格式化方式来自于 C 语言风格的 sprintf 形式:

name = "weapon"
"Hello, %s." % name

C 语言的给实话风格深入人心,通过 % 进行占位。

为什么 %-formatting不好

不好的地方在于,如果字符串较长或较多的参数,那么可读性就变得很差。

str.format 格式化

PEP-3101 带来了 str.format ,它是对 %-formatting 的改进。它使用正常的函数调用语法,并且可以通过对要转换为字符串的对象的 __format __() 方法进行扩展。

"Hello, {}. You are {}.".format(name, age)

并支持字典形式传参,免于位置参数带来的麻烦:

"Hello, {name}. You are {age}.".format(name=name, age=age)

这两种方式代码效果相同,只是第一种方法需要严格控制传入的参数位置,而第二种方法没有这种限制, 并增加了代码的可读性。各种技巧可查看 Format Specification Mini-Language

为什么 str.format() 并不好

虽然它解决了字符串冗长情况下的可读性,但需要对字典传参基本是要重写一遍变量名,不够优雅。

f-string 格式化

PEP-0498 带来了 f-string 方式,它从 Python3.6 开始支持。这种方式也是使用 __format__ 协议进行格式化。

name = "Eric"
age = 74
f"Hello, {name}. You are {age}."

语法上与 str.format() 类似,但更为简洁,当字符串较长时也不会繁琐。更强大的是它支持任意的表达式。我们可以在花括号内进行四则运算或函数调用等:f"{2 * 6}" 或者 f"{name.lower()} is funny"

并且它性能也最好。

几种格式化方式性能比较

import timeit
def add():
  status = 200
  body = 'hello world'
  return 'Status: ' + str(status) + '\r\n' + body + '\r\n'
def old_style():
  status = 200
  body = 'hello world'
  return 'Status: %s\r\n%s\r\n' % (status, body)
def formatter1():
  status = 200
  body = 'hello world'
  return 'Status: {}\r\n{}\r\n'.format(status, body)
def formatter2():
  status = 200
  body = 'hello world'
  return 'Status: {status}\r\n{body}\r\n'.format(status=status, body=body)
def f_string():
  status = 200
  body = 'hello world'
  return f'Status: {status}\r\n{body}\r\n'
perf_dict = {
  'add': min(timeit.repeat(lambda: add())),
  'old_style': min(timeit.repeat(lambda: old_style())),
  'formatter1': min(timeit.repeat(lambda: formatter1())),
  'formatter2': min(timeit.repeat(lambda: formatter2())),
  'f_string': min(timeit.repeat(lambda: f_string())),
}
print(perf_dict)

结果:

{
  'add': 0.8815229000000002, 
  'old_style': 0.6351808999999999, 
  'formatter1': 0.7536176999999995, 
  'formatter2': 1.2277180999999997, 
  'f_string': 0.4891379000000011
}

f-string 格式化的方式性能最好。

为何 f-string 速度如此快

从指令来看,f'Status: {status}\r\n{body}\r\n' 翻译成:

8 LOAD_CONST        3 ('Status: ')
10 LOAD_FAST        0 (status)
12 FORMAT_VALUE       0
14 LOAD_CONST        4 ('\r\n')
16 LOAD_FAST        1 (body)
18 FORMAT_VALUE       0
20 LOAD_CONST        4 ('\r\n')
22 BUILD_STRING       5

正如指令中所示的,f-string 是运行时渲染的,底层中转成了类似 "Status: " + status+ "\r\n" + body + "\r\n" 的形式。正如 PEP-0498 中提到的:

F-strings provide a way to embed expressions inside string literals, using a minimal syntax. It should be noted that an f-string is really an expression evaluated at run time, not a constant value. In Python source code, an f-string is a literal string, prefixed with 'f', which contains expressions inside braces. The expressions are replaced with their values.

而其他方式则是要先创建字符串常量值,再进行替换之类的操作。

总结

我们仍然可以使用以前的方式进行格式化,但在此推荐 f-string 方式,因为它使用更简洁,更易读且更方便,性能又更好,完全没理由拒绝啊。

从今天开始使用 f-string!

以上所述是小编给大家介绍的Python 中几种字符串格式化方法及其比较,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
详解Python的Django框架中的模版相关知识
Jul 15 Python
Python端口扫描简单程序
Nov 10 Python
python代理工具mitmproxy使用指南
Jul 04 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
python自动生成model文件过程详解
Nov 02 Python
python实现画循环圆
Nov 23 Python
python实现大战外星人小游戏实例代码
Dec 26 Python
Python requests模块session代码实例
Apr 14 Python
Django实现celery定时任务过程解析
Apr 21 Python
Python操作Excel把数据分给sheet
May 20 Python
浅谈Python协程asyncio
Jun 20 Python
Python实现将多张图片合成MP4视频并加入背景音乐
Apr 28 Python
Python实用工具FuckIt.py介绍
Jul 02 #Python
Python如何实现转换URL详解
Jul 02 #Python
Pandas的read_csv函数参数分析详解
Jul 02 #Python
如何使用Python实现斐波那契数列
Jul 02 #Python
pandas数据筛选和csv操作的实现方法
Jul 02 #Python
Python列表与元组的异同详解
Jul 02 #Python
Pandas中resample方法详解
Jul 02 #Python
You might like
php开发工具之vs2005图解
2008/01/12 PHP
PHP中用header图片地址 简单隐藏图片源地址
2008/04/09 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
PHP利用Mysql锁解决高并发的方法
2018/09/04 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
JS实现静止元素自动移动示例
2014/04/14 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
Javascript Objects详解
2014/09/04 Javascript
详解Bootstrap按钮
2016/01/04 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
微信小程序tabBar用法实例详解
2017/12/04 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
Python学习笔记(二)基础语法
2014/06/06 Python
Python文件和目录操作详解
2015/02/08 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
python 通过文件夹导入包的操作
2020/06/01 Python
利用Python将图片中扭曲矩形的复原
2020/09/07 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
办公室主任主任岗位责任制
2014/02/11 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
护理目标管理责任书
2014/07/25 职场文书
个人租房协议书样本
2014/10/01 职场文书
防火标语大全
2014/10/06 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
关于迟到的检讨书
2015/05/06 职场文书