生成器generetor
generator是一种特殊的可迭代对象iterable。主要目的为节约内存, 后边元素没有用到时就暂时不创建,访问时才会生成。创建方式分两种:
1、(i*2 for i in range(10)) 列表生成器;
2、推算算法比较复杂,用列表推导式不能实现时,用函数的yield功能实现。生成器由于访问前由于没创建,因此不支持列表的切片操作,如 a[100]
以下时一个典型的生成器实例,断点调试可以清楚看到具体的执行流程。
import time
def consumer(name):
print('%s开始吃包子了'%name)
while 1:
baozi = yield
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)
c.send(i)
c2.send(i)
producer('zouweidg')
不用yield实现一个斐波那契(Fibonacci)数列生成器:
class Fib(object):
def __init__(self, max):
self.max = max
self.n, self.a, self.b = 0, 0, 1
def __iter__(self):
return self
def __next__(self):
#注意函数的定义形式,必须是__next__
if self.n < self.max:
r = self.b
self.a, self.b = self.b, self.a + self.b
self.n = self.n + 1
return r
raise StopIteration()
Fib 类通过 next() 不断返回数列的下一个数,内存占用始终为常数:
for n in Fib(5):
print (n)
用yield实现一个generator:
def fib(end = 5):
prev,curr=0,1
while curr < end:
yield curr
prev,curr=curr,curr+prev
for i in fib():
print(i)
输出:
1
1
2
3
5