文章目錄
- 一、`for` 循環的底層機制
- 示例:手動模擬 `for` 循環
- 二、可迭代對象 vs 迭代器
- 關鍵區別:
- 三、`for` 循環的典型應用場景
- 1. 遍歷序列類型
- 2. 遍歷字典
- 3. 結合 `range()` 生成數字序列
- 4. 遍歷文件內容
- 四、迭代器的自定義實現
- 示例:生成斐波那契數列的迭代器
- 五、生成器(簡化迭代器)
- 示例:生成偶數序列
- 六、迭代工具庫 `itertools`
- 示例:合并多個迭代器
- 七、常見問題與最佳實踐🐥🐥
- 1. 避免在迭代中修改集合
- 2. 使用 `enumerate()` 獲取索引
- 3. 利用 `zip()` 并行遍歷
- 總結
在 Python 中,
for
循環與迭代器(iterator)緊密結合,它們共同實現了對可迭代對象(iterable)的高效遍歷。以下是詳細解析及實際應用示例:
一、for
循環的底層機制
for
循環本質上是通過迭代器協議工作的:
- 自動調用
iter()
函數,將可迭代對象(如列表、字符串、字典)轉換為迭代器。 - 反復調用
next()
函數獲取元素,直到觸發StopIteration
異常時退出循環。
示例:手動模擬 for
循環
numbers = [1, 2, 3]
iterator = iter(numbers) # 轉換為迭代器
while True:try:num = next(iterator) # 獲取下一個元素print(num)except StopIteration: # 遍歷完成break
# 輸出:1 2 3
二、可迭代對象 vs 迭代器
類別 | 定義 | 示例 |
---|---|---|
可迭代對象 | 實現了 __iter__() 方法的對象 | list , str , dict |
迭代器 | 實現了 __iter__() 和 __next__() 方法的對象 | iterator = iter([1,2,3]) |
關鍵區別:
- 可迭代對象:可被多次遍歷(每次
for
循環會創建新迭代器)。 - 迭代器:遍歷一次后耗盡(無法重置,再次調用
next()
會觸發異常)。
三、for
循環的典型應用場景
1. 遍歷序列類型
# 遍歷列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:print(fruit)# 遍歷字符串
text = "Hello"
for char in text:print(char)
2. 遍歷字典
person = {"name": "Alice", "age": 30, "city": "Paris"}
for key in person: # 默認遍歷鍵print(key)for key, value in person.items(): # 同時遍歷鍵值對print(f"{key}: {value}")
3. 結合 range()
生成數字序列
for i in range(3): # 0, 1, 2print(i)for i in range(1, 5, 2): # 1, 3print(i)
注意:range()作為Python中的一個內置函數,調用會產生一個迭代序列。
如果range()產生的序列為空,那么用該迭代器控制for循環的時候,
其循環體將一次也不執行,循環立刻結束。
4. 遍歷文件內容
with open("data.txt", "r") as file:for line in file: # 逐行讀取文件print(line.strip())
四、迭代器的自定義實現
通過實現 __iter__()
和 __next__()
方法創建自定義迭代器。
示例:生成斐波那契數列的迭代器
class FibonacciIterator:def __init__(self, max_count):self.max_count = max_countself.count = 0self.a, self.b = 0, 1def __iter__(self):return selfdef __next__(self):if self.count >= self.max_count:raise StopIterationresult = self.aself.a, self.b = self.b, self.a + self.bself.count += 1return result# 使用迭代器
fib = FibonacciIterator(5)
for num in fib:print(num) # 輸出:0 1 1 2 3
五、生成器(簡化迭代器)
使用 yield
關鍵字快速創建迭代器,無需手動實現類。
示例:生成偶數序列
def even_numbers(max_num):num = 0while num <= max_num:yield numnum += 2for n in even_numbers(10):print(n) # 輸出:0 2 4 6 8 10
六、迭代工具庫 itertools
Python 內置的 itertools
模塊提供多種高級迭代器操作:
示例:合并多個迭代器
import itertools #不要忘了!!!numbers = [1, 2]
letters = ['a', 'b']# 笛卡爾積
for pair in itertools.product(numbers, letters):print(pair) # (1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')# 無限計數器
counter = itertools.count(start=10, step=3)
print(next(counter)) # 10
print(next(counter)) # 13
print(next(counter)) # 16
print(next(counter)) # 19
七、常見問題與最佳實踐🐥🐥
1. 避免在迭代中修改集合
# 錯誤示例:遍歷時刪除元素會導致意外跳過
numbers = [1, 2, 3, 4]
for num in numbers:if num % 2 == 0:numbers.remove(num) # 危險操作!
print(numbers) # 輸出 [1, 3]# 正確方法:遍歷副本或使用列表推導式
numbers = [num for num in numbers if num % 2 != 0]
2. 使用 enumerate()
獲取索引
fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits, start=1): # 索引從1開始print(f"{index}. {fruit}")
輸出:
1. apple
2. banana
3. cherry
3. 利用 zip()
并行遍歷
names = ["Alice", "Bob"]
ages = [24, 30]
for name, age in zip(names, ages):print(f"{name} is {age} years old")
輸出:
Alice is 24 years old
Bob is 30 years old
總結
for
循環本質:基于迭代器協議,自動處理iter()
和next()
。- 迭代器優勢:惰性計算(節省內存),適合處理大型數據集。
- 生成器簡化:使用
yield
快速創建迭代器。 - 工具擴展:利用
itertools
模塊實現復雜迭代邏輯。
掌握迭代器機制,可以編寫更高效、靈活的 Python 代碼!
喵,就是這樣~😼😼😼