iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0

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

參、yieldyield 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 後會記住當前的狀態,並在下一次被調用時繼續執行。

上一篇
第21天:Map和Filter
下一篇
第23天:正則表達式 part 1
系列文
python30天入門學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言