生成器由來
迭代器可以透過每次迭代生成資料,是透過next()方法,但是通常我們在生成一個迭代器的時候,我們是需要記錄資料的,這時候生成器就無法滿足了,而此時就需要一個記錄當前狀態的東西,他就是生成器。
即生成器就是一種特殊的迭代器。
建立生成器的方法
方法1,列表推導式的[],換成()。
#!/usr/bin/env python#列表推導式l = [i+10 for i in range(10)]print(l)#生成器g = (i+10 for i in range(10))print(g)#生成器的元素獲取for i in g: print(i, end=“,”)
結果為:
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
10,11,12,13,14,15,16,17,18,19,
Process finished with exit code 0
方法2,定義函式中使用yiled語句
#!/usr/bin/env pythondef test(): for i in range(10): if i %2 ==0: yield ires = test()print(res)for i in res: print(i, end=“,”)
結果為
“C:\Program Files\Python38\python3。exe” D:/python/python_210710/gevent_package/demo2。py
0,2,4,6,8,
很明顯,我們可以看到函式的返回是一個生成器物件,此時呼叫這個函式,即就是生成一個生成器物件了。可以理解為這是一個生成器的模板。
那麼既然這個生成器,而生成器又是一個特殊的迭代器,是否可以用迭代器的方式來呼叫這個呢?
我們可以用next()來嘗試一下。
接下來我們演示一下生成器的執行。
next方法執行
前面演示的時候,我們看到了呼叫next的時候,報錯了,如何避免這樣的情況呢?
#!/usr/bin/env pythondef test(): for i in range(10): if i %2 == 0: yield ires = test()print(res)while True: try: t = next(res) print(t) except Exception as e: break
函式中有返回值的時候,怎麼辦呢?
#!/usr/bin/env pythondef test(): for i in range(10): if i %2 == 0: yield i return 200res = test()print(res)while True: try: t = next(res) print(t) except Exception as e: print(e。value) break
send方法呼叫生成器
可以透過send給生成器一個新的資料
send不能放在第一個,需要先有一個next,然後才可以執行send方法。
或者可以用obj。send(None)放在第一句執行,接著也是可以用send的,不建議這樣使用。