在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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/147669.html
標籤:Python
