Generator
在python時常混用外,官方文件也都將Iterator與Generator視為同義詞
def generator_numbers():
while True:
yield 1
print(next(generator_numbers())) # 1
print(next(generator_numbers())) # 1
print(next(generator_numbers())) # 1
核心在 yield 這個關鍵字上。
Generator回傳Iterator,所以Generator其實就是在打造Iterator
def my_numbers(n):
i = 0
while i < n:
print(f'產生{i}')
yield i
i += 1
for i in my_numbers(5)
print(i)
# 產生0
# 0
# 產生1
# 1
# 產生2
# 2
# 產生3
# 3
# 產生4
# 4
每次碰到yield就會給出值給你。這樣的寫法跟先定義一個list後再去做迴圈,最大的好處是,用list的話會需要將東西先塞入記憶體中,要是要執行的資料很大,對記憶體會有大量消耗,Generator則是有需要再產生,用完就沒了。記憶體比較省。
但是因為他是Iterator,所以要注意耗盡的問題。
Generator Expression
x = [0, 1, 2]
# list comprehension
print([i*i for i in x])
# 0
# 1
# 4
# Generator Expression
it = (i*i for i in x)
print(next(it)) # 0
print(next(it)) # 1
print(next(it)) # 4
it1 = (i*i for i in x)
it2 = (i+2 for i in it1)
print(next(it2)) # 2
print(next(it2)) # 3
print(next(it2)) # 6