1、可迭代对象:列表,字符串,文件….
2、当你有大量数据并把所有值放到内存时,这种处理方式可能不总是你想要的
生成器是迭代器,只能遍历它一次,因为生成器并没有将所有值放入内存中,而是实时地生成这些值
当你知道你的函数将产生大量仅被读取一次的数据时,使用生成器将是十分有效的做法
3、yield是一个关键词,类似return, 不同之处在于,yield返回的是一个生成器
当你调用这个函数,函数中你书写的代码并没有执行。这个函数仅仅返回一个生成器对象
在每次for循环使用生成器时,都会执行你的代码
2、当你有大量数据并把所有值放到内存时,这种处理方式可能不总是你想要的
生成器是迭代器,只能遍历它一次,因为生成器并没有将所有值放入内存中,而是实时地生成这些值
当你知道你的函数将产生大量仅被读取一次的数据时,使用生成器将是十分有效的做法
3、yield是一个关键词,类似return, 不同之处在于,yield返回的是一个生成器
当你调用这个函数,函数中你书写的代码并没有执行。这个函数仅仅返回一个生成器对象
在每次for循环使用生成器时,都会执行你的代码
参考:http://python.jobbole.com/83610/
理解几个例子:
def yield_test(n):
print('start.')
for i in range(n):
if i>0:
yield call(i)
print("i=",i)
#做一些其它的事情
print("do something.")
print("end.")
def call(i):
return i*2
yt = yield_test(3)
print('这里先输出,说明上面调用函数不会先输出start.因为返回一个生成器,并不会执行函数')
#每次循环,就返回一个yield值,然后下次循环,就从上次yield的位置再开始执行
for i in yt:
print(i,",")
# break #如果这里就break了,就会连i=也不会输出,因为不会下一次循环。
def fab(max):
n, a, b = 0, 0, 1
L = []
while n < max:
L.append(b)
a, b = b, a + b
n = n + 1
return L
#上面通过return返回list的形式。
#若符合只遍历一次而且数据量大的业务,则可以替换成yield的形式节省内存。
def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b
# print b
a, b = b, a + b
n = n + 1
for i in fab(3):
print(i)
def consumer():
r = ''
print('consumer start')
while True:
n = yield r
if not n:
return
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK'
def produce(c):
print('produce start')
c.send(None)
"""
如果不先send(None),将会报TypeError: can't send non-None value to a just-started generator
当生成器刚刚创建时,因为没有调用过,生成器就没有运行,就没有yield表达式。
所以先send(None)初始化
"""
print('send None done')
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
c.close()
c = consumer()
produce(c)
yield from iterable本质上等于for item in iterable: yield item的缩写版
参考:https://www.jianshu.com/p/d09778f4e055