社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python 3.9来啦!细数十个值得关注的新特性

NewBeeNLP • 6 年前 • 984 次点击  

作者 | Farhad Malik
原文 | 见文末『阅读原文』处
来源 | 机器之心
整理 | NewBeeNLP公众号


Python 3.9 已于 10 月 5 日发布,新版本的特性,你 get 到了吗?对于 Python 程序员来说,这又是一个令人兴奋的时刻。

相比于之前的版本,Python 3.9 有哪些值得讨论的功能呢?

简而言之,从字典更新 / 合并到添加新的字符串方法,再到zoneinfo库的引入,Python 3.9 添加了许多新特性。此外,该版本还引入了一种稳定、高性能的新型解析器。

标准库更新了许多新特性,并添加了新模块zoneinfo和graphlib。此外该版本也对许多模块进行了改进,如ast、asyncio、concurrent.futures、multiprocessing、xml等。

现在让我们一起探索 Python 3.9 的新特性。

1. 字典更新和合并

字典添加两个新的运算符:「|」和「|=」。「|」运算符用于合并字典,「|=」运算符用于更新字典。

字典合并:

>>> a = {‘farhad’: 1, 'blog’: 2,'python’: 3}
>>> b = {’farhad’: 'malik’,'topic’: 'python3.9’}
>>> a | b
{’blog’: 2, '
python’: 3, ’farhad’:’malik’,'topic’: 'python3.9’}
>>> b | a
{’farhad’: 1,’blog’: 2, 'python’: 3,'topic’:’python3.9’ }

字典更新:




    
>>> a |= b
>>> a
{’blog’: 2, 'python’: 3,’farhad’:’malik’}

2. 基于 PEG 的高性能解析器

Python 3.9 提出用高性能和稳定的基于 PEG 的解析器取代当前基于 LL(1) 的 Python 解析器。

当前的 CPython 解析器基于 LL(1),LL(1) 解析器是一个自顶向下的解析器,它从左到右解析输入。

Python 3.9 提议将 LL(1) 替换为新的基于 PEG 的解析器,这意味着它将解除当前 LL(1) 语法对 Python 的限制。此外,当前的解析器修补了许多将要删除的 hack。因此,从长远来看,这会降低维护成本。

3. 新型字符串函数:删除前缀和后缀

Python 3.9 将两个新函数添加到 str 对象:

  • 第一个函数用于删除前缀:str.removeprefix(prefix)
  • 第二个函数用于删除后缀:str.removesuffix(suffix)
'farhad_python'.removeprefix('farhad_')
#returns python
'farhad_python'.removesuffix('_python')
#returns farhad

4. 对内置泛型类型提供类型提示

Python 3.9 通过删除并行类型层次结构,使注释程序变得更加简单。Python 3.9 支持 typing 模块所有标准集合中的泛型语法。

我们可以将 list 或 dict 直接作为列表和字典的类型注释,而不必依赖 typing.List 或者 typing.Dict。因此,代码现在看起来更加简洁,而且更容易理解和解释。

def print_value(input: str):
 print(input)
# We would get notified if the input is not a string

5. DateTime 支持 IANA 时区

zoneinfo 模块被创建出来支持 IANA 时区数据库。对 IANA 时区数据库的支持已经添加到标准库中。

IANA 时区通常称为 tz 或 zone info。存在许多具备不同搜索路径的 IANA 时区,用于为 date-time 对象指定 IANA 时区。例如,我们可以将对 datetime 对象设置搜索路径「Continent/City」来设置 tzinfo。

dt = datetime(2000, 01, 25, 01, tzinfo=ZoneInfo("Europe/London"))

如果传入一个无效的密钥,则会引发 zoneinfo.ZoneInfoNotFoundError 异常。

6. concurrent.futures 优化

concurrent.futures.Executor.shutdown() 中添加了一个新参数 cancel_futures。此参数可以取消尚未执行的并发任务。在 Python 3.9 之前主进程只有在所有并发任务完成后才能关闭 executor 对象。

新参数 cancel_futures 已被添加到 ThreadPoolExecutor 以及 ProcessPoolExecutor。它的工作方式是:当参数的值为 True 时,在调用 shutdown() 函数时取消所有待处理的任务。

7. 异步编程和多进程优化

Python 3.9 对异步编程(asyncio)和多进程库进行了优化。

  1. 由于安全问题的考虑,asyncio.loop.create_datagram_endpoint() 不再支持参数 reuse_address。
  2. 新增了 coroutines、shutdown_default_executor() 和 asyncio.to_thread() 。shutdown_default_executor 负责关闭默认 executor,asyncio.to_thread() 主要用于在一条单独的线程中运行 IO 密集型函数,以避免事件循环。

关于多进程库的改进,Python 3.9 向 multiprocessing.SimpleQueue 类添加了新方法 close()。

此方法可以显式地关闭队列。这将确保队列关闭并且停留时间不会比预期长。值得注意的是,一旦关闭队列,就不能调用 get()、put() 和 empty() 方法。

8. 统一的软件包导入错误

Python3.9 之前的版本在导入 Python 库时存在的主要问题是:当相对导入超出其顶级包时,Python 中的导入行为不一致。

builtins._import_() 引发 ValueError,而 importlib._import_() 引发 ImportError。Python3.9 版本进行了修复,它将统一引发 ImportError。

9. 生成随机字节

Python 3.9 版本中添加了新的函数 random.Random.randbytes()。该函数可用于生成随机字节。

Python 支持生成随机数,但如果需要生成随机字节呢?在 Python3.9 版本之前,开发人员必须想方设法生成随机字节。尽管他们可以使用 os.getrandom()、os.urandom() 或者 secrets.token_bytes() 来生成随机字节,但这些方法无法生成伪随机模式。

为了确保随机数的产生符合预期行为,并且过程可复现,开发人员通常将种子(seed)与 random.Random 模块一起使用。因此,Python 3.9 添加了 random.Random.randbytes() 方法,以可控的方式生成随机字节。

10. 修复字符串替换函数

在 Python 3.9 版本之前,对于所有非零的 n,"".replace("",s,n) 返回空字符串而不是 s。这个错误使用户困惑,并导致应用程序的不一致行为。

Python 3.9 修复了该问题,不管 n 是否为 0,其结果都与 "".replace("", s) 一致。

"".replace("", "blog", 1)
Returns ’' #One would expect to see blog
"".replace("","|", 1)
Returns ’' #
One would expect to see |
"".replace("","prefix")
Howver returns ’prefix'


如果大家想深入了解更多细节,请查阅官方文档:

https://docs.python.org/zh-cn/3.9/whatsnew/3.9.html

一起交流

重磅推荐!NewBeeNLP目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 推荐系统 / 面试交流 / 大厂内推 等),赶紧添加下方微信加入一起讨论学习吧!


- END -




论文自由,EMNLP2020论文打包收藏!

2020-10-21

【CS224N课程笔记】词向量I: 简介, SVD和Word2Vec

2020-10-19

不懂这些互联网黑话,都没法聊天

2020-10-17

超强整理,科班算法岗的秋招之路

2020-10-12

我是如何收集信息的

2020-10-07





记得把NewBeeNLP设为星标哦




等你在看

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/74857