浅析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让图片按照exif信息里的创建时间进行排序的方法
Mar 16 Python
Python检测QQ在线状态的方法
May 09 Python
神经网络(BP)算法Python实现及应用
Apr 16 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
在Python 字典中一键对应多个值的实例
Feb 03 Python
python实现kNN算法识别手写体数字的示例代码
Aug 16 Python
python list数据等间隔抽取并新建list存储的例子
Nov 27 Python
python使用html2text库实现从HTML转markdown的方法详解
Feb 21 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
Mar 10 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
python 破解加密zip文件的密码
Apr 22 Python
Python循环之while无限迭代
Apr 30 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中__get()和__set()的用法实例详解
2013/06/04 PHP
PHP判断变量是否为0的方法
2014/02/08 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
centos 7.2下搭建LNMP环境教程
2016/11/20 PHP
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
vue等两个接口都返回结果再执行下一步的实例
2020/09/08 Javascript
python处理文本文件并生成指定格式的文件
2014/07/31 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
python3排序的实例方法
2020/10/20 Python
人力资源管理毕业生自荐信
2013/11/21 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
出资证明书范本(标准版)
2014/09/24 职场文书
小学教师个人工作总结2015
2015/04/20 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书
小学英语课教学反思
2016/02/15 职场文书
MySQL限制查询和数据排序介绍
2022/03/25 MySQL
vue里使用create, mounted调用方法
2022/04/26 Vue.js
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers