0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python 支持同步的推导式版本

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-31 14:37 次阅读

PEP-492 和 PEP-525 通过 async/await 语法,引入了对原生协程和异步生成器的支持。本 pep 提议给列表、集合、字典解析式和生成器表达式添加异步的版本。

基本原理和目标

Python 广泛地支持同步的推导式,允许使用简单而简洁的语法生成列表、字典和集合。我们提议为异步代码实现类似的语法结构。

为了说明可读性的改善,请考虑下面的例子:

result = []
async for i in aiter():
    if i % 2:
        result.append(i)

有了提议的异步解析式语法,上面的代码会变得非常简短:

result = [i async for i in aiter() if i % 2]

本 PEP 也使得在各种解析式中使用 await 表达式成为可能:

result = [await fun() for fun in funcs]

规范

异步的解析式

我们提议允许在列表、集合与字典解析式中使用 async。待 PEP-525 被批准之后,我们还可以创建异步的生成器表达式。

例子:

  • 集合解析式:{i async for i in agen()}
  • 列表解析式:[i async for i in agen()]
  • 字典解析式:{i: i ** 2 async for i in agen()}
  • 生成器表达式:(i ** 2 async for i in agen())

允许在异步解析式和生成器表达式中使用 async for 与 if 以及 for 子句:

dataset = {data for line in aiter()
                async for data in line
                if check(data)}
data = {data for line in aiter() async for data in line if check(data)}

异步解析式只允许在“async def”函数中使用。

原则上,异步生成器表达式允许用在任何上下文中。然而,在 Python 3.6 中,由于 async 和 await 只是“软关键字”(soft-keyword),异步生成器表达式只允许在 async def 函数中使用。一旦 async 和 await 在 Python 3.7 中成为保留关键字,这个限制将被移除。

解析式中的 await

我们提议允许在异步和同步解析式中使用 await 表达式:

result = [await fun() for fun in funcs]
result = {await fun() for fun in funcs}
result = {fun: await fun() for fun in funcs}

result = [await fun() for fun in funcs if await smth]
result = {await fun() for fun in funcs if await smth}
result = {fun: await fun() for fun in funcs if await smth}

result = [await fun() async for fun in funcs]
result = {await fun() async for fun in funcs}
result = {fun: await fun() async for fun in funcs}

result = [await fun() async for fun in funcs if await smth]
result = {await fun() async for fun in funcs if await smth}
result = {fun: await fun() async for fun in funcs if await smth}

这只在 async def 函数体中有效。

语法的更新

本提议需要在语法层面做一个修改:在 comp_for 中添加可选的“async”关键字:

comp_for: [ASYNC] 'for' exprlist 'in' or_test [comp_iter]

解析式的 AST 节点将有一个新的 is_async 参数

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62588
  • 代码
    +关注

    关注

    30

    文章

    4786

    浏览量

    68563
  • 生成器
    +关注

    关注

    7

    文章

    315

    浏览量

    21006
  • python
    +关注

    关注

    56

    文章

    4795

    浏览量

    84661
收藏 人收藏

    评论

    相关推荐

    Python哪个版本好用?

    想学习Python的人都会有一个困惑,那就是Python目前有两个版本Python2和Python3,P
    发表于 01-26 16:39

    Python版本兼容性处理方法

    Python目前有两个主版本并存,这很让人苦恼。虽然Python 3有许多优于Python 2的特性,但是Python 2的生态系统更为完善
    发表于 04-28 15:42

    开发者福音!谷歌云APP引擎开始支持Python 3.7

    下方链接吧!https://cloud.google.com/appengine/docs/standard/python3/敲重点!—可支持便携Web应用程序了!App Engine的原始
    发表于 08-14 10:12

    请问大佬有支持imx6ull的python3版本么?

    支持imx6ull的python3版本
    发表于 01-10 06:52

    python推导

    python推导推导(英文名:comprehensions),也叫解析,是
    发表于 02-28 17:14

    如何使用Python同步文件夹

    要创建可分发程序,您需要在自己的计算机上安装python。电脑。不幸的是,我们将使用的模块pyinstaller不适用于python 3.6,因此您需要在计算机上安装python 3.5或更低
    的头像 发表于 12-11 14:35 2721次阅读

    Python3.9的第一个维护版本候选版本发布

    近期,Python 3.9的第一个维护版本候选版本发布。 IT之家获悉,Python 3.9.1rc1 是 Python 编程语言最新的主要
    的头像 发表于 12-08 09:22 1688次阅读

    Logistic回归数学推导以及python实现

    Logistic回归数学推导以及python实现
    发表于 02-25 14:48 7次下载

    浅析同步与异步Python的区别与概述

    你是否听到人们说过,异步Python代码比普通(或同步Python代码更快?果真是那样吗?
    的头像 发表于 04-25 13:53 2211次阅读
    浅析<b class='flag-5'>同步</b>与异步<b class='flag-5'>Python</b>的区别与概述

    python推导是什么

    python推导 推导(英文名:comprehensions),也叫解析,是
    的头像 发表于 02-28 17:13 2719次阅读

    Python 3.11与之前Python 版本差异情况

    Python 3.11.0 正式版本预计于今年 10 月份发布,目前已发布了首个和第二个 Beta 版本;预计 Beta 阶段将会发布 4 个版本,下一个预发布
    的头像 发表于 07-22 10:51 4857次阅读

    同步发电机互感系数推导

    同步发电机互感系数推导
    发表于 03-28 10:52 0次下载
    <b class='flag-5'>同步</b>发电机互感系数<b class='flag-5'>推导</b>

    Python和Anaconda的版本对应关系

    原文链接 Python和Anaconda的版本对应关系如下: Packages included in Anaconda 2022 . 10 for 64 -bit Linux on x 86
    的头像 发表于 06-13 16:52 1229次阅读
    <b class='flag-5'>Python</b>和Anaconda的<b class='flag-5'>版本</b>对应关系

    python语言表推导和生成器表达式特性

    今天我想向你介绍python语言的两个非常有用的特性:列表推导和生成器表达式。这两个特性都可以让你用一行简洁的代码来创建一个序列,而不需要写循环或者函数。但是它们之间也有一些重要的区别,我们一起
    的头像 发表于 07-20 09:51 837次阅读
    <b class='flag-5'>python</b>语言表<b class='flag-5'>推导</b><b class='flag-5'>式</b>和生成器表达式特性

    windows7可以安装python什么版本

    Python 3是新一代Python语言版本。它在语法和功能上与Python 2有一些不同。Python 3.x系列是目前主要
    的头像 发表于 11-23 17:15 2.9w次阅读