Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》

Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》

来自TIOBE的最新10月份统计数据显示,Python首次超越Java、JavaScript、C语言等,成为最受欢迎的编程语言。TIOBE过去20年一直在追踪编程语言的受欢迎程度,其数据来自于对25个搜索引擎和网站的检索结果,包括但不限于谷歌、必应、*、雅虎、油管等。Python最近的份额占比是11.27%,C语言是11.16%,Java以10.4排第三;TOP10中还有C++、C#、Visual Basic、JavaScript、SQL、PHP和Assembly。

Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》

2021年10月04日,Python官方发布了最新稳定版本3.10.0 ,它包含许多新的特性和优化。从今天发布的中文版《What’s New in Python(2021.10.15)》摘抄了部分重点如下:

1 摘要 -- 发布重点

新的语法特性:

• PEP 634, 结构化模式匹配: 规范说明
• PEP 635, 结构化模式匹配: 动机与理由
• PEP 636, 结构化模式匹配: 教程
• bpo-12782,加圆括号的上下文管理器现在正式被允许使用。

标准库中的新特性:

• PEP 618,向 zip 添加可选的长度检查。

解释器的改进:

• PEP 626,在调试和其他工具中使用精确的行号。

新的类型标注特性:

• PEP 604,允许 X | Y 形式的联合类型写法
• PEP 613,显式类型别名
• PEP 612,形参规格变量

重要的弃用、移除或限制:

• PEP 644,要求 OpenSSL 1.1.1 或更新的版本
• PEP 632,弃用 distutils 模块。
• PEP 623,弃用并准备移除 PyUnicodeObject 中的 wstr 成员。
• PEP 624,移除 Py_UNICODE 编码器 API
• PEP 597,增加可选的 EncodingWarning

2 新的特性

2.1 带圆括号的上下文管理器

现在已支持使用外层圆括号来使多个上下文管理器可以连续多行地书写。这允许将过长的上下文管理器集能够以与之前 import 语句类似的方式格式化为多行的形式。

2.2 更清楚的错误消息

SyntaxError
IndentationError
AttributeError
NameError

2.3 PEP 626:在调试和其他工具中使用精确的行号

PEP 626 带来了更精确可靠的行号用于调试、性能分析和测试工具。所有被执行的代码行都会并且只有被执行的代码行才会生成带有正确行号的追踪事件。
帧对象的 f_lineno 属性将总是包含预期的行号。
代码对象的 co_lnotab 属性已被弃用并将在 3.12 中被移除。需要从偏移量转换为行号的代码应改用新的 co_lines() 方法。

2.4 PEP 634:结构化模式匹配

增加了采用模式加上相应动作的 match 语句和 case 语句的形式的结构化模式匹配。模式由序列、映射、基本数据类型以及类实例构成。模式匹配使得程序能够从复杂的数据类型中提取信息、根据数据结构实现分支,并基于不同的数据形式应用特定的动作。

match 语句接受一个表达式并将其值与以一个或多个 case 语句块形式给出的一系列模式进行比较。具体来说,模式匹配的操作如下:
1. 使用具有特定类型和形状的数据 (subject)
2. 针对 subject 在 match 语句中求值
3. 从上到下对 subject 与 case 语句中的每个模式进行比较直到确认匹配到一个模式。
4. 执行与被确认匹配的模式相关联的动作。
5. 如果没有确认到一个完全的匹配,则如果提供了使用通配符 _ 的最后一个 case 语句,则它将被用作已匹配模式。如果没有确认到一个完全的匹配并且不存在使用通配符的 case 语句,则整个 match 代码块不执行任何操作。

2.5 可选的 EncodingWarning 和 encoding="locale" 选项

TextIOWrapper 和 open() 的默认编码格式取决于具体的平台和语言区域设置。由于 UTF-8 被用于大多数 Unix 平台,当打开 UTF-8 文件 (例如 JSON, YAML, TOML, Markdown) 时省略 encoding 选项是一个非常常见的错误。

3 有关类型提示的新增特性

3.1 PEP 604: 新的类型联合运算符

引入了启用 X | Y 语法的类型联合运算符。这提供了一种表示’ 类型 X 或类型 Y’ 的相比使用 typing.  Union 更清晰的方式,特别是在类型提示中。

3.2 PEP 612: 形参规格变量

