1. 程式人生 > >Python3.x:生成器簡介

Python3.x:生成器簡介

否則 with open test 防止 叠代 手動 但是 lock 打印

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, in
StopIteratio

所以一般不會手動的調用__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:生成器簡介