标签:
如果列表元素可以按照某种算法推算出来,那么我们不必创建完整的list,从而节省大量的空间。
在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。
>>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10)) >>> g <generator object <genexpr> at 0x104feab40>
L为列表推导式生成的列表
g为生成器,可以通过next(g)的方式调用,有更多的元素时,抛出StopIteration的错误。
也可以通过for i in g:的方式循环调用
输出型
def fib(): a, b = b, a+b while b < 100: yield b a, b = b, a+b a = fib() #此时,a就是一个生成器
for i in a:
print(i)
函数中,遇到yield就会中断,下次又继续执行,直到没有yield语句可以执行时,抛出异常。
接收输入型
def reciver(): while True: n = (yield) print "Got %s" % n
r = reciver() next(r) r.send(1) r.send(‘2‘)
输入输出型
def get(): n = 0 result = None while True: n = (yield result) result = n*10 t = get() next(t) for i in range(10): print(t.send(str(i))) t.close()
传递参数
def countdown(n): print("counting down from %d" % n) while n > 0: yield n n -= 1 c = countdown(10) print next(c) print next(c) for i in countdown(10): print(i)print sum(countdown(10))
要先执行next()
函数,然后才能发送数据,如果忘记的话就会报错。
这怎么办?用装饰器来自动执行:
def coroutine(func): def start(*args,**kwargs): g = func(*args,**kwargs) next(g) return g return start @coroutine def reciver(): while True: n = (yield) print "Got %s" % n r = reciver() r.send(1) r.send(‘2‘)
标签:
原文地址:http://www.cnblogs.com/roronoa-sqd/p/4899433.html