Python各个版本特性

1.2 Python版本特性

Python版本特性

1.2.1 Python3.5

PEP 492, 使用 async 和 await 语法实现协程。
PEP 465, 新的矩阵乘法运算符: a @ b。
PEP 448, 解包。
PEP 484,类型提示

1.2.1.1 PEP 448,解包

参照之前的Python基础教程中:解包(拆包)、装包章节。

1.2.1.2 PEP 484,类型提示

Python3.5首次新增了一个typing模块,用来对函数的形参及函数的返回类型标注。

def greeting(name: str) -> str:
    return 'Hello ' + name

在函数 greeting 中,参数 name 预期是 str 类型,并且返回 str 类型。
类型提示将在后续章节中重点介绍。

1.2.2 Python3.6

PEP 498, 格式化的字符串文字
PEP 515, 数字文字中的下划线。
PEP 526, 变量注释的语法。
PEP 525, 异步生成器。
PEP 530, 异步推导。

1.2.2.1 PEP 498,格式化的字符串文字:f-string

参照之前的Python基础教程中:f-string章节。

1.2.2.2 PEP 515,数字文字中的下划线

通过在数字中间添加_提高可读性。
>>> 1_000_000_000_000_000

1000000000000000

>>> 0x_FF_FF_FF_FF

4294967295

_只能插入数字中间,并且不能连续插入多个_,否则会报SyntaxError错:
>>> 100__000

Traceback (most recent call last):
File “C:\Program Files\Python3102\lib\code.py”, line 63, in runsource
code = self.compile(source, filename, symbol)
File “C:\Program Files\Python3102\lib\codeop.py”, line 185, in call
return _maybe_compile(self.compiler, source, filename, symbol)
File “C:\Program Files\Python3102\lib\codeop.py”, line 102, in _maybe_compile
raise err1
File “C:\Program Files\Python3102\lib\codeop.py”, line 91, in _maybe_compile
code1 = compiler(source + “\n”, filename, symbol)
File “C:\Program Files\Python3102\lib\codeop.py”, line 150, in call
codeob = compile(source, filename, symbol, self.flags, True)
File “”, line 1
100__000
^
SyntaxError: invalid decimal literal

1.2.2.3 PEP 526,变量注释

PEP 484 引入了函数形参类型标注即类型提示的标准。这个 PEP 为 Python 添加了标注变量类型的语法,包括类变量和实例变量:

from typing import List, Dict

primes: List[int] = []
captain: str  # Note: no initial value!
class Starship:
    stats: Dict[str, int] = {}

1.2.3 Python3.7

PEP 563,类型标注延迟求值。

1.2.4 Python3.8

PEP 572,赋值表达式。
PEP 570,仅限位置形参
f-string支持=

1.2.4.1 PEP 572,赋值表达式

赋值表达式:=可在表达式内部为变量赋值。它被昵称为“海象运算符”因为它很像是 海象的眼睛和长牙。
在这个示例中,赋值表达式可以避免调用 len() 两次:

if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")

类似的益处还可出现在正则表达式匹配中需要使用两次匹配对象的情况中,一次检测用于匹配是否发生,另一次用于提取子分组:

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0

此运算符也适用于配合 while 循环计算一个值来检测循环是否终止,而同一个值又在循环体中再次被使用的情况:

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)

另一个值得介绍的用例出现于列表推导式中,在筛选条件中计算一个值,而同一个值又在表达式中需要被使用:

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]

请尽量将海象运算符的使用限制在清晰的场合中,以降低复杂性并提升可读性。

1.2.4.2 PEP 570,仅限位置形参

参照之前的Python基础教程中:仅位置参数、仅关键字参数章节。

1.2.4.3 f-string支持=

增加=说明符用于f-string。 形式为 f’{expr=}’ 的 f-字符串将扩展表示为表达式文本,加一个等于号,再加表达式的求值结果。 例如:
>>> from datetime import date
>>> user = ‘eric_idle’
>>> member_since = date(1975, 7, 31)
>>> f’{user=} {member_since=}’

“user=‘eric_idle’ member_since=datetime.date(1975, 7, 31)”

通常的 f-字符串格式说明符允许更细致地控制所要显示的表达式结果:
>>> delta = date.today() - member_since
>>> f’{user=!s} {delta.days=:,d}’

‘user=eric_idle delta.days=16,075’

