您的位置:首页 > 国际新闻

Python3.8究竟要不要升级?用过之后的小哥这样说

时间:2019-11-08

雷锋网2019.10.23我想分享

雷锋网()人工智能开发者出版社:自正式发布Python 3.8稳定版以来不到半个月,许多Python常驻用户已经将Python更新到3.8版,一些朋友担心代码兼容性等问题,这些问题在Python3.7中仍然很强大

那么,您真的想更新到Python 3.8吗?新版本的特点是什么?这会给徐苑带来什么好处?外国python的一个忠实的小弟弟发了一篇文章,用许多例子详细解释了Python 3.8的特殊新功能。 雷锋的人工智能开发人员也在下面的文章中编译了更多的功能,希望这篇文章能帮助你更好地理解Python 3.8

Animesh Gaitonde是一个蟒蛇迷。以下是他在python 3.8

中与海象操作员的经验。最近,python社区发布了该语言的3.8版本 作为python的超级粉丝,我研究了发行说明,注意到了一个特殊的运算符,叫做walrus运算符(:=)或赋值表达式运算符。

这个新运算符(:=)使我们能够给表达式中的变量赋值 这个符号有点像海象的眼睛和牙齿(因此也被称为“海象操作员”)

walrus Taurus

现在让我们看看下面的代码片段:

countries=[“印度”、“美国”、“法国”、“德国”]

iflen(国家)5:

print(‘国家长度是’+len(国家))

在这段代码中,我们将调用函数len两次。 有没有办法避免回忆来提高可读性?是的,在改进代码后,我们得到了以下结果:

country _ size=len(countries)

if country _ size 5:

