Python使用生成器對延遲操做提供了支持。所謂延遲操做,是指在須要的時候才產生結果,而不是當即產生結果。主要有兩種結構能夠延遲結果建立。生成器函數和生成器表達式。python
和其餘函數編寫方式相同,可是使用yield語句一次返回一個結果,在每一個結果之間掛起當前狀態,下次調用的時候會從當前狀態繼續。函數
def count(n): yield n**2 for i in range(5): print(count(i).__next__()) ''' 0 1 4 9 16 '''
相似於列表解析,不一樣的是它返回的是一個可迭代對象而不是一個列表。code
a = (m**2 for m in range(5)) print(type(a)) # <class 'generator'>
注意:生成器是一個對象,咱們用的是()而不是[]。用[]就等於建立一個列表。對象
任何使用了yield的函數就是生成器,生成器就是一個返回迭代器的函數,或者說生成器就是一個迭代器。generator
實現斐波那契數列:class
def feibo(): a = 0 b = 1 while True: yield b # 先返回再暫停 a, b = b, a + b f = feibo() print(f.__next__()) print(f.__next__()) print(f.__next__()) print(f.__next__()) print(f.__next__()) print(f.__next__()) print(f.__next__()) ''' 1 1 2 3 5 8 13 '''
1.和return類似,返回值。test
2.暫停迭代,直到調用下一個next()方法。先返回再暫停。yield
3.調用的時候返回生成器對象。迭代器
假如yield後面緊接着一個數據,就會把數據返回,做爲next()函數或者for ...in...迭代出的下一個值。程序
yield還能接收值,用send方法傳入。
咱們能夠經過send()方法,向生成器內部傳遞參數。
next(g)至關於send(None)
def test(): i = 1 while i < 5: temp = yield i**2 print(temp) i += 1 t = test() # 第一次運行只能使用next或者send(None) print(t.__next__()) # send的做用至關於使生成器繼續運行,而且傳遞的參數爲yield的返回值(程序中即temp的值) print(t.send("Hello World")) print(t.__next__()) # 至關於send(None) 此時temp = None ''' 1 Hello World 4 None 9 '''
yield = a,會返回a。
b = yield,會把yield接收的值賦值給b。
def count(n): x = 0 while x < n: value = yield x if value is not None: print('Received value: %s' % value) x += 1 x = count(5) print(next(x)) print(x.send('hello')) print(next(x)) ''' 0 Received value: hello 1 2 '''
def h(): print("Wen Chuan") m = yield 5 print(m) d = yield 12 c = h() print(next(c)) print(c.send(".")) ''' Wen Chuan 5 . 12 '''