码迷,mamicode.com
首页 > 编程语言 > 详细

Python -- 生成器

时间:2015-10-22 00:14:25      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

如果列表元素可以按照某种算法推算出来,那么我们不必创建完整的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)

 

Python -- 生成器

标签:

原文地址:http://www.cnblogs.com/roronoa-sqd/p/4899433.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!