在 typing 模块中新增了两个选项以改进用于 PEP 484 的 Callable 提供给静态类型检查器的信息。第一个选项是形参规格变量。它们被用来将一个可调用对象的形参类型转发给另一个可调用对象——这种模式常见于高阶函数和装饰器。使用示例可在 typing.ParamSpec 中找到。在之前版本中,没有一种简单办法能以如此精确的方式对形参类型的依赖性进行类型标注。
第二个选项是新的 Concatenate 运算符。它与形参规格变量一起使用以便对增加或移除了其他可调用对象的高阶可调用对象进行类型标注。使用示例可以在 typing.Concatenate 中找到。

3.3 PEP 613: 类型别名

PEP 484 引入了类型别名的概念,只要求它们是不带标注的最高层级赋值。这种简单性有时会使得类型检查器难以区分类型别名和普通赋值,特别是当涉及到前向引用或无效类型的时候。

3.4 PEP 647: 用户自定义的类型保护器

TypeGuard 已被添加到 typing 模块用来标注类型保护器函数并改进在类型细化期间提供给静态类型分析器的信息。


4 其他语言特性修改

• int 类型新增了一个方法 int.bit_count(),返回给定整数的二进制展开中值为一的位数,或
称“比特计量”。(由 Niklas Fiekas 在 bpo-29882 中贡献。)
• 现在 dict.keys(), dict.values() 和 dict.items() 所返回的视图都有一个 mapping 属性,
它给出包装了原始字典的 types.MappingProxyType 对象。(由 Dennis Sweeney 在 bpo-40890 中
贡献。)
• PEP 618: 现在 zip() 函数有一个可选的 strict 旗标,用于要求所有可迭代对象的长度都相等。
• 接受整数参数的内置和扩展函数不再接受 Decimal, Fraction 以及其他可被转换为整数但会丢
失精度(即具有 __int__() 方法但没有 __index__() 方法)的对象。(由 Serhiy Storchaka 在
bpo-37999 中贡献。)
• 如果 object.__ipow__() 返回 NotImplemented,该运算符将正确地按照预期回退至
object.__pow__() 和 object.__rpow__()。(由 Alex Shkop 在 bpo-38302 中贡献。)
• 现在赋值表达式可以不带圆括号地在集合字面值和集合推导式中使用,也可以在序列索引号中使
用(但不能用于切片)。
• 函数具有一个新的 __builtins__ 属性,当函数被执行时它会被用于查找内置符号,而不是在
__globals__['__builtins__'] 中查找。如果 __globals__["__builtins__"] 存在则该
属性将基于它来初始化,否则将基于当前的内置函数。(由 Mark Shannon 在 bpo-42990 中贡献。)
• 增加了两个新的内置函数——aiter() 和 anext() 以分别提供与 iter() 和 next() 对应的异
步版本。(由 Joshua Bronson, Daniel Pope 和 Justin Wang 在 bpo-31861 中贡献。)
13• 静态方法 (@staticmethod) 和类方法 (@classmethod) 现在会继承方法属性 (__module__,
__name__, __qualname__, __doc__, __annotations__) 并具有一个新的 __wrapped__ 属
性。此外,静态方法现在还是与常规函数一样的可调用对象。(由 Victor Stinner 在 bpo-43682 中贡
献。)
• 复杂目标的注解(PEP 526 定义的除 simple name 之外的一切复杂目标)在运行时不再受 from
__future__ import annotations 的影响。(由 Batuhan Taskaya 在 bpo-42737 中贡献)。
• 类和模块对象现在可以按需创建空的注解字典。为保证向下兼容,这些注解数据将存储于对象的
__dict__ 中。这改进了 __annotations__ 的最佳用法;更多信息请参阅 annotations-howto 。(由
Larry Hastings 在 bpo-43901 中贡献)
• 由于会产生副作用,现在 from __future__ import annotations 时禁止使用包含 yield 、
yield from 、 await 或已命名表达式的注解。(由 Batuhan Taskaya 在 bpo-42725 中贡献)
• 未绑定变量、 super() 和其他可能改变符号表处理的表达式,现在在 from __future__ import
annotations 时不能用作注解。(由 Batuhan Taskaya 在 bpo-42725 中贡献)
• float 类型和 decimal.Decimal 类型的 NaN 值的哈希值现在取决于对象身份。以前,即便 NaN
值彼此不等,也都是哈希为 0。在创建包含多个 NaN 的字典和集合时,由于哈希冲突过度,导致
了运行代价可能会二次方增长。(由 Raymond Hettinger 在 bpo-43475 中贡献)
• A SyntaxError (instead of a NameError) will be raised when deleting the __debug__ constant. (Contributed by Dong-hee Na in bpo-45000.)
• SyntaxError exceptions now have end_lineno and end_offset attributes. They will be None if
not determined. (Contributed by Pablo Galindo in bpo-43914.)

