python3.6-3.10新特性一览

admin 2023年1月29日23:43:33评论43 views字数 6038阅读20分7秒阅读模式


Python3x新特性一览

Python3.6

1f格式化字符串

2、数字下划线

3、变量注释

4、异步生成器

5、异步列表推导

6、新模块

7、新特性

(一)首先是第一个f格式化字符串,之前基础篇讲过,我们可以通过f{}来作为格式化字符串的占位符,比如:

python3.6-3.10新特性一览

或者使用占位符描述长度和保留位数,比如:

python3.6-3.10新特性一览

二)然后是数字下划线,数字使用下划线可以方便阅读,不影响原有类型,比如:

python3.6-3.10新特性一览

对于16进制,8进制,二进制也是可以的

python3.6-3.10新特性一览

字符串format方法也支持了“_”的选项,当格式化为浮点数或整数时,以3位分隔,当格式化为二进制,八进制,十六进制时,以4位分隔

python3.6-3.10新特性一览

(三)变量注释没有给变量带来特殊的意义,只是为了方便IDE做类型检查

python3.6-3.10新特性一览

只是起注释作用,实际意义不大

python3.6-3.10新特性一览

(四)异步生成器在Python3.5中,协程函数awaityield不能再同一个函数中使用,但是Python3.6已经取消了这个限制,可以在同一个函数体中使用了

1.await是一个关键字,只能在协程函数中使用,在遇到IO操作时暂停当前协程(任务)。

2、在暂停当前协程(任务)的过程中,事件循环可以执行其他协程(任务),在当前协程的IO处理完成后,可以再次切换执行的代码。


使用方法

await + 可等待对象(协程对象、Future对象、Task对象)


例如:

import asyncio
async def func():
    print("执行协程函数内部代码")
    # 遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。
    # 当前协程挂起时,事件循环可以去执行其他协程(任务)。
    response = await asyncio.sleep(2)
    print("IO请求结束,结果为:", response)
result = func()
asyncio.run(result)

现在生成器和协程函数可以共用了,比如:

python3.6-3.10新特性一览

(五)增加在listsetdict的列表推导和生成表达式中使用async forasync/await python3的新特性,可以进行协程运行。个人将他理解成多线程

使用异步推导式之后,可以简写成

result = [i async for i in liyou() if i % 3]

现在也支持在所有的推导式中使用await表达式

result = [await liyou() for liyou in liyous]

(六)增加了一个新的模块:secrets。该模块用来生成一些安全性更高的随机数,用于管理passwords, account authentication, security tokens, 以及related secrets等数据,因为python(大部分解析器是cpython,底层随机化是随机数,可以通过种子判断出随机规律,使用secrets解决了这个问题,使得安全性得到了提高)。

(七)其他

  • 新的堆内存分配环境变量允许开发者设置内存分配器,以及注册debug钩子等。

  • asyncio模块更加稳定、高效,并且不再是临时模块,其中的API也都是稳定版的了。

  • typing模块也有了一定改进,并且不再是临时模块。

  • datetime.strftime date.strftime 开始支持ISO 8601的时间标识符%G, %u, %V

  • hashlib ssl 模块开始支持OpenSSL1.1.0

  • hashlib模块开始支持新的hash算法,比如BLAKE2, SHA-3 SHAKE

  • Windows上的 filesystem console 默认编码改为UTF-8

  • json模块中的 json.load() json.loads() 函数开始支持 binary 类型输入。

Python3.7

1、内置函数breakpoint()

2、类型和注解

3、新增dataclasses模块

4、生成器异常处理

5、开发模式

6、高精度时间函数

7、新特性

(一)使用breakpoint()可以方便我们使用pdb调试python代码, pdb 提示符下,我们可以调用 locals() 来查看当前的本地作用域的所有变量,找到问题所在地方。

(二)类型和注解,和变量注释差不多,方便描述,比如:

python3.6-3.10新特性一览

(三)引入了一个新的模块dataclasses,该模块主要提供了一种数据类的实现方式。

优点是:

1. 无需定义__init__,然后将值赋给selfdataclass负责处理它

2. 我们以更加易读的方式预先定义了成员属性,以及类型提示。我们现在立即能知道numberint类型。这无疑比一般定义类成员的方式更具可读性。

比如:

python3.6-3.10新特性一览

在数据类被定义后,会根据给出的类型注解生成一个如下的初始函数:

python3.6-3.10新特性一览

是不是很方便,节约了大量时间了

(四)生成器引发StopIteration异常后,StopIteration异常转换RuntimeError异常,它不会影响应用程序的堆栈框架。

