Python生成器(Generator)是一種特殊的可迭代對象,使用 yield
關鍵字逐個返回結果。與普通函數不同,生成器不會一次性返回所有結果,而是在需要時才逐個生成,這使得生成器在處理大量數據時非常高效。
生成器是一種可以「懶惰」生成值的函數,它的特點在於:
yield
關鍵字時,生成器函數會暫停並返回當前的值,並記住函數的執行狀態。下一次調用時,會從上次暫停的位置繼續執行。生成器是可迭代對象,這意味著你可以使用 for
循環來遍歷生成器。
def generator_function():
yield value
yield
:用來暫停函數的執行並返回當前的值。def simple_generator():
yield 1
yield 2
yield 3
# 使用生成器
gen = simple_generator()
# 逐個遍歷生成器的值
for value in gen:
print(value)
輸出:
1
2
3
生成器的最大優勢在於其「懶加載」特性,這使得它非常適合處理大量數據或需要持續產生數據的場景,而不會一次性佔用大量內存。
range()
函數實際上返回的是一個生成器,它按需生成數字。你也可以自己定義類似的生成器。
def my_range(start, end):
current = start
while current < end:
yield current
current += 1
# 使用生成器
for number in my_range(1, 5):
print(number)
輸出:
1
2
3
4
斐波那契數列是一個經典的例子,可以用生成器高效地生成。
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
# 生成前10個斐波那契數字
for number in fibonacci(10):
print(number)
輸出:
0
1
1
2
3
5
8
13
21
34
生成器還可以通過簡潔的生成器表達式創建,類似於列表推導式,但使用小括號來代替方括號,並且結果是生成器,而不是列表。
# 生成器表達式,生成平方數
squares = (x ** 2 for x in range(5))
# 遍歷生成器
for square in squares:
print(square)
輸出:
0
1
4
9
16
yield
和 yield from
除了 yield
,Python 3.3 引入了 yield from
,這個語法用來簡化從子生成器中獲取值的過程。
yield from
例子def sub_generator():
yield 1
yield 2
yield 3
def main_generator():
yield from sub_generator()
yield 4
yield 5
# 使用生成器
for value in main_generator():
print(value)
輸出:
1
2
3
4
5
yield from
可以讓生成器直接將另一個生成器的值進行委託,代替手動逐個 yield
子生成器的值。
for
循環、列表推導式等,無需一次性生成所有元素。yield
後會記住當前的狀態,並在下一次被調用時繼續執行。