生成器与迭代器
Posted andypengx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成器与迭代器相关的知识,希望对你有一定的参考价值。
1、 生成器
生成器分为2种形式:
- 如果一个函数是带 yield 语句。那么它就变成了一个生成器,一个普通函数或者子 程序只返回一次,但一个生成器能暂停执行并返回一个中间的结果----那就是 yield 语句的功能, 返 回一个值给调用者并暂停执行。当生成器的 next()方法被调用的时候,它会准确地从离开地方继续
- 生成器表达式:类似于列表推导,只不过是把一对大括号[]变换为一对小括号(),生产器表达式不会一次返回所有结果产生一个列表,而是返回一个生成器,这个生成器在每次调用时返回一个结果。 生成器表达式使用了"延迟计算"(lazy evaluation), 所以它在使用 内存上更有效.。
[x * x for x in range(10)] 列表表达式,通过它得到一个列表 (x * x for x in range(10)) 生成器表达式 通过它得到一个生成器
#_*_coding:utf-8_*_ __author__ = ‘Alex Li‘ import time def consumer(name): print("%s 准备吃包子啦!" %name) while True: baozi = yield #yield 接受send方法传递的值 print("包子[%s]来了,被[%s]吃了!" %(baozi,name)) def producer(name): c = consumer(‘A‘) c2 = consumer(‘B‘) c.__next__() c2.__next__() print("老子开始准备做包子啦!") for i in range(10): time.sleep(1) print("做了2个包子!") c.send(i) #send方法发送的数据可以被yield接受 c2.send(i) producer("px")
2、迭代器
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator,全部取出后, 会引发一个 StopIteration 异常, 这并不表示错误发生, 只是告诉外部调用者, 迭代完成
Iterator对象表示的是一个数据流,可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过
next()
函数实现按需计算下一个数据,所以Iterator
的计算是惰性的,只有在需要返回下一个数据时它才会计算
迭代器是一次性消耗品,使用完了以后就空了
以上是关于生成器与迭代器的主要内容,如果未能解决你的问题,请参考以下文章