(五)Python解释器命令行添加了开发者模式,参数是-X,他激活的内容有asyncio的调试模式。为异步操作提供更详细的日志记录和异常处理。以及面向内存分配器的调试hook。这对于编写CPython扩展件的那些人很有用。它能够实现更明确的运行时检查,了解CPython如何在内部分配内存和释放内存。启用faulthandler模块,那样发生崩溃后,traceback始终转储出去。

(六)新的时间函数使用后缀_ns。比如,time.process_time()的纳秒版本是time.process_time_ns()

(七)其他

  • 字典现在保持插入顺序。这在 3.6 中是非正式的,但现在成为了官方语言规范。在大多数情况下,普通的 dict 能够替换 collections.OrderedDict

  • .pyc 文件具有确定性,支持可重复构建 —— 也就是说,总是为相同的输入文件生成相同的 byte-for-byte 输出。

  • 新增contextvars模块,针对异步任务提供上下文变量。

  • __main__中的代码会显示弃用警告(DeprecationWarning)。

  • 新增UTF-8模式。在Linux/Unix系统,将忽略系统的locale,使用UTF-8作为默认编码。在非Linux/Unix系统,需要使用-X utf8选项启用UTF-8模式。

  • 允许模块定义__getattr____dir__函数,为弃用警告、延迟import子模块等提供便利。

  • 新的线程本地存储C语言API

  • 更新Unicode数据到11.0

Python3.8

1、海象赋值表达式

2、仅限位置形参

3f格式化字符串支持 =

4 typing模块的改进

5、多进程共享内存

6、 新版本的pickle协议

7、     性能改进

(一)新的语法:= (有点碰瓷go语言,哈哈,不过用法不太一样)他会先进行赋值,然后再进行比较,这样比较方便,避免了两次循环了,比如:

python3.6-3.10新特性一览

(二)新增一个函数形参语法/ 用来指明某些函数形参必须使用仅限位置而非关键字参数的形式,比如:

python3.6-3.10新特性一览

(三)f的格式化字符串可以使用等号=,比如:

python3.6-3.10新特性一览

(四)Python 3.8typing添加了一些新元素,因此它能够支持更健壮的检查:

1final修饰器和Final类型标注表明,被修饰或被标注的对象在任何时候都不应该被重写、继承,也不能被重新赋值。

2Literal类型将表达式限定为特定的值或值的列表。

3TypedDict可以用来创建字典,其特定键的值被限制在一个或多个类型上。注意这些限制仅用于编译时确定值的合法性,而不能在运行时进行限制。

(五)multiprocessing模块新增SharedMemory类,可以在不同的Python进城之间创建共享的内存区域。

1、在旧版本的Python中,进程间共享数据只能通过写入文件、通过网络套接字发送,或采用Pythonpickle模块进行序列化等方式。共享内存提供了进程间传递数据的更快的方式,从而使得Python的多处理器和多内核编程更有效率。

2、共享内存片段可以作为单纯的字节区域来分配,也可以作为不可修改的类似于列表的对象来分配,其中能保存数字类型、字符串、字节对象、None对象等一小部分Python对象。

(六)Pythonpickle模块提供了一种序列化和反序列化Python数据结构或实例的方法,可以将字典原样保存下来供以后读取。不同版本的Python支持的pickle协议不同,而3.8版本的支持范围更广、更强大、更有效的序列化。Python 3.8引入的第5pickle协议可以用一种新方法pickle对象,它能支持Python的缓冲区协议,如bytesmemoryviewsNumpy array等。新的pickle避免了许多在pickle这些对象时的内存复制操作。NumPyApache Arrow等外部库在各自的Python绑定中支持新的pickle协议。新的pickle也可以作为Python 3.63.7的插件使用,可以从PyPI上安装。

(七)许多内置方法和函数的速度都提高了20%~50%,因为之前许多函数都需要进行不必要的参数转换。

1、一个新的opcode缓存可以提高解释器中特定指令的速度。但是,目前实现了速度改进的只有LOAD_GLOBAL opcode,其速度提高了40%。以后的版本中也会进行类似的优化。

2、文件复制操作如shutil.copyfile()shutil.copytree()现在使用平台特定的调用和其他优化措施,来提高操作速度。

3、新创建的列表现在平均比以前小了12%,这要归功于列表构造函数如果能提前知道列表长度的情况下,可以进行优化。

4Python 3.8中向新型类(如class A(object))的类变量中的写入操作变得更快。operator.itemgetter()collections.namedtuple()也得到了速度优化。

Python3.9

1、字典并集和可迭代更新

2、字符串方法

3、类型提示

4、新的数学函数

