Python 3.12新功能(3)- 增强的格式化字符串f-strings

Python 3.12新功能系列文章索引


Python 3.12新功能(1)-CSDN博客

Python 3.12新功能(2)- 类型参数语法-CSDN博客

今天是系列的第三篇,介绍一个容易消化的小甜点:Python 3.12对现有f-strings功能的增强,并不是全新的特性。

介绍

对于f-strings,小伙伴们不会感到陌生。它又称为格式化字符串,是早在Python3.6中就加入的功能。这个功能对应的PEP是PEP 498 – Literal String Interpolation | peps.python.org

 在f-strings这个功能引入到Python之前,已有的格式化功能主要有两个,一个是使用%操作符,另一个是使用str.format方法。看下面的小例子,

>>> name = "Johnson"
>>> "hello, %s" % name
'hello, Johnson'
>>> "hello, {}".format(name)
'hello, Johnson'

这两个方式都存在一些限制,一个是增加了使用者的心智负担,另外一个是支持的数据类型有限制。这里不浪费时间展开了,同学们可以自己探索一下或者查阅PEP 498。

而f-strings的目标就是为了解决字符串格式化的问题,让开发者格式化字符串的时候体验更爽一些。f-string通过最少的语法,让Python的表达式可以内嵌到文本字符串之中。例如,

>>> major = 3
>>> minor = 12
>>> f"Greetings, happy coding with Python {major}.{minor}"
'Greetings, happy coding with Python 3.12'

这样能够带来开发者体验的飞升,妈妈再也不用担心你把变量的位置或者类型弄错了~~

上面只是最简单的例子,对于复杂的数据类型,或者自定义类型,使用f-strings来格式化都很好用。例如看一个官方的例子,

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."

既然f-strings这么好,那么Python 3.12中又做了些什么改进呢?

Python 3.12中支持了PEP 701 – Syntactic formalization of f-strings, 主要的改进有以下几点:

1. 新的PEP 701使得f-strings中可以嵌入任何的合法的Python表达式,而之前基于PEP 498的实现在很多时候是无能为力的。

2. 新的f-strings能够更加优雅麻利地支持引号的嵌套,不管是单引号、双引号还是三引号。

>>> f'{"quoted string"}'
'quoted string'

例如之前的版本中,因为无法使用转义符号,对于引号的嵌套,只能让单引号双引号错峰出行。Python 3.12之中,可以这么写,使用f-strings的嵌套。

>>> f'{f'quoted string'}'
'quoted string'

或者这样道德沦丧毫无节操地骚操作(只要你的同事脾气好不打你,老板nice不扣你工钱)。

f"{f"{f"{f"{f"{f"{name}"}"}"}"}"}"

Tip: 调试表达式

有时候我们调试代码的时候,常常想知道一个表达式的值。我们会使用print函数打印出表达式和它的值。这里一个小技巧,就是在f-strings的表达式后面加上一个等号,例如下面的两个表达式。

>>> pi = 3.14
>>> f"{2 * pi = }"
'2 * pi = 6.28'
>>>
>>>
>>> f"{name = }"
"name = 'Johnson'"

小伙伴们亲自动手试一试疗效,如果好用,记得给我点赞哦。(大热天的就靠着你们点赞活着了)

其他

其他的一些小特性,例如对多行表达式的支持,引号复用等等,这里不啰嗦了,大家如果写代码时遇上了,直接查阅对应的PEP吧。

今天就更新到这里了,祝大家happy coding每一天,每天都有进步!

  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bruce Jia(上海)

熬夜码字换酒钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值