在Python當中嗎,生成器是一種比較特殊的數據結構,也是十分常見的數據結構,它和列表推倒式的書寫方法一致,只是最外面的列表中括號被替換成了括號。凡是最外面是括號的推倒式則是生成器,在生成器當中我們不能夠像列表一樣通過索引得到一個元素的信息,而是需要調用__next__()方法或者next()方法才能得到生成器元素當中的信息。下面是一個簡單的列表推倒式,我們和生成器對比對比:
list = [x*3 for x in range(10)] print("列表推倒式得到的結果是:") print(list) print()
輸出:
列表推倒式得到的結果是:
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
然后下面是生成器的代碼:
generator = (x*3 for x in range(10)) print(type(generator))# 生成器的type print(generator)# 直接打印生成器,不能像列表一樣直接得到列表的結果
得到:
<class 'generator'> <generator object <genexpr> at 0x000001A0073E04C8>
調用生成器當中的方法,實現提提取生成器當中的信息:
# 方法一:調用__next__()方法打印出生成器當中的信息 print(generator.__next__()) print(generator.__next__()) print(generator.__next__()) print(generator.__next__()) # 方法二: 調用next()方法打印出生成器當和中的信息 print(next(generator)) print(next(generator)) print(next(generator)) print(next(generator)) print(next(generator)) print(next(generator)) print(next(generator))# 調用這個方法之后將會超出生成器的范圍,因此報錯,我們需要用新的方法來接受報錯
得到:
0 3 6 9 12 15 18 21 24 27 Traceback (most recent call last): File "C:/Users/lenovo/Desktop/V1.1/scaffold/queue.py", line 24, in <module> print(next(generator))# 調用這個方法之后將會超出生成器的范圍,因此報錯,我們需要用新的方法來接受報錯 StopIteration
因為調用最后一個next方法的時候,已經超出了生成器的范圍,因此我們利用異常處理來處理這個錯誤:
generator = (x*3 for x in range(10)) print(type(generator))# 生成器的type print(generator)# 直接打印生成器,不能像列表一樣直接得到列表的結果 while True: try: print(generator.__next__()) except: print("您的生成器生成數字完畢了!") break
得到結果:
<class 'generator'> <generator object <genexpr> at 0x000002A327E004C8> 0 3 6 9 12 15 18 21 24 27 您的生成器生成數字完畢了! Process finished with exit code 0