Python學習之路:生成器
阿新 • • 發佈:2017-12-03
學習 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學習之路:生成器