5、新的解析器

6IPv6范围内的地址

7、新模块:区域信息

8、其他语言更改

(一)加入了合并运算符|(也就是管道符的那个键),可以使用这些运算符进行合并和更新,比如:

python3.6-3.10新特性一览

(二)removeprefix()和removesuffix()

str.removeprefixsubstringstring)字符串方法:如果str以它开头的话,将会返回一个修改过前缀的新字符串,否则它将返回原始字符串。

str.removesuffixsubstringstring)字符串方法:如果str以其结尾,则返回带有修改过后缀的新字符串,否则它将返回原始字符串。

(三)无需从typing.List来调用List,内置集合类型(ListDict)用作泛型类型,比如:

python3.6-3.10新特性一览

->为函数添加元数据,描述函数的返回类型,从而方便开发人员使用,这里表示函数无返回值

(四)math模块中第一个新添加的是math.lcm函数:

math.lcm(4, 8, 5)

math.lcm计算其参数的最小公倍数。与GCD一样,它允许可变数量的参数。

(五)Python 3.9使用了一个新的基于PEG的解析器(在使用pyinstaller静态编译的时候本机可用,但是经常在低版本系统:win7等会提示缺少动态库的问题,丢失dll文件)

(六)可以指定IPv6地址的范围,比如:

python3.6-3.10新特性一览

(七)zoneinfo模块将IANA时区数据库的支持引入标准库。它添加了zoneinfo.ZoneInfo,这是一个由系统时区数据支持的具体的datetime.tzinfo实现。

(八)引入了几个新的内置函数,包括rangetuplesetfrozensetlistdict ——使用vectorcall可以加快执行速度。__import __()现在增加了ImportError以替代ValueError,通常在相对导入超出其顶级包时发生。“”.replace(“”,sn)现在对于所有非零n返回s而不是空字符串。现在它与““ .replace(”“,s)相一致。

Python3.10

1检查

2名更改

3、二制表示中的1的数量统计

4、准弃用Distutils内置

5、字典增加mapping属性

6、函数zip()增加strict参数

7、模板匹配

8、支持 switch

(一)Python3.10版本中,联合运算符使用"|"线来代替了旧版本中的Union[]方法,使得程序更加简洁,不仅如此, Python3.10在一些内置函数中,同样可以利用"|"线的联合运算符来提升程序的性能

python3.6-3.10新特性一览

(二)Python3.10版本中,则通过 TypeAlias 来规定了类型名字的替换。这样操作的优势在于能够让程序开发人员和Python编辑器更加清楚的知道newname是一个变量名还是一个类型的别名,提升程序开发的可靠性。

python3.6-3.10新特性一览(三)在Python3.10版本中,可以通过调用bit_count函数来统计二进制中数字“1"个数,当然,在旧版本中,也可以通过很简单的代码实现这个功能。

python3.6-3.10新特性一览

(四)由于Distutils库的功能已经被此setuptoolspackage库取代了,所以本着简洁性的原则,Distutils在不久的将来将会被完全的删除掉。

python3.6-3.10新特性一览

(五)在Python3.10,针对于字典的三个方法,items, keysvalues都增加了一个新的"mapping"属性,通过下述的程序可以发现,对三个方法调用mapping属性后都会返回原字曲数据。

python3.6-3.10新特性一览

六)Python3.10中对于zip函数添加了strict参数, 顾名思义,strict参数就是要严格的遵守参数长度的匹配原则,下述程序中,keysvalues列表的长度并不一致。旧版本的zip函数会根据长度最短的参数来创建字典。新版本的zip函数中, 当设定strict参数设置为True, 则要求zip的输入参数必须要长度一致,否则就合报错。

python3.6-3.10新特性一览(七)Python 3.10引入了结构化的模式匹配,通过match...case关键词来完成,可以匹配字典,类以及其他更复杂的结构。match...case的模式匹配,在使用的方式上与C++中的switch有很多的相似之处。

python3.6-3.10新特性一览

(八)switch语句

match 关键词和 case 语句组成。通用语法如下:

match subject:

case <pattern_1>:

<action_1>

case <pattern_2>:

case _:

<action_wildcard>

(九)优化了报错模式,对排查错误的时候更加准确定位

参考:(1python官方文档

2https://www.cnblogs.com/Redskaber/articles/16860782.html

3https://www.ngui.cc/el/1518240.html?action=onClick

原文始发于微信公众号(由由学习吧):python3.6-3.10新特性一览

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月29日23:43:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   python3.6-3.10新特性一览https://cn-sec.com/archives/1528603.html

发表评论

匿名网友 填写信息