Python3.x:生成器簡介
Python3.x:生成器簡介
概念
任何使用yield的函數都稱之為生成器;使用yield,可以讓函數生成一個序列,該函數返回的對象類型是"generator",通過該對象連續調用__next__()方法返回序列值;
實例
生成器函數只有在調用__next()__方法的時候才開始執行函數裏面的語句,例如:
def count(n): while n > 0: yield n #生成值:n n -= 1
使用yield,可以讓函數生成一個序列,該函數返回的對象類型是"generator",通過該對象連續調用__next__()方法返回序列值;
c = count(5) c.__next__() #python 3.4.3要使用c.__next__()不能使用c.next() 結果:5 c.__next__() 結果4
在調用count函數時:c=count(5),並不會打印"counting"只有等到調用c.__next__()時才真正執行裏面的語句。每次調用__next__()方法時,count函數會運行到語句yield n
處為止,__next__()的返回值就是生成值n
,再次調用__next__()方法時,函數繼續執行yield之後的語句(熟悉Java的朋友肯定知道Thread.yield()方法,作用是暫停當前線程的運行,讓其他線程執行),例如:
def count(n): print ("cunting" ) while n > 0: print (‘before yield‘) yield n #生成值:n n -= 1 print (‘after yield‘ )
上述代碼在第一次調用__next__方法時,並不會打印"after yield"。如果一直調用__next__方法,當執行到沒有可叠代的值後,程序就會報錯:
Traceback (most recent call last): File "", line 1, inStopIteratio
所以一般不會手動的調用__next__方法,而使用for循環:
for i in count(5): print (i)
實例:用yield實現斐波那契數列
def fibonacci(): a=b=1 yield a yield b while True: a,b = b,a+b yield b
調用:
for num in fibonacci(): if num > 100: break print (num),
yield中return的作用:
作為生成器,因為每次叠代就會返回一個值,所以不能顯示的在生成器函數中return 某個值,包括None值也不行,否則會拋出“SyntaxError”的異常,但是在函數中可以出現單獨的return,表示結束該語句。
通過固定長度的緩沖區不斷讀文件,防止一次性讀取出現內存溢出的例子:
def read_file(path): size = 1024 with open(path,‘r‘) as f: while True: block = f.read(SIZE) if block: yield block else: return
如果是在函數中return 具體某個值,就直接拋異常:
def test_return(): yield 4 return 0 結果:File "<stdin>", line 3 SyntaxError: ‘return‘ with argument inside generator
Python3.x:生成器簡介