您当前的位置:钢材 > 型钢 > 市场分析

python怎么升级,python+3.8+究竟要不要升级?用过之后的小哥这样说吗

来源:头条 作者: chanong
分享到
关注德勤钢铁网在线:
  • 扫描二维码

    关注√

    德勤钢铁网微信

在线咨询:
  • 扫描或点击关注德勤钢铁网在线客服

雷锋网AI开发者笔记:距离Python 3.8稳定版正式发布已经过去了不到半个月的时间。许多Python 常驻用户已将Python 更新到版本3.8。我也有朋友担心代码执行兼容性等问题。尽管存在这些问题,我仍然坚持使用Python 3。

那么,你应该更新到Python 3.8吗?新版本有哪些特性?它对程序员有什么好处?国外Python爱好者已经发现了Python 3.8中许多特殊新特性的例子,我曾发过一篇文章对此进行了详细解释。雷锋网AI开发者在以下文章中整理了其功能细节:我希望这篇文章可以帮助您更好地理解Python 3.8。

Animesh Gaitonde 是一名Python 爱好者。这是我在Python 3.8 —— 中使用Walrus 运算符的经验。

最近,Python 社区发布了该语言的3.8 版本。我是Python 的忠实粉丝,因此我查看了发行说明,有一个特殊的运算符引起了我的注意,称为海象运算符(:=) 或赋值表达式运算符。

这个新的运算符(:=) 允许您为表达式中的变量赋值。该符号类似于海象的眼睛和獠牙(因此得名“海象操作员”)。

海象测试

现在看一下下面的代码片段。

国家/地区=[“印度”、“美国”、“法国”、“德国”]

伊夫伦(国家)

