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

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

3天内不再提示

python生成器是什么

python爬虫知识分享 来源:python爬虫知识分享 作者:python爬虫知识分享 2022-02-24 15:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

python生成器

1. 什么是生成器?

生成器(英文名 Generator ),是一个可以像迭代器那样使用for循环来获取元素的函数。

生成器的出现(Python 2.2 +),实现了延时计算,从而缓解了在大量数据下内存消耗过猛的问题。

当你在 Python Shell 中敲入一个生成器对象,会直接输出 generator object 提示你这是一个生成器对象

>>> gen = (i for i in range(5))
>>> gen
 at 0x10cae50b0>

2. 如何创建生成器?

使用列表推导式

在上面已经演示过,正常我们使用列表推导式时是下面这样子,使用 [] ,此时生成的是列表。

>>> mylist = [i for i in range(5)]
>>> mylist
[0, 1, 2, 3, 4]

而当你把 [] 换成 () ,返回的就不是列表了,而是一个生成器

>>> gen = (i for i in range(5))
>>> gen
 at 0x10cae50b0>

使用 yield

yield 是什么东西呢? 它相当于我们函数里的 return,但与 return 又有所不同。

当一个函数运行到 yield 后,函数的运行会暂停,并且会把 yield 后的值返回出去。

若 yield 没有接任何值,则返回 None

yield 虽然返回了,但是函数并没有结束

请看如下代码,我定义了一个 generator_factory 函数,当我执行 gen = generator_factory() 时,gen 就是一个生成器对象

>>> def generator_factory(top=5):
...     index = 0
...     while index < top:
...         print("index 值为: " + str(index))
...         index = index + 1
...         yield index
...     raise StopIteration
...
>>> gen = generator_factory()
>>> gen

3. 生成器的使用

从一个生成器对象中取出元素,和我们前面学过的通过切片访问列表中的元素不一样,它没有那么直观。

想要从生成器对象中取出元素,只有两种方法:

第一种方法:使用 next 方法一个一个地把元素取出来,如果元素全部取完了,生成器会抛出 StopIteration 的异常。

>>> gen = (x for x in range(3))
>>> gen
 at 0x1072400b0>
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration

第二种方法:使用 for 循环一个一个地迭代出来

>>> gen = (x for x in range(3))
>>> for i in gen:
...     print(i)
...
0
1
2

4. 生成器的激活

生成器对象,在创建后,并不会执行任何的代码逻辑。

想要从生成器对象中获取元素,那么第一步要触发其运行,在这里称之为激活。

方法有两种:

使用next() :上面已经讲过

使用generator.send(None)

还以下面这段代码为例,可以看到 gen.send(None) 相当于执行了 next(gen)

>>> def generator_factory(top=5):
...     index = 0
...     while index < top:
...         print("index 值为: " + str(index))
...         index = index + 1
...         yield index
...     raise StopIteration
...
>>>
>>> gen = generator_factory()
>>> gen.send(None)
index 值为: 0
1
>>> gen.send(None)
index 值为: 1
2

5. 生成器的状态

生成器在其生命周期中,会有如下四个状态

GEN_CREATED # 生成器已创建,还未被激活

GEN_RUNNING # 解释器正在执行(只有在多线程应用中才能看到这个状态)

GEN_SUSPENDED # 在 yield 表达式处暂停

GEN_CLOSED # 生成器执行结束

通过下面的示例可以很轻松地理解这一过程(GEN_RUNNING 这个状态只有在多线程中才能观察到,这里就不演示啦)

>>> gen = (x for x in range(2))
>>> from inspect import getgeneratorstate
>>> gen = (x for x in range(3))
>>> getgeneratorstate(gen)
'GEN_CREATED'
>>>
>>> next(gen)
0
>>> getgeneratorstate(gen)
'GEN_SUSPENDED'
>>> next(gen)
1
>>> next(gen)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration
>>> getgeneratorstate(gen)
'GEN_CLOSED'

6. 生成器的异常

在最前面,我有定义了一个生成器函数。

def generator_factory(top=2):
    index = 0
    while index < top:
        index = index + 1
        yield index
    raise StopIteration

在没有元素可返回时,我最后抛出了 StopIteration 异常,这是为了满足生成器的协议。

实际上,如果你不手动抛出 StopIteration,在生成器遇到函数 return 时,会我自动抛出 StopIteration

请看下面代码,我将 raise StopIteration 去掉后,仍然会抛出异常。