5 新增模块

• 无。

6 改进的模块

6.1 asyncio
6.2 argparse
6.3 array
6.4 asynchat、 asyncore 和 smtpd
6.5 base64
6.6 bdb
6.7 bisect
6.8 codecs
6.9 collections.abc
6.10 contextlib
6.11 curses
6.12 dataclasses
6.13 distutils
6.14 doctest
6.15 encodings
6.16 fileinput
6.17 faulthandler
6.18 gc
6.19 glob
6.20 hashlib
6.21 hmac
6.22 IDLE 与 idlelib
6.23 importlib.metadata
6.24 inspect
6.25 linecache
6.26 os
6.27 os.path
6.28 pathlib
6.29 platform
6.30 pprint
6.31 py_compile
6.32 pyclbr
6.33 shelve
6.34 statistics
6.35 site
6.36 socket
6.37 ssl
6.38 sqlite3
6.39 sys
6.40 _thread
6.41 threading
6.42 traceback
6.43 types
6.44 typing
6.45 unittest
6.46 urllib.parse
6.47 xml
6.48 zipimport

7 性能优化

• 现在,构造函数 str() 、 bytes() 和 bytearray() 速度更快了(小对象大约提速 30-40%)。(由Serhiy Storchaka 贡献于 bpo-41334 )
• 现在, runpy 导入的模块变少了。 python3 -m module-name 命令的启动时间平均加快 1.4 倍。
在 Linux 上, Python 3.9 的 python3 -I -m module-name 导入了 69 个模块,而 Python 3.10 只导入了 51 个模块(少了 18 个)。(由 Victor Stinner 贡献于 bpo-41006 和 bpo-41718)
• 现在, LOAD_ATTR 指令会使用新的“单独操作码缓存”机制。对于常规属性大约会提速 36%,而对于槽位属性会加快 44%。(由 Pablo Galindo 和 Yury Selivanov 贡献于 bpo-42093 ),并由 Guido van
Rossum 贡献于 bpo-42927,基于最初在 PyPy 和 MicroPython 中实现的思路。)
• 现 在, 当 用 --enable-optimizations 构 建 Python 时, 会 在 编 译 和 链 接 命 令 行 中 添
加 -fno-semantic-interposition。 这 会 让 用 带 参 数 --enable-shared 的 gcc 构 建
Python 解释器时提速 30%。详情请参阅 ‘这篇文章https://developers.redhat.com/blog/2020/06/25/
red-hat-enterprise-linux-8-2-brings-faster-python-3-8-run-speeds/>‘_ 。(由 Victor Stinner 和 Pablo Galindo贡献于 bpo-38980 )
• bz2 / lzma / zlib 模 块 用 了 新 的 输 出 缓 冲 区 管 理 代 码, 并 在 _compression.
DecompressReader 类中添加 “.readall()“ 函数。现在, bz2 解压过程提速了 1.09 倍 ~ 1.17 倍,lzma 解压快乐 1.20 倍 ~ 1.32 倍, GzipFile.read(-1) 快了 1.11 倍 ~ 1.18 倍。(由 Ma Lin 贡献,由 Gregory P. Smith 审查, bpo-41486)
• 在使用字符串式的注解时,函数的注解字典不再是在函数创建时建立了。取而代之的是,注解被存储为一个字符串元组,而函数对象在需要时再延迟转换为注解字典。这一优化将定义带注解函数的CPU 时间减少了一半。(由 Yurii Karabas 和 Inada Naoki 贡献于 bpo-42202)
• 现在,子串搜索函数,如 str1 in str2 和 str2.find(str1) ,有时会采用 Crochemore & Perrin
的“二路归并”字符串搜索算法,以避免长字符串的二次检索行为。(由 Dennis Sweeney 贡献于bpo-41972 )
• 为 _PyType_Lookup() 加入了少许优化,以提高类型属性缓存查询在常见命中情况下的性能。这使得解释器的平均速度提高了 1.04 倍。(由 Dino Viehland 贡献于 bpo-43452 )
• 现在,以下内置函数支持更快的 PEP 590 vectorcall 调用约定: map() 、 filter() 、 reversed() 、bool() 和 float() 。(由 Dong-hee Na 和 Jeroen Demeyer 贡献于 bpo-43575 、 bpo-43287 、 bpo-41922、 bpo-41873 和 bpo-41870 )
• 通过移除内部的 RLock , BZ2File 的性能得以改善。这使得 BZ2File 在面对多个同时读写线程时变得不再安全,类似一直如此的 gzip 和 lzma 中的对应类。(由 Inada Naoki 贡献于 bpo-43785 )

