Python -- 生成器

如果列表元素可以按照某种算法推算出来,那么我们不必创建完整的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 = 0, 1while 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')
KEEP LEARNING!
原文地址:https://www.cnblogs.com/roronoa-sqd/p/4899433.html