Python 3.9有什么新功能?

Python 3.9有什么新功能?

字幕组双语原文:Python 3.9有什么新功能?

英语原文:What Are The New Features in Python 3.9?

翻译:雷锋字幕组Suen


Python的新版本即将面世。现在是beta版(3.9.0b3),我们很快就会看到python3.9的完整版本。

一些最新的特性令人兴奋,在发布后使用它们将是令人震惊的。我们将讨论以下内容: 

  • 字典联合运算符 

  • 类型提示 

  • 两种新的字符串方法 

  • 新的Python解析器 

这挺酷的,让我们先来看看这些新特性以及如何使用它们。 

字典联合 

我最喜欢的一个新功能,语法流畅。如果我们有两个字典a和b需要合并,我们现在使用union运算符。 

我们有合并运算符 |:

a = {1: 'a', 2: 'b', 3: 'c'}
b = {4: 'd', 5: 'e'}
c = a | bprint(c)

输出:{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

更新运算法 |=,更新原始字典:

a = {1: 'a', 2: 'b', 3: 'c'}
b = {4: 'd', 5: 'e'}
a |= bprint(a)

输出: {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

如果字典共享一个公钥,将使用第二个字典的键值对:

a = {1: 'a', 2: 'b', 3: 'c', 6: 'in both'}
b = {4: 'd', 5: 'e', 6: 'but different'}print(a | b)

输出:{1: 'a', 2: 'b', 3: 'c', 6: 'but different', 4: 'd', 5: 'e'}

使用Iterables更新字典

|=运算符的另一个很酷的行为是使用iterable对象(如列表或生成器)用新的键值对更新字典:

a = {'a': 'one', 'b': 'two'}
b = ((i, i**2) for i in range(3))
a |= bprint(a)

输出: {'a': 'one', 'b': 'two', 0: 0, 1: 1, 2: 4}

如果我们用标准的union运算符|尝试同样的操作,将输出TypeError,因为它只允许dict类型之间的联合。

类型提示

Python是动态语言,这意味着我们不需要在代码中指定数据类型。 

这是可以的,但有时会令人困惑,而且Python的灵活性突然变得比其他任何东西都麻烦。 

从3.5开始,我们可以指定类型,但这相当麻烦。这次更新确实改变了这一点,让我们举个例子:

Python 3.9有什么新功能?

无类型提示(左) V 有类型提示(右)


在add_int函数中,我们想给它添加相同的数字(出于某种神秘的未定义的原因)。但是我们的编辑器不知道,使用+将两个字符串添加在一起是完全可以的,因此不会提示警告。 

我们现在可以做的是将预期的输入类型指定为int。 之后编辑器会立刻报出问题。

我们也可以对包含的类型进行详细说明,例如:

Python 3.9有什么新功能?

类型提示用于各处-感谢新语法,看起来更加简洁:

Python 3.9有什么新功能?

我们将sum_dict的参数指定为dict,将返回值指定为int。在测试定义期间,我们还确定了它的类型。

字符串方法

虽然没有其他新功能那么吸引人,但仍然值得一提,因为它特别有用。添加了两种用于删除前缀和后缀的新字符串方法:

"Hello world".removeprefix("He")

输出:“llo world”

Hello world".removesuffix("ld"

输出:“Hello wor” 

新解析器

这是一个看不见的变化,但有可能成为Python未来发展最重要的变化之一。 

Python当前使用的主要是基于LL(1)的语法,而该语法又可以由LL(1)解析器进行解析,该解析器从上到下,从左至右解析代码,提前一个标记。

我几乎不知道这是如何工作的—但是我可以给您介绍一些由于使用这种方法而导致的Python当前的一些问题:

Python包含非LL(1)语法;因此,当前语法的某些部分使用了变通方法,造成了不必要的情况复杂性 。LL(1) 在Python语法中创建限制(没有可能的解决方法)。此问题强调以下代码无法使用当前解析器实现(引发语法错误):

with (open("a_really_long_foo") as foo,
      open("a_really_long_bar") as bar):    pass

LL(1)在解析器中用左递归中断。这意味着特定的递归语法会导致解析树中出现无限循环。Python的创建者Guido van Rossum解释道 

所有这些因素(还有更多我根本无法理解的因素)对Python有一个主要的影响;它们限制了语言的发展。

新的基于PEG的解析器将使Python开发人员具有更大的灵活性,这一点我们将从Python 3.10 onwards  开始注意到。

这就是我们在即将到来的Python3.9中所能期待的一切。如果您真的等不及了,最新的beta版本3.9.0b3 — is available here


雷锋字幕组是一个由AI爱好者组成的翻译团队,汇聚五五多位志愿者的力量,分享最新的海外AI资讯,交流关于人工智能技术领域的行业转变与技术创新的见解。

团队成员有大数据专家,算法工程师,图像处理工程师,产品经理,产品运营,IT咨询人,在校师生;志愿者们来自IBM,AVL,Adobe,阿里,百度等知名企业,北大,清华,港大,中科院,南卡罗莱纳大学,早稻田大学等海内外高校研究所。

如果,你也是位热爱分享的AI爱好者。欢迎与雷锋字幕组一起,学习新知,分享成长。

Python 3.9有什么新功能?

雷锋网版权文章,未经授权禁止转载。详情见转载须知

Python 3.9有什么新功能?

(完)