Python 3.8 究竟要不要升级?用过之后的小哥这样说
本文转自雷锋网,如需转载请至雷锋网官网申请授权。 距 Python 3.8 稳定版正式发布已经过去了小半个月,不少 Python 常驻用户已经将 Python 更新到了 3.8 版本,也有一些朋友担心代码运行兼容性等问题,依然坚挺在 Python3.7 中。 那么,究竟要不要更新到 Python 3.8?新版本有哪些特点?它能为程序猿们带来怎样的收益?一位外国的 python 忠实小哥哥发了一篇文章,用众多实例详细讲解了 Python 3.8 特别的新功能。雷锋网 AI 开发者也将其更多功能整理编译到后文中,希望这篇文章能帮助你更好的理解 Python 3.8。 海象(walrus )运算符Animesh Gaitonde 是 python 的狂热爱好者,下面是他对 python 3.8 中 walrus 运算符的使用心得—— 最近,python 社区发布了该语言的 3.8 版本。作为python 的超级粉丝 ,我研究了发行说明,有一个特别的操作符引起了我的注意,该运算符称为 walrus 运算符(:=)或赋值表达式运算符。 这个新运算符(:=)使我们能够将值赋给表达式中的变量。这个符号有点像海象的眼睛和獠牙(因此也称为「海象运算符」)。
现在让我们看看下面的代码段:
在这个代码段中,我们将调用函数 len()两次。有什么方法可以避免重新调用以提高可读性吗?是的,在改进代码之后,我们得到了以下结果:
还有进一步改进的余地吗?我们是否可以避免在单独的行中为变量「country_size」赋值?在 Python3.8 中引入的 walrus 运算符可以拯救我们,它使我们可以在 if 语句本身中声明和赋值:
让我们进一步探讨这个运算符的能力。
让我们看看下面的例子: 多次调用成本高昂的函数 在上面的示例中,通过多次调用运行成本高的函数来填充列表。但在 walrus 运算符的帮助下,我们可以将结果存储在一个变量中,并在进一步的计算中重用同一个变量,从而避免多次调用 get_count()函数。下面是使用 walrus 运算符后的示例: 使用 walrus 运算符避免多个函数调用 从上面的例子可以看出,walrus 运算符减少了代码行,使代码更具可读性,从而简化了审阅者的工作。此外,它在代码行数和代码复杂度之间达到了更好地平衡。
基于条件填充列表 在上面的例子中,我们正在执行多个操作。最初,我们创建了一个空列表,然后迭代一个 id 列表,并通过检查结果是否有效来填充该列表。 通过 walrus 运算符,我们可以简化上面的代码,并将所有内容放在一行中。 使用者需避免对 walrus 运算符的错误理解
在处理一个大文件时,我们将文件分成块并读取。每次读取块时,都会检查该值,并将其作为 while 循环中的终止条件,代码如下:
通过使用 walrus 运算符,我们可以在 while 循环的表达式中读取并分配所读数值,这样还能够避免在 while 循环外显式声明变量。下面是一个例子:
正则表达式匹配是一个需要两个步骤的过程。在第一步中,我们检查是否发生匹配,在下一步中,我们提取子组: 正则表达式匹配 从上面的代码可以看出,如果匹配,我们正在重新计算 re.match(info),这会根据数据降低程序的速度。 上述代码利用 walrus 运算符可以重写如下,并且可以避免重新计算: 正则表达式匹配:=
1. 给变量赋值 a = 5 #Valid a := 5 #InValid empty_list = [] #Valid empty_list := [] #InValid 如上所示,我们不能将=运算符与:=运算符一起使用,walrus 运算符只能是表达式的一部分。 2. 加减运算 a += 5 #Valid a :+=5 # Invalid 3. lambda 函数中的赋值表达式 (lambda: a:= 5) # Invalid lambda: (a := 5) # Valid, but not useful (var := lambda: 5) # Valid
walrus 运算符是作为 pep-572(python 增强建议)的一部分引入的。 一个面向大众的工具,必须得到发明者圭多·范·罗森(Guido van Rossum)和他所选的代表们的批准。因此,围绕 walrus 运算符的争论很多,其中部分内容如下: 1. 句法变异 开发人员提出了许多替代「:=」,例如表达式->名称、名称->表达式、{表达式} 名称等。很少有使用现有关键字的建议,而其他使用新的运算符的建议。 2. 向后兼容性 这个特性不会向后兼容,也不会在以前的 python 版本上运行。 3. 运算符名称 (编辑:ASP站长网) |