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