Python :生成器(generator) 上


在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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM