Python 3.12新功能系列文章索引
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每一天,每天都有进步!