print(' countries '的长度是'+country _ size)

是否还有进一步改进的余地?我们可以避免在单独的行中给变量“country_size”赋值吗?蟒蛇3.8中引入的海象操作员可以拯救我们。它使我们能够在if语句本身中声明和赋值:

IF COUNTRIE _ SIZE :=LEN(COUNTRIES)5 :

print(' countries '的长度是'+country _ size)

让我们进一步探索这个运算符的能力

代码行数和复杂性之间的平衡

让我们看看下面的例子:

对昂贵函数的多次调用

在上面的例子中,列表由对高成本运行的函数的多次调用填充 然而,在海象操作符的帮助下,我们可以将结果存储在一个变量中,并在进一步的计算中重用相同的变量,从而避免多次调用get_count函数。 下面是使用海象运算符后的一个示例:

使用海象运算符避免多个函数调用

从上面的示例中可以看出,海象运算符减少了代码行,使代码更可读,从而简化了审阅者的工作 此外,它实现了代码行数和代码复杂性之间的更好平衡

理解低效率

基于条件的填充列表

在上述示例中,我们正在执行多个操作 最初,我们创建了一个空列表,然后遍历一个id列表,并通过检查结果是否有效来填充它。

使用海象运算符,我们可以简化上面的代码,并将所有内容放在一行中。

用户需要避免对海象操作符“块处理文件”的误解。当处理一个大文件时,我们将文件分成块并读取它 每次读取数据块时,都会检查该值,并将其用作while循环中的终止条件。代码如下:

chunk=file。读取(256)

while chunk :

而组块:=文件。读取(256) :

通过使用walrus运算符,我们可以读取并分配while循环表达式中的读取值,这也避免了在while循环中显式声明变量 这里有一个例子:

而组块:=文件。读取(256) :

process (chunk)

正则表达式match

而组块:=文件。读取(256) :

正则表达式match

从上面的代码可以看出,如果有匹配,我们将重新计算re.match(信息),这将根据数据降低程序的速度。

正则表达式match

正则表达式匹配:=

哪里不能使用海象操作员?

1。将值赋给变量

a=5 # valid

a 3360=5 # invalid

empty _ list=# valid

empty _ list :=# invalid

如上所示,我们不能将=运算符与:=运算符一起使用,walrus运算符只能是表达式的一部分

2。加法和减法

a+=5 #有效

a3360+=5 #无效

3。lambda函数中的赋值表达式

(lambda : a3360=5) #无效

lambda : (a3360=5) #有效。但是没有用

(var :=lambda : 5)# valid

pep-572和有争议的

walrus运算符是作为pep-572(python增强建议)的一部分引入的

公众使用的工具必须得到发明者吉多范罗苏姆及其选定代表的批准。 因此,围绕海象运算符有许多争论,其中一些如下:

1。语法变体

开发者已经提出了许多替代方法':=',例如表达式名称、名称表达式和{表达式}名称等。 很少有人建议使用现有的关键字,而其他人则使用新的运算符。

2。向后兼容

此功能将不会向后兼容,也不会在以前的python版本上运行。

3。运算符名称

人们推荐的名称,如“赋值运算符”、“命名表达式运算符”、“成为运算符”等。而不是像海象操作员那样的行话,会导致混乱

关于海象运营商的辩论

这是海象操作员的详细介绍。此外,Python3.8还具有其他新函数

这是一种新的函数参数语法,用于指示某些函数参数必须是仅位置的形式,而不是关键字参数。 该标记语法与帮助中显示的使用拉里黑斯廷斯的argumentclient工具标记的c函数相同。

在以下示例中,形状参数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)# b不能是关键字参数

f(10,20,30,40,50,F=60)# e必须是关键字参数

该符号的一个使用案例是它允许纯Python函数完全模拟用c代码编写的现有函数的行为 另一个用例是当不需要形式参数名时排除关键字参数 例如,内置透镜函数是带符号透镜(obj,/)

除此之外,在Python3.8中,您可以使用/来指示您必须仅在位置参数之前传递参数 这极大地简化了开发人员以前没有简单的方法在自定义函数中将参数指定为仅位置参数的问题。

def incr(x,/):

return x+1

更多关于仅位置参数的信息:

新的PYTHONPYCACHEPREFIX设置(或-X py cache _ PREFF)将隐式字节码缓存配置为使用单独的并行文件系统树,而不是每个源代码目录下的默认__pycache__子目录。

缓存位置在sys.pycache_prefix中报告(无表示默认位置是__pycache__子目录)

更多细节:

无论是在发布模式还是调试模式下构建,Python现在都使用相同的ABI 在Unix上,当Python在调试模式下构建时,在发布模式下构建的c扩展和使用稳定的ABI构建的c扩展现在可以加载

更多细节:

=一个说明符已经添加到f字符串中 f字符串(例如,f“{ expr=}”将扩展到表达式的文本、等号,然后扩展到求值表达式的表示形式

更多细节:

PEP 587中添加了一个新的C API来配置Python初始化,提供了对整个配置的更好控制和更好的错误报告。

新结构:

PyConfig

pypconfig

PyStatus

pywidestringlist

new函数:

PyConfig _ clear

PyConfig _ initialatedconfig

PyConfig _ initptythonconfig

pyc onfig _ Read

PyConfig _ SetArgV

PyConfig _ SetByteSargv

PyConfig _ SetByteString

PyConfig _ SetString

pyprefig _ initialSaluttedconfig

pyprepFig _ Ini Tpyythonconfig

pySTatus _ Error

pySTatus _ Exception

pySTatus _ Exit

pySTatus _ Exit

PYSTatus _ ISexit

PYSTatus _ NOMEmory

PYSTatus _ Ok

PYwidestringlist _ Append

PYwidestringlist _ Insert

PY _ BYTESMAIN

PY _ ExitStatusException

PY _ Init IALIZEFORMCONFIG

PY _ PRIENITIALIZEFROMARGS

PY _ PRIENITIALIZEFROMBETESARGS

PY _ RUMAIN

更多详细信息:

将“vectorcall”协议添加到PYN/C API 它的目标是将已经应用于许多类的现有优化形式化。 任何实现可调用对象的扩展类型都可以使用该协议

更多细节:

将“vectorcall”协议添加到PYN/C API 它的目标是将已经应用于许多类的现有优化形式化。 任何实现可调用对象的扩展类型都可以使用该协议

pickle协议5引入了对外部缓冲区的支持,因此PEP 3118兼容数据可以与由通信层确定的主pickle流分开传输

更多详情:

将“vectorcall”协议添加到PYN/C API 它的目标是将已经应用于许多类的现有优化形式化。 任何实现可调用对象的扩展类型都可以使用该协议

更多关于Python 3.8:

雷锋网人工智能开发者

雷锋网原创文章,禁止未经授权转载 详情请参考重印说明。

收集报告投诉

雷Feng.net()人工智能开发者出版社:自Python 3.8稳定版本正式发布以来不到半个月,许多Python常驻用户已经将Python更新到3.8版本,一些朋友担心代码运行兼容性等问题,这些问题在Python3.7中仍然很强

那么,您真的想更新到Python 3.8吗?新版本的特点是什么?这会给徐苑带来什么好处?外国python的一个忠实的小弟弟发了一篇文章,用许多例子详细解释了Python 3.8的特殊新功能。 雷锋的人工智能开发人员也在下面的文章中编译了更多的功能,希望这篇文章能帮助你更好地理解Python 3.8

Animesh Gaitonde是一个蟒蛇迷。以下是他在python 3.8

中与海象操作员的经验。最近,python社区发布了该语言的3.8版本 作为python的超级粉丝,我研究了发行说明,注意到了一个特殊的运算符,叫做walrus运算符(:=)或赋值表达式运算符。

这个新运算符(:=)使我们能够给表达式中的变量赋值 这个符号有点像海象的眼睛和牙齿(因此也被称为“海象操作员”)

walrus Taurus

现在让我们看看下面的代码片段:

countries=[“印度”、“美国”、“法国”、“德国”]

iflen(国家)5:

print(‘国家长度是’+len(国家))

在这段代码片段中,我们将调用函数len两次 有没有办法避免回忆来提高可读性?是的,在改进代码后,我们得到了以下结果:

country _ size=len(countries)

if country _ size 5:

print ('Length of countries is ' + country_size)

还有进一步改进的余地吗?我们是否可以避免在单独的行中为变量「country_size」赋值?在 Python3.8 中引入的 walrus 运算符可以拯救我们,它使我们可以在 if 语句本身中声明和赋值:

if country_size :=len(countries) 5 :

print ('Length of countries is ' + country_size)

让我们进一步探讨这个运算符的能力。

代码行数与复杂度的平衡

让我们看看下面的例子:

多次调用成本高昂的函数

在上面的示例中,通过多次调用运行成本高的函数来填充列表。但在 walrus 运算符的帮助下,我们可以将结果存储在一个变量中,并在进一步的计算中重用同一个变量,从而避免多次调用 get_count函数。下面是使用 walrus 运算符后的示例:

使用 walrus 运算符避免多个函数调用

从上面的例子可以看出,walrus 运算符减少了代码行,使代码更具可读性,从而简化了审阅者的工作。此外,它在代码行数和代码复杂度之间达到了更好地平衡。

理解效率低下

基于条件填充列表

在上面的例子中,我们正在执行多个操作。最初,我们创建了一个空列表,然后迭代一个 id 列表,并通过检查结果是否有效来填充该列表。

通过 walrus 运算符,我们可以简化上面的代码,并将所有内容放在一行中。

使用者需避免对 walrus 运算符的错误理解

分块处理文件

在处理一个大文件时,我们将文件分成块并读取。每次读取块时,都会检查该值,并将其作为 while 循环中的终止条件,代码如下:

chunk=file.read(256)

while chunk:

process(chunk)

通过使用 walrus 运算符,我们可以在 while 循环的表达式中读取并分配所读数值,这样还能够避免在 while 循环外显式声明变量。下面是一个例子:

while chunk :=file.read(256) :

process(chunk)

正则表达式匹配

正则表达式匹配是一个需要两个步骤的过程。在第一步中,我们检查是否发生匹配,在下一步中,我们提取子组:

正则表达式匹配

从上面的代码可以看出,如果匹配,我们正在重新计算 re.match(info),这会根据数据降低程序的速度。

上述代码利用 walrus 运算符可以重写如下,并且可以避免重新计算:

正则表达式匹配:=

哪里不能用 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

PEP-572 与争议

walrus 运算符是作为 pep-572(python 增强建议)的一部分引入的。

一个面向大众的工具,必须得到发明者圭多范罗森(Guido van Rossum)和他所选的代表们的批准。因此,围绕 walrus 运算符的争论很多,其中部分内容如下:

1. 句法变异

开发人员提出了许多替代「:=」,例如表达式-名称、名称-表达式、{表达式} 名称等。很少有使用现有关键字的建议,而其他使用新的运算符的建议。

2. 向后兼容性

这个特性不会向后兼容,也不会在以前的 python 版本上运行。

3. 运算符名称

人们推荐的名字,比如'assignment operator'、'named expression operator'、'becomes operator'等等,而不是像 walrus operator 这样的行话,会导致混淆。

关于 walrus 运算符的争论

关于 walrus 运算符的详细介绍就是这些,除此之外,Python3.8 也有其它新功能

这是新增的一个函数形参语法,用来指明某些函数形参必须使用仅限位置而非关键字参数的形式。这种标记语法与通过 help 所显示的使用 Larry Hastings 的 Argument Clinic 工具标记的 C 函数相同。

在下面的例子中,形参 a 和 b 为仅限位置形参,c 或 d 可以是位置形参或关键字形参,而 e 或 f 要求为关键字形参:

def f(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) # b cannot be a keyword argument

f(10, 20, 30, 40, 50, f=60) # e must be a keyword argument

这种标记形式的一个用例是它允许纯 Python 函数完整模拟现有的用 C 代码编写的函数的行为。另一个用例是在不需要形参名称时排除关键字参数。例如,内置的 len 函数的签名为 len(obj, /)。

除了这一点,在 Python3.8 中,可以用/来表示必须通过仅位置参数之前的参数。这极大地方便了之前在自定义函数中,开发者没有简单的方法指定参数为仅位置参数的问题。

def incr(x, /):

return x + 1

更多关于仅位置参数:

新增的 PYTHONPYCACHEPREFIX 设置 (也可使用 -X pycache_prefix) 可将隐式的字节码缓存配置为使用单独的并行文件系统树,而不是默认的每个源代码目录下的 __pycache__ 子目录。

缓存的位置会在 sys.pycache_prefix 中报告 (None 表示默认位置即 __pycache__ 子目录)。

更详细内容:

不管是在发布模式还是调试模式下构建,Python 现在都使用相同的 ABI。在 Unix 上,当 Python 以调试模式构建时,现在可以加载以发布模式构建的 C 扩展和使用稳定 ABI 构建的 C 扩展

更详细内容:

=在 f-string 中添加了一个说明符。f 字符串(例如)f'{expr=}' 将扩展为表达式的文本、等号,然后扩展为求值表达式的表示形式。

更详细内容:

在 PEP 587 添加了新的 C API 以配置 Python 初始化,从而提供了对整个配置的更好控制和更好的错误报告。

新的结构:

PyConfig

PyPreConfig

PyStatus

PyWideStringList

新的函数:

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_PreInitializeFromBytesArgs

Py_RunMain

更详细内容:

添加 'vectorcall' 协议到 Python/C API。它的目标是对已被应用于许多类的现有优化进行正式化。任何实现可调用对象的扩展类型均可使用此协议。

更详细内容:

当使用 pickle 在 Python 进程间传输大量数据以充分发挥多核或多机处理的优势时,非常重要一点是通过减少内存拷贝来优化传输效率,并可能应用一些定制技巧例如针对特定数据的压缩。

pickle 协议 5 引入了对于外部缓冲区的支持,这样 PEP 3118 兼容的数据可以与主 pickle 流分开进行传输,这是由通信层来确定的。

更详细内容:

更多关于 Python3.8:

雷锋网 AI 开发者

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

  • 友情链接:
  • 虎亭新闻网 版权所有© www.friv9x.com 技术支持:虎亭新闻网| 网站地图