当前位置: 首页 > 科技观察

Python3.8应该升级吗?小哥用过后说这个

时间:2023-03-13 04:23:23 科技观察

本文转载自雷锋网。如需转载,请到雷锋网官网申请授权。距离Python3.8稳定版正式发布已经半个月了。许多Python常驻用户已将Python更新到3.8版本。有些朋友因为担心代码兼容性等问题,还停留在Python3.7。那么,我们应该更新到Python3.8吗?新版本有什么特点?它能给程序员带来什么样的好处?国外一位忠实的python小弟发了一篇文章,详细讲解了Python3.8的特殊新特性,并结合了很多例子。雷风网的AI开发者也将其更多的功能整理到了后面的文章中。希望这篇文章可以帮助你更好地理解Python3.8。海象运算符AnimeshGaitonde是一个Python狂热者,这是他在Python3.8中对海象运算符的看法-Python社区最近发布的3.8版本的语言。作为Python的忠实粉丝,我研究了发行说明,一个特定的运算符引起了我的注意,它被称为海象运算符(:=)或赋值表达式运算符。这个新的运算符(:=)使我们能够为表达式中的变量赋值。该符号有点像海象的眼睛和长牙(因此称为“海象操作员”)。海象小试现在我们来看下面的代码片段:countries=["India","USA","France","Germany"]iflen(countries)<5:print("Lengthofcountriesis"+len(countries))in在此代码片段中,我们将调用函数len()两次。有没有办法避免重新调用以获得更好的可读性?是的,我们改进代码后得到了如下结果:country_size=len(countries)ifcountry_size<5:print("Lengthofcountriesis"+country_size)还有进一步改进的余地吗?我们可以避免在单独的行中分配变量“country_size”吗?Python3.8中引入的海象运算符拯救了我们,它允许我们在if语句本身内声明和赋值:ifcountry_size:=len(countries)<5:print("Lengthofcountriesis"+country_size)让我们来探讨一下进一步的运营商能力。平衡代码行数与复杂性让我们看下面的例子:多次调用一个代价高昂的函数在上面的例子中,列表由多次调用一个代价高昂的函数来运行。但是在海象运算符的帮助下,我们可以将结果存储在一个变量中,并在进一步的计算中重复使用同一个变量,从而避免多次调用get_count()函数。下面是使用海象运算符后的一个例子:使用海象运算符避免多次函数调用从上面的例子可以看出,海象运算符减少了代码行数,使代码更具可读性,从而简化了审阅者的工作。此外,它在代码行数和代码复杂性之间取得了更好的平衡。理解效率低下Populatingalistbasedonacondition在上面的例子中,我们正在执行多个操作。最初,我们创建一个空列表,然后遍历ID列表并通过检查结果是否有效来填充列表。使用海象运算符,我们可以简化上面的代码并将所有内容放在一行中。用户需要避免海象运算符的误解Processingfilesinchunks在处理大文件时,我们将文件分成块并读取。每次读取一个chunk,都会检查这个值,并作为while循环中的终止条件,代码如下:chunk=file.read(256)whilechunk:process(chunk)chunk=file.read(256)通过使用海象运算符,我们可以在while循环的表达式中读取并赋值读取的值,这也避免了在while循环外显式声明变量。下面是一个示例:whilechunk:=file.read(256):process(chunk)正则表达式匹配正则表达式匹配是一个两步过程。在第一步中,我们检查是否匹配,在下一步中,我们提取子组:regexmatch从上面的代码可以看到,如果匹配,我们将重新计算re.match(info),这将根据数据计算减慢程序。上面使用海象运算符的代码可以改写如下,避免重新计算:正则表达式匹配:=海象运算符哪里不能用?1.给变量赋值a=5#Valida:=5#InValidempty_list=[]#Validempty_list:=[]#InValid如上所示,=运算符不能和:=运算符一起使用,海象运算符只能成为表达的一部分。2.加减a+=5#Valida:+=5#Invalid3.lambda函数中的赋值表达式(lambda:a:=5)#Invalidlambda:(a:=5)#Valid,butnotuseful(var:=lambda:5)#有效的PEP-572和有争议的海象运算符作为一部分引入pep-572(Python增强提案)。必须由发明家GuidovanRossum和他选择的代表批准的大众工具。因此围绕海象运算符的争论??很多,其中一些争论如下:1.语法变体开发人员提出了许多“:=”的替代方案,例如表达式->名称、名称->表达式、{表达式}名称、etc.很少有建议使用现有关键字,而其他建议则使用新的运算符。2.向后兼容该特性不会向后兼容,也不适用于之前的python版本。3.运算符名称人们推荐使用“赋值运算符”、“命名表达式运算符”、“成为运算符”等名称,而不是像海象运算符这样的行话,这会导致混淆。关于海象算子的争论这是对海象算子的详细介绍。此外,Python3.8还有其他新特性——仅位置参数(Positional-OnlyArguments)这是一种新的函数参数语法,用于表示某些函数参数必须使用positional-only而不是keyword-argument形式。此符号语法与使用LarryHastings的ArgumentClinic工具标记的C函数相同,如help()所示。在下面的示例中,参数a和b只是位置参数,c或d可以是位置参数或关键字,e或f必须是关键字:deff(a,b,/,c,d,*,e,f):print(a,b,c,d,e,f)下面是合法的调用:f(10,20,30,d=40,e=50,f=60)但是下面的调用都是非法的:f(10,b=20,c=30,d=40,e=50,f=60)#bcannotbeakewordargumentf(10,20,30,40,50,f=60)#emustbeakewordargument这种形式的一个用例表示法是它允许纯Python函数完全模拟用C代码编写的现有函数的行为。另一个用例是在不需要形式参数名称时排除关键字参数。例如,内置的len()函数的签名是len(obj,/)。除此之外,在Python3.8中,/可用于指示参数前面必须有位置参数。这极大地解决了之前开发人员在自定义函数中无法将参数指定为position-only参数的问题。definecr(x,/):returnx+1有关仅位置参数的更多信息:https://www.python.org/dev/peps/pep-0570/已编译字节码文件的并行文件系统缓存添加了PYTHONPYCACHEPREFIX设置(也可用于-Xpycache_prefix)将隐式字节码缓存配置为使用单独的并行文件系统树,而不是每个源代码目录的默认__pycache__子目录。缓存的位置在sys.pycache_prefix中报告(无意味着默认位置是__pycache__子目录)。更多详细信息:https://bugs.python.org/issue33499调试构建使用与发布构建相同的ABIPython现在使用相同的ABI,无论是在发布模式还是调试模式下构建。在Unix上,当Python在调试模式下构建时,在发布模式下构建的C扩展和使用稳定的ABI构建的C扩展现在可以加载更多详细信息:https://bugs.python.org/issue36721f为方便起见的字符串支持=调试说明符=向f字符串添加说明符。诸如f'{expr=}'之类的f字符串扩展为表达式的文字、等号,然后是计算表达式的表示形式。更多细节:https://bugs.python.org/issue36817PEP587:Python初始化配置在PEP587中添加了一个新的CAPI来配置Python初始化,它提供了对整个配置的更好控制和更好的错误报告。新的结构:PyConfigPyPreConfigPyStatusPyWideStringList新的函数:PyConfig_Clear()PyConfig_InitIsolatedConfig()PyConfig_InitPythonConfig()PyConfig_Read()PyConfig_SetArgv()PyConfig_SetBytesArgv()PyConfig_SetBytesString()PyConfig_SetString()PyPreConfig_InitIsolatedConfig()PyPreConfig_InitPythonConfig()PyStatus_Error()PyStatus_Exception()PyStatus_Exit()PyStatus_IsError()PyStatus_IsExit()PyStatus_NoMemory()PyStatus_Ok()PyWideStringList_Append()PyWideStringList_Insert()Py_BytesMain()Py_ExitStatusException()Py_InitializeFromConfig()Py_PreInitialize()Py_PreInitializeFromArgs()Py_PreInitializeFromArgs()()更多详细信息:https://www.python.org/dev/peps/pep-0587/Vectorcall:CPython的快速调用协议将“vectorcall”协议添加到Python/CAPI,旨在将现有的优化形式化应用于许多类。任何实现可调用对象的扩展类型都可以使用此协议。更详细的内容:https://www.python.org/dev/peps/pep-0590/Pickleprotocolwithexternaldatabuffer5当使用pickle在Python进程间传输大量数据以充分利用多核或multi-machineprocessing说到优势,通过减少内存副本来优化传输效率是非常重要的,并且可能应用一些自定义技巧,例如对特定数据进行压缩。pickle协议5引入了对外部缓冲区的支持,以便PEP3118兼容数据可以与主要pickle流分开传输,由通信层确定。更详细的内容:https://www.python.org/dev/peps/pep-0574/博客地址:http://t.cn/Ai389QHq更多关于Python3.8的内容:https://docs.python.org/zh-cn/3.8/whatsnew/3.8.html