Python3中的f-Strings增强版字符串格式化方法


Posted in Python onMarch 04, 2020

在Python3.6提供f-Strings新的字符串格式化语法。不仅更加可读、简洁,相比其他方式也不易造成错误,而且还更快。
看完本文你将学习到如何以及为什么使用f-strings。正式开始之前,我们先看看之前格式化字符串语法。

1. 旧式字符串格式化

在Python3.6之前,主要有两种方式格式化字符串:%-格式化 和 str.format()。下面我们先了解它们的用法以及局限性。

1.1 %-格式化

这时Python的官方字符串格式化方法,从语言开始时就存在。官方文档明确提出不建议使用,并其他使用其他方式代替避免不必要的错误。

String对象内置了%操作,用于格式化字符串,请看示例:

>>> name = "Eric"
>>> "Hello, %s." % name
'Hello, Eric.'

如果需要插入多个变量,则需要使用元祖:

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'

上面两个实例还比较好理解,但当使用多个参数,字符串变得很长时,可读性会下降;因为冗长易导致错误,故不建议使用。

1.2. 使用 str.format()方法

这种较新的方式是Python2.6版本提供的。是%格式化的升级方式。使用正常的方法调用实现字符串转换。其内部通过类的__format__() 方法实现。使用时被替换的地方使用花括号标记。

下面看个示例:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'

也可以通过索引方式引用变量:

>>> "Hello, {1}. You are {0}.".format(age, name)
'Hello, Eric. You are 74.'

但如果使用变量名作为参数,而对于值也是对象属性,则需要在实际参数中传入对象。

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(name=person['name'], age=person['age'])
'Hello, Eric. You are 74.'

我们也可以使用**进行简化字典传输:

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'

str.format方式对%格式化进行了有限的升级,但仍不是最好的。当传入多个参数时,还是很冗余且易错。如果字典值传递给.format()变量,可以用.format(**some_dict)对其解包,并使用键索引对应值,但是有更好的办法进行处理。

2. 增强版字符串格式化方式 f-Strings

f-Strings可以解决上述问题,而且容易使用且十分有效。2015年8月在Python3.6版中提供。
也称为格式化字符串自变量,f开头的字符串中花括号括起来的变量会被替换。该表达式在运行时被评估并使用__format__方法进行格式化。下面看一些示例:

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

与str.format()方法类似但更简洁。使用大写字符F也行:

>>> F"Hello, {name}. You are {age}."
'Hello, Eric. You are 74.'

2.1. 格式化任意表达式

因为f-string是在运行时评估,因此可以放入任何有效Python表达式,这可以实现漂亮的任务。

>>> f"{2 * 37}"
'74'

直接调用函数:

>>> def to_lowercase(input):
...  return input.lower()

>>> name = "Eric Idle"
>>> f"{to_lowercase(name)} is funny."
'eric idle is funny.'

干脆直接调用方法:

>>> f"{name.lower()} is funny."
'eric idle is funny.'

当然也可以是自定义类。假设我们定义下面类:

class Comedian:
 def __init__(self, first_name, last_name, age):
  self.first_name = first_name
  self.last_name = last_name
  self.age = age

 def __str__(self):
  return f"{self.first_name} {self.last_name} is {self.age}."

 def __repr__(self):
  return f"{self.first_name} {self.last_name} is {self.age}. Surprise!"

调用方法代码:

>>> new_comedian = Comedian("Eric", "Idle", "74")
>>> f"{new_comedian}"
'Eric Idle is 74.'

str() 和 repr() 方法用于实现以字符串形式表示对象。所以类定义时确保至少包括它们中的一个。如果需要挑选一个,则为 repr(),因为在使用__str__()的地方都可以使用__repr__()。

由__str__()返回的字符串是对象的非正式字符串表示,应该是可读的。由__repr__()返回的字符串是官方表示,应该是明确的(外层多了引号,长度是原来长度+2)。直接调用str()和repr()比直接使用_str__()和_repr__()要好。

缺省情况下使用str函数,但可以使用!r标识明确调用repr:

>>> f"{new_comedian}"
'Eric Idle is 74.'
>>> f"{new_comedian!r}"
'Eric Idle is 74. Surprise!'

2.2. 多行f-strings

我们可以格式化多行字符串:

>>> name = "Eric"
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> message = (
...  f"Hi {name}. "
...  f"You are a {profession}. "
...  f"You were in {affiliation}."
... )
>>> message
'Hi Eric. You are a comedian. You were in Monty Python.'

但需要在每行前面增加f。下面代码不工作:

>>> message = (
...  f"Hi {name}. "
...  "You are a {profession}. "
...  "You were in {affiliation}."
... )
>>> message
'Hi Eric. You are a {profession}. You were in {affiliation}.'

我们看到没有f的行没有被解析。

对于多行我们也可以使用反斜杠进行换行:

>>> message = f"Hi {name}. " \
...   f"You are a {profession}. " \
...   f"You were in {affiliation}."
...
>>> message
'Hi Eric. You are a comedian. You were in Monty Python.'

但如何使用三个分号“““:

>>> message = f"""
...  Hi {name}. 
...  You are a {profession}. 
...  You were in {affiliation}.
... """
...
>>> message
'\n Hi Eric.\n You are a comedian.\n You were in Monty Python.\n'

3. 总结

本文介绍了Python3.6提供的增强字符串格式化方法。通过与之前的两种方法对比,f-string缺省更加简洁、易读。

到此这篇关于Python3中的f-Strings增强版字符串格式化方法的文章就介绍到这了,更多相关Python格式化字符串f-string内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现的石头剪子布代码分享
Aug 22 Python
python基础教程之缩进介绍
Aug 29 Python
python基于xml parse实现解析cdatasection数据
Sep 30 Python
在Docker上部署Python的Flask框架的教程
Apr 08 Python
利用Python中的输入和输出功能进行读取和写入的教程
Apr 14 Python
python从网络读取图片并直接进行处理的方法
May 22 Python
python版opencv摄像头人脸实时检测方法
Aug 03 Python
PyCharm在新窗口打开项目的方法
Jan 17 Python
Numpy之random函数使用学习
Jan 29 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
Python一些基本的图像操作和处理总结
Jun 23 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 #Python
python3格式化字符串 f-string的高级用法(推荐)
Mar 04 #Python
利用Python脚本批量生成SQL语句
Mar 04 #Python
一文了解python 3 字符串格式化 F-string 用法
Mar 04 #Python
Python正则表达式学习小例子
Mar 03 #Python
python正则表达式实例代码
Mar 03 #Python
python 实现在无序数组中找到中位数方法
Mar 03 #Python
You might like
set_include_path在win和linux下的区别
2008/01/10 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
php中smarty实现多模版网站的方法
2015/06/11 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
PHP7下协程的实现方法详解
2017/12/17 PHP
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
Exitjs获取DataView中图片文件名
2009/11/26 Javascript
Js sort排序使用方法
2011/10/17 Javascript
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
javascript里绝对用的上的字符分割函数总结
2014/07/31 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
react项目如何使用iconfont的方法步骤
2019/03/13 Javascript
微信小程序 如何保持登录状态
2019/08/16 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
JavaScript类的继承多种实现方法
2020/05/30 Javascript
python实现线程池的方法
2015/06/30 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
Scrapy-redis爬虫分布式爬取的分析和实现
2017/02/07 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
python实现趣味图片字符化
2019/04/30 Python
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
大学生演讲稿范文
2014/01/11 职场文书
消防安全责任书范本
2014/04/15 职场文书
外贸业务员求职信
2014/06/16 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书
python3 删除所有自定义变量的操作
2021/04/08 Python
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers