python3 | 簡單地,認認真真地說生成器

生成器由來

迭代器可以透過每次迭代生成資料,是透過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]

at 0x000001B6F865F510>

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()來嘗試一下。

python3 | 簡單地,認認真真地說生成器

接下來我們演示一下生成器的執行。

next方法執行

python3 | 簡單地,認認真真地說生成器

前面演示的時候,我們看到了呼叫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

python3 | 簡單地,認認真真地說生成器

函式中有返回值的時候,怎麼辦呢?

#!/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

python3 | 簡單地,認認真真地說生成器

send方法呼叫生成器

可以透過send給生成器一個新的資料

send不能放在第一個,需要先有一個next,然後才可以執行send方法。

或者可以用obj。send(None)放在第一句執行,接著也是可以用send的,不建議這樣使用。

python3 | 簡單地,認認真真地說生成器