生成器概念:
python使用生成器對延遲操作提供了支持,就是需要的時候才產生結果,而不是產生結果.
-
生成器函數:
和其他函數編寫方式相同,使用
yield
語句一次返回一次結果,在每個結果之間掛起當前狀態,下次調用直接繼續當前的狀態. -
生成器表達式:
類似於列表解析,不同的是他返回的是一個迭代對象而不是一個列表.
#列表生成器:
L = [x for x in range(5)]
print(L)
#簡單生成器:
G= (x for x in range(5))
print(next(G))
print(next(G))
print(next(G))
print(next(G))
print(next(G))
當我們輸出結果是一個一個的輸出時:
-
1.創建一個迭代器類,把代碼寫進去,用類來創建可迭代對象,然后用next()函數來把結果迭代出來.
class test_Iterator(): def __init__(self): self.a=0 self.b=1 def __iter__(self): return self def __next__(self): num = self.a self.a,self.b=self.b,self.b+self.a return num itera = test_Iterator() print(next(itera)) print(next(itera)) print(next(itera)) print(next(itera)) print(next(itera)) print(next(itera)) ######################################################## 0 1 1 2 3 5
-
2.代碼函數的合適位置加上yield,這時候這個函數就變成一個生成器了
def test(): a = 1 b = 2 while True: yield a a,b = b,a*b generator = test() print(next(generator)) print(next(generator)) print(next(generator)) print(next(generator)) print(next(generator)) print(next(generator)) print(next(generator)) print(next(generator)) ####################################### 1 2 2 4 8 32 256 8192 第一次用next()喚醒生成器時,從函數的開頭開始運行,遇到yield a,返回a,然后暫停函數,並記住函數是運行到這個位置的。 第二次喚醒生成器,從yield a斷點處開始,然后a,b開始賦值,while True循環又遇見yield a,返回a,然后暫停函數,並記住函數是運行到這個位置的
-
3.生成器yield接收參數,send()方法:
#b = yield,會把yield接收的值賦值給b。 def test(): a = 1 while True: recv = yield a print('接收值:',recv) gen = test() print(next(gen)) print(gen.send('Jhonsenry')) print(gen.send('a bad guy')) ############################################################################## 1 接收值: Jhonsenry 1 接收值: a bad guy 1