print (\'国家长度为\' + len(国家))

此代码片段调用len 函数两次。有没有办法避免召回来提高可读性?是的,我改进了代码,得到了以下结果:

国家/地区大小=len(国家/地区)

对于国家大小

print (\'国家长度为\' + Country_size)

还有进一步改进的空间吗?我可以避免在单独的行上将值分配给变量“country_size”吗?Python 3.8 中引入的海象运算符会有所帮助,它允许我在if 语句本身中声明该值。您现在可以分配

如果国家大小:=len(国家/地区)

print (\'国家长度为\' + Country_size)

让我们进一步探讨该运算符的功能。

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

让我们看一下下面的例子。

多次调用昂贵的函数

在上面的示例中,通过调用多次运行成本高昂的函数来填充列表。但是,海象运算符允许您将结果保存在变量中,并在后续计算中重用同一变量,从而避免多次调用get_count 函数。下面是使用海象运算符的示例。

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

正如您从上面的示例中看到的,Walrus Operator 通过减少代码行数并使其更易于阅读来简化审阅者的工作。此外,代码行数和代码复杂性之间有更好的平衡。

了解低效率

根据标准创建列表

上面的例子执行了多个操作。首先创建一个空列表,然后迭代ID 列表并检查结果是否有效以填充列表。

您可以使用Walrus 运算符来简化上面的代码并将其全部放在一行中。

用户应避免对Walrus Operator 的误解

分块处理文件

处理大文件时,分块读取文件。每次读取块时,都会检查该值并将其用作while 循环的退出条件,如下所示。

块=文件.read(256)

同时块:

进程(块)

块=文件.read(256)

walurus 运算符允许您读取和分配在while 循环表达式中读取的值。这也避免了在while 循环之外显式声明变量。一个例子如下所示。

而块:=file.read(256) :

进程(块)

与正则表达式匹配

正则表达式匹配是一个两步过程。第一步检查是否存在匹配,第二步提取子组。

与正则表达式匹配

正如您从上面的代码中看到的,如果存在匹配,您将重新计算re.match(info) ,这会根据您的数据减慢您的程序。

上面的代码可以使用walrus 运算符重写如下,以避免重新计算。

正则表达式匹配:=

哪些地方不能使用海象操作员?

1. 给变量赋值

a=5 #有效

:=5 #禁用

空列表=#有效

空列表:=#无效

如上所示,=运算符不能与:=运算符一起使用,并且海象运算符只能用作表达式的一部分。

2. 加减运算

a +=5 #启用

a :+=5 # 无效

3.Lambda函数赋值表达式

(lambda: a:=5) # 无效

lambda: (a :=5) # 有效但无用

(var :=lambda: 5) # 启用

PEP-572 和争议

Walrus 运算符是作为pep-572(Python 扩展提案)的一部分引入的。

任何向公众开放的工具都必须经过发明者Guido Van Rossum 及其选定的代表的批准。因此,关于海象干员有很多争论,其中一些是:

1. 句法变化

开发人员提出了许多“:=”的替代方案,包括表达式名称、名称表达式和{表达式}名称。很少有建议使用现有关键字,但有些建议使用新的运算符。

2. 向后兼容性

此功能不向后兼容,并且不适用于以前的Python 版本。

3. 操作者名称

人们推荐诸如“赋值运算符”、“命名表达式运算符”和“成为运算符”之类的名称,而不是诸如海象运算符之类的技术术语,这些术语可能会令人困惑。

关于海象运算符的讨论

这是海象运算符的详细介绍。此外,Python 3.8 还有其他新功能——

仅位置参数这是一种新的函数参数语法,用于指示特定函数参数必须采用仅位置参数而不是关键字参数的形式。此符号语法与使用Larry Hastings 的Argument Clinic 工具标记的C 函数相同,如帮助中所示。

在以下示例中,参数a 和b 仅是位置参数,c 或d 可以是位置参数或关键字参数,e 或f 必须是关键字参数:

def f(a, b, /, c, d, *, e, f):

打印(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 代码编写的现有函数的行为。另一个用例是在不需要形式参数名称时排除关键字参数。例如,内置len 函数的签名为len(obj, /)。

除此之外,在Python 3.8 中,您可以使用/来指示参数应在仅位置参数之前传递。这极大地缓解了之前的问题,即开发人员无法简单地将参数指定为仅在自定义函数中的位置参数。

def incr(x, /):

返回x + 1

有关仅位置参数的更多信息:https://www.python.org/dev/peps/pep-0570/

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

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

详细信息:https://bugs.python.org/issue33499

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

详细信息:https://bugs.python.org/issue36721

f-strings 支持=说明符,这对于调试很有用。在f-strings 中添加了=说明符。 f 字符串(例如)f'{expr=}' 扩展为文字表达式、等号,然后扩展为计算表达式的表达式。

详细信息:https://bugs.python.org/issue36817

PEP 587:Python 初始化配置PEP 587 添加了一个新的C API,用于配置Python 初始化,提供对配置的更好控制并改进了错误报告。

新结构:

pyconfig

Py预配置

Py状态

Pywide字符串列表

新功能:

PyConfig_Clear

PyConfig_InitIsolatedConfig

PyConfig_InitPythonConfig

PyConfig_读取

PyConfig_SetArgv

PyConfig_SetBytesArgv

PyConfig_SetBytesString

PyConfig_SetString

PyPreConfig_InitIsolatedConfig

PyPreConfig_InitPythonConfig

PyStatus_Error

PyStatus_Exception

PyStatus_退出

PyStatus_IsError

PyStatus_IsExit

PyStatus_NoMemory

PyStatus_Ok

PywideStringList_Append

PywideStringList_插入

Py_BytesMain

Py_ExitStatusException

Py_InitializeFromConfig

Py_预初始化

Py_PreInitializeFromArgs

Py_PreInitializeFromBytesArgs

Py_RunMain

详情:https://www.python.org/dev/peps/pep-0587/

Vectorcall: CPython 快速调用协议将“vectorcall”协议添加到Python/C API。其目标是形式化应用于许多类的现有优化。任何实现可调用对象的扩展类型都可以使用此协议。

详情:https://www.python.org/dev/peps/pep-0590/

带有外部数据缓冲区的pickle协议5 当使用pickle在Python进程之间传输大量数据以充分利用多核或多机处理时,可以减少内存副本以优化传输效率,应用自定义有时非常重要。例如,某些数据的压缩等技术。

Pickle 协议5 引入了对外部缓冲区的支持,以允许符合PEP 3118 的数据与主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

雷锋网人工智能开发者

责任编辑:德勤钢铁网 标签:

热门搜索

相关文章

广告
德勤钢铁网 |市场分析

python怎么升级,python+3.8+究竟要不要升级?用过之后的小哥这样说吗

chanong

|

雷锋网AI开发者笔记:距离Python 3.8稳定版正式发布已经过去了不到半个月的时间。许多Python 常驻用户已将Python 更新到版本3.8。我也有朋友担心代码执行兼容性等问题。尽管存在这些问题,我仍然坚持使用Python 3。

那么,你应该更新到Python 3.8吗?新版本有哪些特性?它对程序员有什么好处?国外Python爱好者已经发现了Python 3.8中许多特殊新特性的例子,我曾发过一篇文章对此进行了详细解释。雷锋网AI开发者在以下文章中整理了其功能细节:我希望这篇文章可以帮助您更好地理解Python 3.8。

Animesh Gaitonde 是一名Python 爱好者。这是我在Python 3.8 —— 中使用Walrus 运算符的经验。

最近,Python 社区发布了该语言的3.8 版本。我是Python 的忠实粉丝,因此我查看了发行说明,有一个特殊的运算符引起了我的注意,称为海象运算符(:=) 或赋值表达式运算符。

这个新的运算符(:=) 允许您为表达式中的变量赋值。该符号类似于海象的眼睛和獠牙(因此得名“海象操作员”)。

海象测试

现在看一下下面的代码片段。

国家/地区=[“印度”、“美国”、“法国”、“德国”]

伊夫伦(国家)

print (\'国家长度为\' + len(国家))

此代码片段调用len 函数两次。有没有办法避免召回来提高可读性?是的,我改进了代码,得到了以下结果:

国家/地区大小=len(国家/地区)

对于国家大小

print (\'国家长度为\' + Country_size)

还有进一步改进的空间吗?我可以避免在单独的行上将值分配给变量“country_size”吗?Python 3.8 中引入的海象运算符会有所帮助,它允许我在if 语句本身中声明该值。您现在可以分配

如果国家大小:=len(国家/地区)

print (\'国家长度为\' + Country_size)

让我们进一步探讨该运算符的功能。

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

让我们看一下下面的例子。

多次调用昂贵的函数

在上面的示例中,通过调用多次运行成本高昂的函数来填充列表。但是,海象运算符允许您将结果保存在变量中,并在后续计算中重用同一变量,从而避免多次调用get_count 函数。下面是使用海象运算符的示例。

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

正如您从上面的示例中看到的,Walrus Operator 通过减少代码行数并使其更易于阅读来简化审阅者的工作。此外,代码行数和代码复杂性之间有更好的平衡。

了解低效率

根据标准创建列表

上面的例子执行了多个操作。首先创建一个空列表,然后迭代ID 列表并检查结果是否有效以填充列表。

您可以使用Walrus 运算符来简化上面的代码并将其全部放在一行中。

用户应避免对Walrus Operator 的误解

分块处理文件

处理大文件时,分块读取文件。每次读取块时,都会检查该值并将其用作while 循环的退出条件,如下所示。

块=文件.read(256)

同时块:

进程(块)

块=文件.read(256)

walurus 运算符允许您读取和分配在while 循环表达式中读取的值。这也避免了在while 循环之外显式声明变量。一个例子如下所示。

而块:=file.read(256) :

进程(块)

与正则表达式匹配

正则表达式匹配是一个两步过程。第一步检查是否存在匹配,第二步提取子组。

与正则表达式匹配

正如您从上面的代码中看到的,如果存在匹配,您将重新计算re.match(info) ,这会根据您的数据减慢您的程序。

上面的代码可以使用walrus 运算符重写如下,以避免重新计算。

正则表达式匹配:=

哪些地方不能使用海象操作员?

1. 给变量赋值

a=5 #有效

:=5 #禁用

空列表=#有效

空列表:=#无效

如上所示,=运算符不能与:=运算符一起使用,并且海象运算符只能用作表达式的一部分。

2. 加减运算

a +=5 #启用

a :+=5 # 无效

3.Lambda函数赋值表达式

(lambda: a:=5) # 无效

lambda: (a :=5) # 有效但无用

(var :=lambda: 5) # 启用

PEP-572 和争议

Walrus 运算符是作为pep-572(Python 扩展提案)的一部分引入的。

任何向公众开放的工具都必须经过发明者Guido Van Rossum 及其选定的代表的批准。因此,关于海象干员有很多争论,其中一些是:

1. 句法变化

开发人员提出了许多“:=”的替代方案,包括表达式名称、名称表达式和{表达式}名称。很少有建议使用现有关键字,但有些建议使用新的运算符。

2. 向后兼容性

此功能不向后兼容,并且不适用于以前的Python 版本。

3. 操作者名称

人们推荐诸如“赋值运算符”、“命名表达式运算符”和“成为运算符”之类的名称,而不是诸如海象运算符之类的技术术语,这些术语可能会令人困惑。

关于海象运算符的讨论

这是海象运算符的详细介绍。此外,Python 3.8 还有其他新功能——

仅位置参数这是一种新的函数参数语法,用于指示特定函数参数必须采用仅位置参数而不是关键字参数的形式。此符号语法与使用Larry Hastings 的Argument Clinic 工具标记的C 函数相同,如帮助中所示。

在以下示例中,参数a 和b 仅是位置参数,c 或d 可以是位置参数或关键字参数,e 或f 必须是关键字参数:

def f(a, b, /, c, d, *, e, f):

打印(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 代码编写的现有函数的行为。另一个用例是在不需要形式参数名称时排除关键字参数。例如,内置len 函数的签名为len(obj, /)。

除此之外,在Python 3.8 中,您可以使用/来指示参数应在仅位置参数之前传递。这极大地缓解了之前的问题,即开发人员无法简单地将参数指定为仅在自定义函数中的位置参数。

def incr(x, /):

返回x + 1

有关仅位置参数的更多信息:https://www.python.org/dev/peps/pep-0570/

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

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

详细信息:https://bugs.python.org/issue33499

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

详细信息:https://bugs.python.org/issue36721

f-strings 支持=说明符,这对于调试很有用。在f-strings 中添加了=说明符。 f 字符串(例如)f'{expr=}' 扩展为文字表达式、等号,然后扩展为计算表达式的表达式。

详细信息:https://bugs.python.org/issue36817

PEP 587:Python 初始化配置PEP 587 添加了一个新的C API,用于配置Python 初始化,提供对配置的更好控制并改进了错误报告。

新结构:

pyconfig

Py预配置

Py状态

Pywide字符串列表

新功能:

PyConfig_Clear

PyConfig_InitIsolatedConfig

PyConfig_InitPythonConfig

PyConfig_读取

PyConfig_SetArgv

PyConfig_SetBytesArgv

PyConfig_SetBytesString

PyConfig_SetString

PyPreConfig_InitIsolatedConfig

PyPreConfig_InitPythonConfig

PyStatus_Error

PyStatus_Exception

PyStatus_退出

PyStatus_IsError

PyStatus_IsExit

PyStatus_NoMemory

PyStatus_Ok

PywideStringList_Append

PywideStringList_插入

Py_BytesMain

Py_ExitStatusException

Py_InitializeFromConfig

Py_预初始化

Py_PreInitializeFromArgs

Py_PreInitializeFromBytesArgs

Py_RunMain

详情:https://www.python.org/dev/peps/pep-0587/

Vectorcall: CPython 快速调用协议将“vectorcall”协议添加到Python/C API。其目标是形式化应用于许多类的现有优化。任何实现可调用对象的扩展类型都可以使用此协议。

详情:https://www.python.org/dev/peps/pep-0590/

带有外部数据缓冲区的pickle协议5 当使用pickle在Python进程之间传输大量数据以充分利用多核或多机处理时,可以减少内存副本以优化传输效率,应用自定义有时非常重要。例如,某些数据的压缩等技术。

Pickle 协议5 引入了对外部缓冲区的支持,以允许符合PEP 3118 的数据与主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

雷锋网人工智能开发者


市场分析