1. 程式人生 > >Python學習之路:生成器

Python學習之路:生成器

學習 tar light 列表 print pytho highlight 範圍 for循環

列別生成式:使代碼更簡潔

>>> [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

Python學習之路:生成器