V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fanqieipnet
V2EX  ›  推广

什么是生成器?如何创建生成器

  •  
  •   fanqieipnet · 2021-01-04 17:24:11 +08:00 · 832 次点击
    这是一个创建于 1258 天前的主题,其中的信息可能已经有所发展或是发生改变。
    什么是生成器?如何创建生成器?今天番茄加速就来讲一下。

      生成器是可迭代的(Iterable),最简单的创建生成器方法是通过一对(),如下所示:

       In [37]: g = (i*i for i in [1,4,0])

       In [38]: g

       Out[38]: at 0x7fe8956e96d0>

       g 是一个生成器对象,generator object

      获取生成器对象的元素,可使用 next 函数,如下所示,获取第一个元素:

       In [39]: next(g)

       Out[39]: 1

      获取第二个元素:

       In [40]: next(g)

       Out[40]: 16

      创建生成器的几种方法?

      如上所见,使用一对()能够创建一个生成器对象。

      除此之外,想必大家也都知道,是使用关键字 yield. yield 出现在一个函数中,运行到 yield 处,返回的对象便是生成器对象(generator object).

      生成器是迭代器吗?

      生成器对象(generator object)一定也是迭代器对象(Iterator object),如上面的生成器 g,使用内置函数 isinstance 验证,返回 True:

       In [43]: isinstance(g,Iterator)

       Out[43]: True

      因此,它具备一切迭代器的特性,关于迭代器我们已在上一个话题讨论,简而言之,迭代器的几个特点:

      是有去无回的,

      迭代器无需提前知道整个列表的所有元素,

      无需加载所有元素到 RAM 中尽而它是节省内存的(memory-efficient).

      生成器同样具备这些特性。
    3 条回复    2021-01-04 20:19:49 +08:00
    julyclyde
        1
    julyclyde  
       2021-01-04 19:59:50 +08:00   ❤️ 1
    你这是推广??广告呢?
    hoyixi
        2
    hoyixi  
       2021-01-04 20:09:17 +08:00
    @julyclyde #1
    难道是第一行的那几个字
    julyclyde
        3
    julyclyde  
       2021-01-04 20:19:49 +08:00
    @hoyixi 多谢指点
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2485 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 07:06 · PVG 15:06 · LAX 00:06 · JFK 03:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.