Generator

產生器

Posted by 劉啟仲 on Friday, January 22, 2021

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