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写的一个wordpress的采集程序
Feb 27 Python
Python 编码处理-str与Unicode的区别
Sep 06 Python
python numpy格式化打印的实例
May 14 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
Sep 04 Python
Python清空文件并替换内容的实例
Oct 22 Python
python实现批量视频分帧、保存视频帧
May 31 Python
使用Python在Windows下获取USB PID&VID的方法
Jul 02 Python
关于sys.stdout和print的区别详解
Dec 05 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
Python接口测试环境搭建过程详解
Jun 29 Python
Python获取指定网段正在使用的IP
Dec 14 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开启gzip页面压缩实例
2013/06/09 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
js DOM 元素ID就是全局变量
2012/09/20 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
继续学习javascript闭包
2015/12/03 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
详解javascript事件绑定使用方法
2016/10/20 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
2018/09/12 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
JavaScript实现弹出窗口效果
2020/12/09 Javascript
Python写的一个简单监控系统
2015/06/19 Python
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
python实现二维插值的三维显示
2018/12/17 Python
django框架模板语言使用方法详解
2019/07/18 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
django美化后台django-suit的安装配置操作
2020/07/12 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
美国女性运动零售品牌:Lady Foot Locker
2017/05/12 全球购物
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
《忆江南》教学反思
2014/04/07 职场文书
硕士生找工作求职信
2014/07/05 职场文书
华清池导游词
2015/02/02 职场文书
医院员工辞职信范文
2015/05/12 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
教你用eclipse连接mysql数据库
2021/04/22 MySQL
为什么node.js不适合大型项目
2021/04/28 Javascript