=说明符将输出整个表达式,以便详细演示计算过程:
>>> print(f’{theta=} {cos(radians(theta))=:.3f}')

theta=30 cos(radians(theta))=0.866

1.2.5 Python3.9

PEP 584,为 dict 增加合并运算符;
PEP 585,标准多项集中的类型标注泛型。
PEP 614,放宽对装饰器的语法限制。
PEP 616,移除前缀和后缀的字符串方法。

1.2.5.1 PEP 584,字典合并与更新运算符

合并 (|) 与更新 (|=) 运算符已被加入内置的 dict 类。它们为现有的 dict.update 和 {**d1, **d2} 字典合并方法提供了补充。
>>> x = {“key1”: “value1 from x”, “key2”: “value2 from x”}
>>> y = {“key2”: “value2 from y”, “key3”: “value3 from y”}
>>> x | y

{‘key1’: ‘value1 from x’, ‘key2’: ‘value2 from y’, ‘key3’: ‘value3 from y’}

>>> y | x

{‘key2’: ‘value2 from x’, ‘key3’: ‘value3 from y’, ‘key1’: ‘value1 from x’}

>>> x |= y
>>> x

{‘key1’: ‘value1 from x’, ‘key2’: ‘value2 from y’, ‘key3’: ‘value3 from y’}

1.2.5.2 PEP 616,移除前缀和后缀的字符串方法

str.removeprefix(prefix) 和 str.removesuffix(suffix) 用于方便地从字符串移除不需要的前缀或后缀。

s1 = 'abc.efg.apk'
print(s1.removeprefix('abc'))
print(s1.removesuffix('apk'))

.efg.apk
abc.efg.

1.2.6 Python3.10

PEP 604,允许 X | Y 形式的联合类型写法
PEP 612,形参规格变量
PEP 613,显式类型别名
PEP 626,在调试和其他工具中使用精确的行号。
PEP 634, 结构化模式匹配: 规范说明
PEP 635, 结构化模式匹配: 动机与理由
PEP 636, 结构化模式匹配: 教程
PEP 647, User-Defined Type Guards
bpo-12782,加圆括号的上下文管理器现在正式被允许使用。

1.2.6.1 带括号的上下文管理器

关于上下文管理器将在后续章节介绍。

1.2.6.2 更清楚的错误消息

1.2.6.2.1 SyntaxError

现在当解析包含有未关闭括号的代码时解释器会包括未关闭括号的位置而不是显示:
SyntaxError: unexpected EOF while parsing
并指向某个不正确的位置。例如,考虑以下代码(注意未关闭的 “ { ”):

expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
            38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()

之前版本的解释器会报告令人迷惑的语法错误位置:

File “example.py”, line 3
some_other_code = foo()
^
SyntaxError: invalid syntax

但在 Python 3.10 中则会发出信息量更多的错误提示:

File “example.py”, line 1
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
^
SyntaxError: ‘{’ was never closed

类似地,涉及未关闭字符串字面值 (单重引号和三重引号) 的错误现在会指向字符串的开头而不是报告 EOF/EOL。
这些改进的灵感来自 PyPy 解释器之前所进行的工作。
解释器所引发的 SyntaxError 异常现在将高亮构成语法错误本身的完整异常错误内容,而不是仅提示检测到问题的位置。 这样,不再(同 Python 3.10 之前那样)仅显示:
>>> foo(x, z for z in range(10), t, w)

File “”, line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized

现在 Python 3.10 将这样显示异常:
>>> foo(x, z for z in range(10), t, w)

File “”, line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized

大量新增的专门化 SyntaxError 异常消息已被添加。 其中最主要的一些如下所示:
在代码块之前缺失“:”
>>> if rocket.position > event_horizon

File “”, line 1
if rocket.position > event_horizon
^
SyntaxError: expected ‘:’

在推导式的目标中有不带圆括号的元组:
>>> {x,y for x,y in zip(‘abcd’, ‘1234’)}

File “”, line 1
{x,y for x,y in zip(‘abcd’, ‘1234’)}
^
SyntaxError: did you forget parentheses around the comprehension target?

在多项集字面值中和表达式之间缺失逗号:
>>> items = {
… x: 1,
… y: 2
… z: 3,

File “”, line 3
y: 2
^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

多个异常类型不带圆括号:
>>> try:
… build_dyson_sphere()
… except NotEnoughScienceError, NotEnoughResourcesError:

File “”, line 3
except NotEnoughScienceError, NotEnoughResourcesError:
^
SyntaxError: multiple exception types must be parenthesized

字典字面值中缺失“:”和值:
>>>
>>> values = {
… x: 1,
… y: 2,
… z:
… }

File “”, line 4
z:
^
SyntaxError: expression expected after dictionary key and ‘:’

>>> values = {x:1, y:2, z w:3}

File “”, line 1
values = {x:1, y:2, z w:3}
^
SyntaxError: ‘:’ expected after dictionary key

try 代码块不带 except 或 finally 代码块:
>>> try:
… x = 2
… something = 3

File “”, line 3
something = 3
^^^^^^^^^
SyntaxError: expected ‘except’ or ‘finally’ block

在比较中使用 = 而不是 ==:
>>> if rocket.position = event_horizon:

File “”, line 1
if rocket.position = event_horizon:
^
SyntaxError: cannot assign to attribute here. Maybe you meant ‘==’ instead of ‘=’?

在 f-字符串中使用 *:
>>> f"Black holes {*all_black_holes} and revelations"

File “”, line 1
(*all_black_holes)
^
SyntaxError: f-string: cannot use starred expression here

1.2.6.2.2 IndentationError

许多 IndentationError 异常现在具有更多上下文来提示是何种代码块需要缩进,包括语句的位置:
>>> def foo():
… if lel:
… x = 2

File “”, line 3
x = 2
^
IndentationError: expected an indented block after ‘if’ statement in line 2

1.2.6.2.3 AttributeError

当打印 AttributeError 时,PyErr_Display() 将提供引发异常的对象中类似属性名称的建议:
>>> collections.namedtoplo

Traceback (most recent call last):
File “”, line 1, in
AttributeError: module ‘collections’ has no attribute ‘namedtoplo’. Did you mean: namedtuple?

警告 请注意如果未调用 PyErr_Display() 来显示错误则此特性将没有效果,这可能发生在使用了某些其他自定义错误显示函数的时候。 这在某些 REPL 例如 IPython 上是一种常见的情况。

1.2.6.2.4 NameError

当打印解释器所引发的 NameError 时,PyErr_Display() 将提供引发异常的函数中类似变量名称的建议:
>>> schwarzschild_black_hole = None
>>> schwarschild_black_hole

Traceback (most recent call last):
File “”, line 1, in
NameError: name ‘schwarschild_black_hole’ is not defined. Did you mean: schwarzschild_black_hole?

警告 请注意如果未调用 PyErr_Display() 来显示错误则此特性将没有效果,这可能发生在使用了某些其他自定义错误显示函数的时候。 这在某些 REPL 例如 IPython 中是一种常见的情况。

1.2.6.3 结构化模式匹配(match语句)

参照之前的Python基础教程中:match语句 章节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/8107.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构和算法(一):复杂度、数组、链表、栈、队列

从广义上来讲&#xff1a;数据结构就是一组数据的存储结构 &#xff0c; 算法就是操作数据的方法 数据结构是为算法服务的&#xff0c;算法是要作用在特定的数据结构上的。 10个最常用的数据结构&#xff1a;数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树 10…

办公协作效率想提质增效,可借助开源大数据工具!

在信息爆炸式发展的今天&#xff0c;提升办公协作效率&#xff0c;让各部门的信息有效互通起来&#xff0c;做好数据管理&#xff0c;已经成为众企业提升竞争力的方式方法。那么&#xff0c;如果想要提升办公效率&#xff0c;就需要了解开源大数据工具了。在数字化发展进程中&a…

《扬帆优配》西藏地震!美史上最严排放新规将出台,美股收涨

当地时间周四&#xff0c;美股遍及收高&#xff0c;科技股领涨。因耶稣受难日&#xff0c;美股4月7日&#xff08;周五&#xff09;休市&#xff0c;周四为美股本周最终一个买卖日&#xff0c;从本周状况来看&#xff0c;纳指与标普500指数均录得跌幅&#xff0c;别离跌1.1%和0…

回归预测 | MATLAB实现PSO-RF粒子群算法优化随机森林多输入单输出回归预测

回归预测 | MATLAB实现PSO-RF粒子群算法优化随机森林多输入单输出回归预测 目录回归预测 | MATLAB实现PSO-RF粒子群算法优化随机森林多输入单输出回归预测效果一览基本介绍程序设计参考资料效果一览 基本介绍 MATLAB实现PSO-RF粒子群算法优化随机森林多输入单输出回归预测 粒子…

第十四届蓝桥杯题解

声明&#xff1a;以下都无法确定代码的正确性&#xff0c;是赛时代码&#xff0c;希望大家见谅&#xff01;思路可以参考&#xff0c;等后续可以评测之后再去修改博客内错误&#xff0c;也希望大家能够指正错误&#xff01; 试题A&#xff1a;日期统计 分析&#xff1a;这道题…

45-Dockerfile-ARG/ENV指令

AGR/ENV指令前言ARG作用格式说明生效范围使用示例ENV作用格式说明使用环境变量使用示例ARG 和 ENV 的区别前言 本篇来学习下Dockerfile中的AGR/ENV指令 ARG 作用 定义一个可以在构建镜像时使用的变量 格式 ARG <name>[<default value>]说明 在执行 docker b…

【数据结构】AVL树

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《数据结构与算法》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; AVL树&#x1f332;AVL树&#x1f334;AVL树的插入&#x1f334;AVL树的旋转左单旋右单旋左…

Springboot基础学习之(十三):通过代码实现对数据库的增删该查操作(数据库:mysql)

Springboot这个系列实现的案例&#xff1a;员工后台管理系统 之前讲解的内容是前后端的交互&#xff0c;并没有涉及到数据库。把员工信息放置在一个数组中&#xff0c;实现的方法则是对数组的增删改查操作&#xff0c;但是从今天开始&#xff0c;实现的功能则是在数据库的基础上…

看完这篇 教你玩转渗透测试靶机vulnhub——My File Server: 2

Vulnhub靶机My File Server: 2渗透测试详解Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;FTP匿名登入③&#xff1a;SSH私钥登入④&#xff1a;SMB共享…

Mysql一条多表关联SQL把CPU打爆了,如何优化

今天是清明假期的第三天&#xff0c;收到同事的求助&#xff0c;DB的CPU被打爆了&#xff01; 查看监控&#xff0c;CPU已经被打爆100% 登录mysql&#xff0c;DB无锁阻塞&#xff0c;元凶是一个异常sql,存在39个并发执行。 SQL的明细如下&#xff1a; select TEMPSALE.USER_ID…

ChatGPT 被大面积封号,到底发生什么了?

意大利数据保护机表示 OpenAI 公司不但非法收集大量意大利用户个人数据&#xff0c;没有设立检查 ChatGPT 用户年龄的机制。 ChatGPT 似乎正在遭遇一场滑铁卢。 3月31日&#xff0c; 大量用户在社交平台吐槽&#xff0c;自己花钱开通的 ChatGPT 账户已经无法登录&#xff0c;更…

港科夜闻|香港科大(广州)熊辉教授获委任为协理副校长(知识转移)

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科大(广州)熊辉教授获委任为协理副校长(知识转移)。在任期间&#xff0c;熊教授将为香港科大知识转移战略发展提供全面领导&#xff0c;鼓励和促进教师、学生和校友之间的知识转移&#xff0c;促进创业发展、技术研究及…

数据仓库、数据集市、数据湖,你的企业更适合哪种数据管理架构?

建设企业级数据平台&#xff0c;首先需要了解企业数据&#xff0c;确认管理需求&#xff0c;并选择一个数据管理架构。那么面对纷繁复杂的数据来源&#xff0c;多元化的数据结构&#xff0c;以及他们的管理使用需求&#xff0c;企业数据平台建设该从何处入手呢&#xff1f;哪个…

机器学习笔记之正则化(二)权重衰减角度(直观现象)

机器学习笔记之正则化——权重衰减角度[直观现象]引言回顾&#xff1a;拉格朗日乘数法角度观察正则化过拟合的原因&#xff1a;模型参数的不确定性正则化约束权重的取值范围L1L_1L1​正则化稀疏权重特征的过程权重衰减角度观察正则化场景构建权重衰减的描述过程权重衰减与过拟合…

ChatGPT常用prompts汇总

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

一个开源人的心酸哭诉

编者按&#xff1a;这篇文章比较长&#xff0c;但值得一读。从这篇文章&#xff0c;你可以看到一些开源开发者的内心活动&#xff0c;看看他们的热情、抱负、无奈、心酸、愤怒、失望和痛斥&#xff1b;看看他们如何指责、讽刺、乞求、羞辱那些使用他们作品而无视他们痛苦的人&a…

Java 泛型 使用案例

参考资料 Java 基础 - 泛型机制详解路人甲-Java泛型专题 目录一. 通用Mapper1.1 实体类1.2 Mapper基类1.3 自定义接口1.4 抽象基类Service1.5 调用二. session和bean的获取一. 通用Mapper 1.1 实体类 ⏹ Accessors(chain true): 允许链式调用 import lombok.Data; import …

Python 进阶指南(编程轻松进阶):五、发现代码异味

原文&#xff1a;http://inventwithpython.com/beyond/chapter5.html 导致程序崩溃的代码显然是错误的&#xff0c;但是崩溃并不是发现程序问题的唯一手段。其他迹象可能表明程序存在更微妙的错误或不可读的代码。就像气体的味道可以指示气体泄漏或者烟雾的味道可以指示火灾一样…

[国产化]arm架构的服务器虚拟机软件---Qemu虚拟机

项目场景&#xff1a; 架构&#xff1a;arm 服务器型号&#xff1a;昆泰r522 操作系统&#xff1a;欧拉22.3arm 问题描述 对应需要有arm架构的虚拟机&#xff0c;vmware没有arm版本。寻找替代品。 之前有人介绍可以用zstack。但是需要改变操作系统。所以就放弃了。选择了&…

Github采用Http Push失败

Github采用Http Push失败 Github的密码凭证从2021年起开始就不能用了&#xff0c;现在采用http去push代码时候提示输入的密码要换成令牌&#xff08;token&#xff09;才可以。 如何在Github上生成自己的令牌呢&#xff1f; &#xff08;1&#xff09;简单来说就是将原来输入…
最新文章