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统计字符串中指定字符出现次数的方法
Apr 04 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
Oct 16 Python
Python爬虫实例扒取2345天气预报
Mar 04 Python
python3读取excel文件只提取某些行某些列的值方法
Jul 10 Python
Python 实现王者荣耀中的敏感词过滤示例
Jan 21 Python
python ---lambda匿名函数介绍
Mar 13 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
Apr 18 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
快速解决pymongo操作mongodb的时区问题
Dec 05 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 Python
Python自然语言处理之切分算法详解
Apr 25 Python
图文详解matlab原始处理图像几何变换
Jul 09 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 is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
PHP获取网址的顶级域名函数代码
2012/09/24 PHP
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
JavaScript对象之间的转换 jQuery对象和原声DOM
2011/03/07 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
分享10个原生JavaScript技巧
2015/04/20 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
jquery+css实现下拉列表功能
2017/09/03 jQuery
node.js微信小程序配置消息推送的实现
2019/02/13 Javascript
node后端服务保活的实现
2019/11/10 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
vue实现虚拟列表功能的代码
2020/07/28 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
python 从远程服务器下载日志文件的程序
2013/02/10 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
Python贪心算法实例小结
2018/04/22 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
Python爬取梨视频的示例
2021/01/29 Python
公司门卫岗位职责
2015/04/13 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
Python机器学习之逻辑回归
2021/05/11 Python