>>> def generator_factory(top=2):
...     index = 0
...     while index < top:
...         index = index + 1
...         yield index
...
>>> gen = generator_factory()
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration

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

    关注

    7

    文章

    322

    浏览量

    22791
  • python
    +关注

    关注

    58

    文章

    4883

    浏览量

    90295
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    GS4901B/GS4900B:视频与音频时钟及定时生成的理想之选

    GS4901B/GS4900B:视频与音频时钟及定时生成的理想之选 在电子设计领域,时钟和定时生成器对于确保系统的稳定运行和精确同步至关重要。今天,我们就来深入探讨一下 Gennum 公司
    的头像 发表于 04-15 10:10 65次阅读

    ICS2008B:SMPTE时间码接收器/生成器的技术解析

    ICS2008B:SMPTE时间码接收器/生成器的技术解析 在多媒体技术飞速发展的今天,时间码的精确控制对于音视频同步至关重要。ICS2008B作为一款SMPTE时间码接收器/生成器芯片,为多媒体
    的头像 发表于 04-13 18:10 354次阅读

    AD9547:网络时钟生成与同步的理想之选

    AD9547:网络时钟生成与同步的理想之选 在电子设计领域,时钟的精准性和稳定性对于系统的正常运行至关重要。AD9547作为一款双/四输入网络时钟生成器/同步器,为众多系统提供了出色的时钟同步
    的头像 发表于 04-13 11:05 159次阅读

    探秘ICS841402I:PCIe与sRIO时钟生成的理想之选

    探秘ICS841402I:PCIe与sRIO时钟生成的理想之选 在电子设计领域,时钟信号的稳定性和准确性对于系统的性能至关重要。今天,我们就来深入了解一款优化的PCIe和sRIO时钟生成器
    的头像 发表于 04-12 12:40 397次阅读

    IDT 843242:晶体到3.3V LVPECL频率合成器的深度解析

    IDT 843242:晶体到3.3V LVPECL频率合成器的深度解析 引言 在电子设计领域,频率合成器是实现精确时钟信号生成的关键组件。IDT的843242频率合成器专为以太网参考时
    的头像 发表于 04-12 10:40 412次阅读

    探索ICS9FG104E:PCIe Gen1/2、USB3.0等设备的频率生成器解决方案

    探索ICS9FG104E:PCIe Gen1/2、USB3.0等设备的频率生成器解决方案 在电子设备的设计中,频率生成器扮演着至关重要的角色,它为各种高速接口提供稳定的时钟信号,确保设备的正常运行
    的头像 发表于 03-29 17:05 901次阅读

    SBC案例生成器对VisionFive2的支持

    最近收到了我的 VisionFive2,并且是 SBC 模型框架和 SBC 案例生成器的开发人员,我为那些对标准和自定义案例感兴趣的人在这两个应用程序中添加了对 VisionFive2 SBC
    发表于 03-18 08:21

    探索Renesas 9FGV0431:低功耗PCIe时钟生成器的卓越之选

    探索Renesas 9FGV0431:低功耗PCIe时钟生成器的卓越之选 引言 在当今的电子设计领域,PCIe技术的广泛应用对时钟生成器提出了更高的要求。Renesas的9FGV0431作为一款专为
    的头像 发表于 03-15 17:25 1091次阅读

    如何在LTspice仿真中实现伪随机数和真随机数的生成

    to reseed the MC generator(使用时钟重新设置MC生成器的随机种子)选项。文章探讨了伪随机数和真随机数之间的利弊权衡,同时比较了蒙特卡罗统计仿真与更有针对性的最坏情况仿真之间的差异。
    的头像 发表于 01-09 14:08 4839次阅读
    如何在LTspice仿真中实现伪随机数和真随机数的<b class='flag-5'>生成</b>

    如何通过地址生成器实现神经网络特征图的padding?

    ,从而使卷积输出特征图结果满足我们的需求,这种补零的操作称之为padding,如下图所示。 关于padding的实现,一般有两种操作,第一种是使用稀疏地址生成器,寻找padding数据地址的规律,当
    发表于 10-22 08:15

    高性能射频合成器评估模块LMX2571EPEVM技术解析

    Texas Instruments LMX2571EPEV射频合成器评估模块 (EVM) 设计用于LMX2571-EP低功耗、高性能射频合成器。Texas Instruments LMX2571-EP可生成10MHz至1344M
    的头像 发表于 09-23 11:11 1099次阅读
    高性能射频合<b class='flag-5'>成器</b>评估模块LMX2571EPEVM技术解析

    ‌CDCDLP223 时钟合成器技术文档总结

    CDCDLP223是一款基于PLL的高性能时钟合成器,针对DLP™系统进行了优化。它使用20 MHz晶体生成基频,并导出100 MHz HCLK和300 MHz HCLK输出的频率。此外,该CDCDLP223在20 MHz输出端生成
    的头像 发表于 09-19 10:48 881次阅读
    ‌CDCDLP223 时钟合<b class='flag-5'>成器</b>技术文档总结

    非对称密钥生成和转换规格详解

    生成 以字符串参数生成RSA密钥,具体的“字符串参数”由“RSA密钥类型”和“素数个数”使用符号“|”拼接而成,用于在创建非对称密钥生成器时,指定密钥规格。 说明:生成RSA非对称密
    发表于 09-01 07:50

    为什么无法在DAVE™ IDE 中导入和编译 XMC4402/XMC4200 项目?

    该项目不可用。 2)即使项目出现在工作区中,我也无法编译它。 3 此外,导入后DAVE™代码生成器不起作用。
    发表于 08-08 07:19

    PanDao:实际约束条件下成像系统的初始结构的生成

    的平均RMS光斑尺寸约为55 μm,色差校正效果中等。基于同等规格与约束,我们采用自主研发的FTR初始透镜生成器,在数分钟内即创建出多个更加优质的设计方案。图1展示了由FTR程序生成的五类不同透镜系统
    发表于 05-07 08:57