Python 生成器與迭代器的八個核心概念
生成器和迭代器是 Python 中非常重要的概念,它們可以幫助你更高效地處理數據。今天我們就來聊聊這 8 個核心概念,一步步帶你從基礎到高級。
1. 迭代器(Iterator)
概念:迭代器是一個可以記住遍歷位置的對象。它從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。
創建方式:
- 使用 iter() 函數將一個可迭代對象轉換為迭代器。
- 使用 next() 函數獲取迭代器的下一個元素。
示例:
# 創建一個列表
my_list = [1, 2, 3, 4, 5]
# 將列表轉換為迭代器
my_iterator = iter(my_list)
# 獲取迭代器的下一個元素
print(next(my_iterator)) # 輸出: 1
print(next(my_iterator)) # 輸出: 2
# 遍歷迭代器
for item in my_iterator:
print(item) # 輸出: 3, 4, 5
2. 可迭代對象(Iterable)
概念:可迭代對象是可以返回迭代器的任何對象。常見的可迭代對象包括列表、元組、字典、集合等。
示例:
# 列表是一個可迭代對象
my_list = [1, 2, 3, 4, 5]
# 使用 for 循環遍歷可迭代對象
for item in my_list:
print(item) # 輸出: 1, 2, 3, 4, 5
3. 生成器(Generator)
概念:生成器是一種特殊的迭代器,它使用 yield 關鍵字來生成值。生成器函數在每次調用時會暫停并保存當前狀態,下次調用時從上次暫停的地方繼續執行。
創建方式:
- 使用 yield 關鍵字定義生成器函數。
- 使用生成器表達式。
示例:
# 定義一個生成器函數
def simple_generator():
yield 1
yield 2
yield 3
# 調用生成器函數
gen = simple_generator()
# 獲取生成器的下一個元素
print(next(gen)) # 輸出: 1
print(next(gen)) # 輸出: 2
print(next(gen)) # 輸出: 3
# 使用生成器表達式
gen_expr = (x for x in range(5))
# 遍歷生成器表達式
for item in gen_expr:
print(item) # 輸出: 0, 1, 2, 3, 4
4. 生成器表達式(Generator Expression)
概念:生成器表達式類似于列表推導式,但返回的是一個生成器對象,而不是列表。生成器表達式更加節省內存。
示例:
# 列表推導式
list_comp = [x for x in range(10)]
print(list_comp) # 輸出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 生成器表達式
gen_expr = (x for x in range(10))
# 遍歷生成器表達式
for item in gen_expr:
print(item) # 輸出: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
5. send() 方法
概念:send() 方法可以向生成器發送一個值,并恢復生成器的執行。這個值會成為 yield 表達式的值。
示例:
def echo():
while True:
received = yield
print(f"Received: {received}")
# 創建生成器
gen = echo()
# 初始化生成器
next(gen)
# 發送值
gen.send("Hello") # 輸出: Received: Hello
gen.send("World") # 輸出: Received: World
6. throw() 和 close() 方法
概念:
- throw() 方法用于在生成器內部拋出一個異常。
- close() 方法用于關閉生成器。
示例:
def simple_generator():
try:
yield 1
yield 2
yield 3
except ValueError:
print("ValueError caught")
# 創建生成器
gen = simple_generator()
# 獲取生成器的下一個元素
print(next(gen)) # 輸出: 1
# 拋出異常
gen.throw(ValueError) # 輸出: ValueError caught
# 關閉生成器
gen.close()
7. 生成器委托(Generator Delegation)
概念:生成器委托允許一個生成器委托另一個生成器的執行。使用 yield from 語法可以實現這一點。
示例:
def sub_generator():
yield "Sub 1"
yield "Sub 2"
def main_generator():
yield "Main 1"
yield from sub_generator()
yield "Main 2"
# 創建主生成器
gen = main_generator()
# 遍歷主生成器
for item in gen:
print(item) # 輸出: Main 1, Sub 1, Sub 2, Main 2
8. 無限生成器
概念:無限生成器是指可以無限生成值的生成器。通常使用 while True 循環來實現。
示例:
def infinite_generator():
i = 0
while True:
yield i
i += 1
# 創建無限生成器
gen = infinite_generator()
# 獲取前 5 個生成的值
for _ in range(5):
print(next(gen)) # 輸出: 0, 1, 2, 3, 4
實戰案例:生成斐波那契數列
問題描述:斐波那契數列是一個經典的數列,每個數是前兩個數的和。我們可以使用生成器來生成斐波那契數列。
實現代碼:
def fibonacci(n):
a, b = 0, 1
count = 0
while count < n:
yield a
a, b = b, a + b
count += 1
# 生成前 10 個斐波那契數
fib_gen = fibonacci(10)
# 打印生成的斐波那契數
for num in fib_gen:
print(num) # 輸出: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
總結
本文介紹了 Python 中生成器和迭代器的 8 個核心概念,包括迭代器、可迭代對象、生成器、生成器表達式、send() 方法、throw() 和 close() 方法、生成器委托以及無限生成器。通過具體的代碼示例,我們逐步展示了每個概念的應用方法。