美文网首页
6.生成器

6.生成器

作者: 软件开发技术修炼 | 来源:发表于2022-04-06 20:33 被阅读0次

迭代器与生成器区别是:
生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用;

生成器定义
本质上是动态生成迭代的值,使用完直接丢弃,可以有效节省内存空间,但这些值只能被迭代一次。
1、其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写iter()和next()方法了,只需要一个yiled关键字。
2、生成器没有长度
3、生成器是只能遍历一次的

优点:
1、节省内存,每次生成一个元素,而不是计算后保存,如保存使用list(xxx)
2、提速,占内存更小
3、各种花式循环,节省代码长度

yield函数
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个生成函数;
yield其实从某个角度来看,就是一个return。不过它返回的就是一个可迭代的对象generator;
yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行;
调用一个生成器函数,返回的是一个迭代器对象。

示例1:函数中包含yield就是生成器函数,不能简单的通过函数名调用

def method(n):
    for i in range(n):
        yield i ** 2

method(4)   //不会打印任何东西 
//分析:
使用了yield之后,run()函数就是一个生成器函数,不是普通函数,不能通过函数名调用,生成器函数在迭代时候才会调用

示例2:迭代调用生成器函数

#调用方式一:
i=method(5)
while True:     # while循环迭代
    try:
        print(next(i))
    except:
        StopIteration
#结果:只会输出:0  1  4   9   16

#调用方式二:
for j in method(6):     # for循环迭代
    print(j)  

#结果:只会输出:0  1  4   9   16  25

示例3:生成器执行过程:循环执行了一次yield后,挂起函数状态,迭代取结果,然后执行第二次yield,挂起函数状态,再迭代取结果,执行第三次yield……

def g():
  for i in range(3):
    yield i
g = g()
next(g)
next(g)
next(g)
next(g)
#结果:
0
1
2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

示例4:生成器按指定大小读取文件

def method(file):
    size = 1024
    with open(file,encoding="utf-8") as readfile:
        while True:
            block=readfile.read(size)      //每次读固定长度到缓冲区
            if block:
                yield block
            else:
                return         //读到文件末尾则退出
for i in method("D:\\PythonScriptDictory\\py3.5\\test\\new_expand.txt"):
    print(i)
或者写成
with open(file,encoding="utf-8") as readfile:
    block = readfile.read(size)
    while block:
        yield block
        block=readfile.read(size)

总结:

生成器表达式:
g = (x * x for x in range(10))
这样的g就是一个generator
生成器表达式能做的事情列表解析基本都能处理,只不过在需要处理的序列比较大时,列表解析比较费内存。
应用场景:
生成器是一种惰性的序列,如果我们需要创建一个 0~xxxxxxxxx 的序列,这样大的序列创建出来会占用内存,生成器就解决这样的问题 。

相关文章

  • 6.生成器

    迭代器与生成器区别是:生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量...

  • 高编-属性,生成器,迭代器,闭包,装饰器

    1:属性 2.生成器 3.迭代器 4.闭包 5.装饰器 6.装饰器示例

  • (译)Python关键字yield的解释--下篇(stackov

    6.回到你的代码 (译者注:这是回答这对问题的具体解释) 生成器: 调用者: 这个代码包含了几个小部分: 我们对一...

  • 15.生成器generator

    目录:1.生成器介绍2.生成器举例3.生成器应用 1.生成器介绍 生成器指的是生成器对象,可以由生成器表达式得到,...

  • 2018-07-16

    ## 1\. 生成器和生成器函数 ``` 生成器的本质就是迭代器 生成器的三种创建办法: 1.通过生成器函数 ...

  • 第014篇:三大神器之生成器

    Python的三大神器:装饰器、迭代器、生成器 1、生成器 1.1、什么是生成器 生成器就是迭代器的一种;生成器作...

  • Python 生成器函数

    一、生成器 生成器指的是生成器对象,可由生成器表达式得到,也可使用 yield 关键字得到一个生成器函数,调用这个...

  • tornado协程的工作原理

    包含yield语句的函数是一个生成器。所有的生成器都是异步的。当我们调用生成器函数的时候,生成器函数返回一个生成器...

  • python 生成器小结

    作者:邵正将 来源:PytLab 在python中生成器可以很方便的实现迭代协议。生成器通过生成器函数产生,生成器...

  • ES6 Generators

    生成器函数 生成器函数以function*标注 yield关键字,会暂停生成器的执行,在之后可以继续执行 生成器的...

网友评论

      本文标题:6.生成器

      本文链接:https://www.haomeiwen.com/subject/cfrtsrtx.html