Python学习之路:生成器

列别生成式:使代码更简洁

>>> [i*2 for i in range(10)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

 生成器是为了节省内存空间,生成器在调用的时候才会生成相应的数据,不调用的时候只是分配内存;

只有一个__next__()方法。2.7里是next()

生成器不可用切片的方式取;

>>> b =( i*2 for i in range(10))
>>> b
<generator object <genexpr> at 0x103e5dd00>

 

>>> b.__next__()
0
>>> b.__next__()
2
>>> b.__next__()
4

 generator非常强大,如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。

Fibonacci数列:

def fib(max):
    n,a,b=0,0,1
    while n < max:
        print(b)
        a,b=b,a+b
        n=n+1
    return 'done'

fib(10)

 函数生成式及异常信息提醒def fib(max)    n,a,b=0,0,1

    while n < max:
        #print(b)
        yield b #转换成生成器
        a,b=b,a+b
        n=n+1
    return 'done'#如果下面程序中next超过max范围,会报错,提示异常

f=fib(100)
print(f.__next__())
print("========")#可以让函数中断,之后继续
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())

print("=====start loop ======")
for i in f:
    print(i)

#抓住异常
g=fib(6)
while True:
    try:
        x=g.__next__()
        print('g:',x)
    except StopIteration as e:
    print('Generator return value:',e.value)
    break

 

posted @ 2017-12-03 17:31  Py小白  阅读(187)  评论(0编辑  收藏  举报