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中global用法实例分析
Apr 30 Python
Python 爬虫学习笔记之正则表达式
Sep 21 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
Centos 升级到python3后pip 无法使用的解决方法
Jun 12 Python
Python爬虫框架scrapy实现的文件下载功能示例
Aug 04 Python
python实现C4.5决策树算法
Aug 29 Python
python实现udp传输图片功能
Mar 20 Python
python实现暗通道去雾算法的示例
Sep 27 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 Python
用Python自动清理系统垃圾的实现
Jan 18 Python
python实现socket简单通信的示例代码
Apr 13 Python
利用Python读取微信朋友圈的多种方法总结
Aug 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
PHP常用函数小技巧
2008/09/11 PHP
PHP与C#分别格式化文件大小的代码
2011/05/14 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
国外Lightbox v2.03.3 最新版 下载
2007/10/17 Javascript
JavaScript 拖拉缩放效果
2008/12/10 Javascript
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
基于jquery的可多选的下拉列表框
2012/07/20 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
Javascript 颜色渐变效果的实现代码
2013/10/01 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
[57:24]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
如何高效使用Python字典的方法详解
2017/08/31 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
python安装gdal的两种方法
2019/10/29 Python
python实现用户名密码校验
2020/03/18 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
网上快餐厅创业计划书
2014/02/01 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
市场调查策划方案
2014/06/10 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
个人党性锻炼总结
2015/03/05 职场文书
护理工作心得体会
2016/01/22 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python