Python3.8的新特性总结

赋值表达式(Assignment Expressions)

Python3.8 正式版本在前两天已经发布,喜欢尝鲜的同学可以下载下来体验一下,我并没有打算升级到最新版本,因为性能上并没有显著提升。但还是有必要了解其中的新特性。
赋值表达式的语法是:“ name := expression ”,这个曾经引起很大争议特性,最终还是加入到了Python3.8。不过它也仅仅只是一个锦上添花的特性。

我们可以通过一个例子来了解它的使用场景。

>>> import re

>>> data = "hello123world"
>>> match = re.search("(\d+)", data)  # 3
>>> if match:                         # 4
...     num = match.group(1)
... else:
...     num = None
>>> num
'123'

代码很简单,就是一个使用正则表达式提取字符串中数字部分的操作。之前的做法是先将调用 re.search 方法,返回Match对象,然后赋值给变量 match,再判断 match 对象是否为None来提取其中的数字部分。

在Python3.8中,你可以将第3、4行代码合并成一行代码,在 if 语句中,可以给变量赋值,这就是赋值表达式。相比之前的版本,代码少了一行。

>>> if match:=re.search("(\d+)", data):
...     num = match.group(1)
... else:
...     num = None
...
>>> num
'123'

总结

这样看起来代码确实精简了一点点,但是,这样的特性对开发者来说,只能说是一个不痛不痒的功能。

仅位置参数(Positional-Only Arguments)

函数传递参数的方式繁多,有位置参数、默认参数、可变参数、关键字参数、命名关键字参数。
举个例子:

def add(x, y, *args, **kwargs):
    print(f"x={x}, y={y}")

这里的 x 和 y 就是两个位置参数,我们可以这样调用

add(1, 2)
x=1, y=2

因为是位置参数,严格遵守位置顺序。

不过,你也可以把 x 和 y 当做命名关键字参数进行传递,参数的顺序可改变,例如把 y 放前面,不影响结果

add(y=2, x=1)
x=1, y=2

第二种方式看似更灵活,出错的风险也增加了,特别是多人合作的项目中,例如后期如果有人将该函数的参数名字修改后,调用该函数就报错了。

那么如何从语法层面上禁止这样调用,避免出错呢?

这里就可以使用Python3.8中的仅位置参数语法了,在函数定义时,参数之间可指定一个斜杠(/),斜杠前的参数严格遵守仅位置参数的定义,例如:

def add(x, y, /, *args, **kwargs):
...     print(f"x={x}, y={y}")
...
>>> add(1,2)
x=1, y=2

"/" 告诉解释器,x 和 y 是两个严格的位置参数,不能当做命名关键字参数进行传递。如果把它当作命名关键字参数进行传递参数时,会怎么样呢?

add(y=2, x=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: add() missing 2 required positional arguments: 'x' and 'y'

报错了,系统不允许你使用这种方式调用,仅支持位置参数的方式进行调用,调用时不能指定参数的名字。

总结

仅位置参数的语法就是在函数定义时,位置参数用 “/” 进行分隔,调用时不允许使用命名关键字参数进行调用

f-strings调试

f-strings 是Python3.6中的新特性,Python3.8 中 f-strings 开始支持“=”操作,主要作用是方便用于调试。它的语法是:f'{expr=}' 。

写Python代码,我大部分时候都会用 print 函数调试,因为简单方便,如pdb、pycharm的断点调试功能只在少数特殊场景下才会使用。使用print 函数有什么问题呢?

在代码很长的复杂场景,你可能要打印好几个值,例如:

name1 = "zhang"
name2 = "li"
name3 = "wang"
print(name1)
print(name2)
print(name3)

输出:

zhang
li
wang

从输出结果来看,我们不知道哪个值对应的是哪个变量,在代码行数少的时候还能通过看源代码分辨出来,如果代码量很长很长时,就很容易搞混,不知你有没有遇到过,反正我经常为了区分谁是谁,打印时要加奇形怪异的特殊字符。

当然,在 print 时直接把变量名字打印出来是最直白的。

name1 = "zhang"
name2 = "li"
name3 = "wang"
print(f"name1={name1}")
print(f"name2={name2}")
print(f"name3={name3}")

输出:

name1=zhang
name2=li
name3=wang

​为了调试方便,python3.8在f-strings中可以使用等号“=”,打印出来时,等号左边就是变量的名字,右边是对应的值。

name1 = "zhang"
name2 = "li"
name3 = "wang"
print(f"{name1=}")
print(f"{name2=}")
print(f"{name3=}")

输出:

name1=zhang
name2=li
name3=wang

再举个例子:

now = datetime.datetime.now()
>>> print(f"{now.day=}")
now.day=21

总结

简单明了,让世界更加美好

未完待续...

想要了解更多,请点击https://docs.python.org/zh-cn/3/whatsnew/3.8.html


郑重声明

我不是知识的生产者,只是知识的学习者,搬运者,分享者,愿你我一起成长。

本文来自:
https://foofish.net/pep572.html
https://foofish.net/pep457.html
https://foofish.net/fstring-debug.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容