一起发布的内容还有弃用、移除、移植、字节码、编译、API等方面的内容,略。
 

Python 3.10.0 官方下载地址

Version Operating System File Size
Gzipped source tarball Source release 25007016
XZ compressed source tarball Source release 18726176
macOS 64-bit universal2 installer

macOS

for macOS 10.9 and later

39741684
Windows embeddable package (32-bit) Windows 7521592
Windows embeddable package (64-bit) Windows 8474319
Windows help file Windows 9559706
Windows installer (32-bit) Windows 27194856
Windows installer (64-bit) Windows 28315928

注:Python从3.9+开始已不支持 Windows7及更早版本。 

Python 3.10.0 安装和运行

Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》

Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》

以下是我的尝鲜操作演练:

IDLE窗口的操作提示符移动编辑框外

与3.8.8版本相比,语句的缩进对齐一目了然

Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》

终于引进了:分支结构语句

不是switch-case, select-case等,而是 match-case

def fib(n):
    match n:
        case 1|2:
            return 1
        case other:
            return fib(n-1)+fib(n-2)

        
for i in range(1,11):
    print(fib(i))

    
1
1
2
3
5
8
13
21
34
55

其中"case other:" 里的other并非关键字,但可能就是相当于其他编程语言中的 case else 或 otherwise 或 default 等等,它可以任意写但效果相同,如下:

def fib(n):
    match n:
        case 1|2:
            return 1
        case anything:
            return fib(n-1)+fib(n-2)

        
fib(5)
5
fib(10)
55

注:官方举例使用开线:“ case _ :
 

一个奇怪的小发现

怎么会有赋值功能?

i = 5
match i:
    case 1: print(1)
    case 2: print(2)
    case i: print(i**2)

    
25
match i:
    case 1: print(1)
    case 2: print(2)
    case n: print(i**2)

    
25
match i:
    case 1: print(1)
    case 2: print(2)
    case n: print(n**2)

    
25
match i:
    case 1: print(1)
    case 2: print(2)
    case i: print(n**2)

    
25
match i:
    case 1: print(1)
    case 2: print(2)
    case a: print(i**2)

    
25
match i:
    case 1: print(1)
    case 2: print(2)
    case i: print(a**2)

    
25

a
5
b
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    b
NameError: name 'b' is not defined
match i:
    case 1: print(1)
    case 2: print(2)
    case b: print(i**2)

    
25
b
5

另一个小发现

这算不算bug,还是疏忽了没更新?新版本中关键字 match case 已加亮标注,黄色加亮已是关键字的待遇,但是内置库keyword中的kwlist列表还没有添加进去。

Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》

帮助文档也还没有match和case的内容 

help('if')
The "if" statement
******************

The "if" statement is used for conditional execution:

   if_stmt ::= "if" assignment_expression ":" suite
               ("elif" assignment_expression ":" suite)*
               ["else" ":" suite]

It selects exactly one of the suites by evaluating the expressions one
by one until one is found to be true (see section Boolean operations
for the definition of true and false); then that suite is executed
(and no other part of the "if" statement is executed or evaluated).
If all expressions are false, the suite of the "else" clause, if
present, is executed.

Related help topics: TRUTHVALUE

help('return')
The "return" statement
**********************

   return_stmt ::= "return" [expression_list]

"return" may only occur syntactically nested in a function definition,
not within a nested class definition.

If an expression list is present, it is evaluated, else "None" is
substituted.

"return" leaves the current function call with the expression list (or
"None") as return value.

When "return" passes control out of a "try" statement with a "finally"
clause, that "finally" clause is executed before really leaving the
function.

In a generator function, the "return" statement indicates that the
generator is done and will cause "StopIteration" to be raised. The
returned value (if any) is used as an argument to construct
"StopIteration" and becomes the "StopIteration.value" attribute.

In an asynchronous generator function, an empty "return" statement
indicates that the asynchronous generator is done and will cause
"StopAsyncIteration" to be raised.  A non-empty "return" statement is
a syntax error in an asynchronous generator function.

Related help topics: FUNCTIONS

help('match')
No Python documentation found for 'match'.
Use help() to get the interactive help utility.
Use help(str) for help on the str class.

help('case')
No Python documentation found for 'case'.
Use help() to get the interactive help utility.
Use help(str) for help on the str class.

一起学习 PYTHON 的交流Q码地址: http://qr01.cn/FHYKEa

Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》

上一篇:UML快速概述 - All you need to know about UML


下一篇:terminate called after throwing an instance of 'std::length_error' what(): basic_string