Python可迭代對象、迭代器與生成器實現示例詳解
1. 可迭代對象:
1.1 基本概念:
可迭代對象是指可以通過for...in...這類循環(huán)語句遍歷讀取數據的對象。在Python中,可迭代對象是一個實現了__iter__()方法或__getitem__()方法的對象,它能夠返回一個迭代器。
1.2 遍歷(迭代)過程:
遍歷(迭代)是指程序依次從可迭代對象中把一個個元素取出來的過程。
這個過程通常包括以下步驟:
- 調用可迭代對象的
__iter__()方法獲取迭代器對象 - 重復調用迭代器的
__next__()方法獲取下一個元素 - 直到捕獲
StopIteration異常,表示迭代結束
person = {'name': 'Alice', 'age': 25, 'city': 'New York'}
for key in person:
print(f"Key: {key}, Value: {person[key]}")
1.3 自定義可迭代對象:
開發(fā)者也可以通過實現__iter__()方法來創(chuàng)建自定義的可迭代對象:
class CountDown:
def __init__(self, start):
self.start = start
def __iter__(self):
current = self.start
while current > 0:
yield current
current -= 1
for num in CountDown(5):
print(num)
1.4 注意:
- 可迭代對象不同于迭代器,前者可以多次遍歷,后者通常只能遍歷一次
- 某些可迭代對象(如生成器)是惰性求值的,只有在迭代時才會計算值
- 大型數據集使用可迭代對象可以節(jié)省內存,因為不需要一次性加載所有數據
with open('data.txt') as file:
for line in file:
print(line.strip())
字典操作:遍歷字典的鍵、值或鍵值對
numbers = [1, 2, 3, 4, 5]
for num in numbers:
print(num * 2)
文件讀取:逐行讀取文件內容
with open('data.txt') as file:
for line in file:
print(line.strip())
數據處理:遍歷列表中的數據進行計算或處理
person = {'name': 'Alice', 'age': 25, 'city': 'New York'}
for key in person:
print(f"Key: {key}, Value: {person[key]}")
1.6 Python中的常見可迭代對象包括:
- 序列類型:列表(list)、元組(tuple)、字符串(str)
- 非序列類型:字典(dict)、集合(set)、文件對象
- 生成器(generator)和生成器
2. 迭代器:
2.1含義:
迭代器是一種設計模式,它提供了一個可以記住遍歷位置的對象。迭代器對象從集合的第一個元素開始訪問,通過調用__next__()方法逐個訪問元素,直到所有元素被訪問完畢。迭代器的特點是只能單向前進,不能后退或重置。
2.2基本特征:
- 訪問方式:通過調用next()方法逐個獲取元素
- 狀態(tài)保存:內部會記錄當前的迭代位置
- 單向性:只能向前移動,不能后退或重新開始
- 終止機制:遍歷完成后會拋出StopIteration異常
2.3 實現方式:
在Python中,迭代器需要實現兩個特殊方法:
- iter(): 返回迭代器對象本身
- next(): 返回下一個元素
2.4 示例:
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
value = self.data[self.index]
self.index += 1
return value
# 使用示例
my_iter = MyIterator([1, 2, 3])
for item in my_iter:
print(item) # 輸出:1 2 3
優(yōu)點:
- 統一的訪問接口
- 支持惰性求值
- 節(jié)省內存資源
- 適用于無限序列
2.5 注意事項:
- 迭代器是一次性的,遍歷完成后需要重新創(chuàng)建
- 不能隨機訪問元素
- 無法預知剩余元素數量
3. 生成器:
3.1概念與定義:
生成器(Generator)是一種特殊的迭代器,它允許你在需要時才生成值,而不是一次性生成所有值。這種特性使得生成器在處理大量數據或無限序列時特別高效。
3.2 基本語法:
在Python中,生成器可以通過兩種方式創(chuàng)建:
生成器函數:使用yield關鍵字代替return的函數
def count_up_to(max):
count = 1
while count <= max:
yield count
count += 1
生成器表達式:類似列表推導式,但使用圓括號
squares = (x*x for x in range(10))
3.3 特點與優(yōu)勢:
- 內存高效:只在需要時生成值,不占用大量內存
- 惰性求值:按需計算,提高性能
- 無限序列:可以表示無限的數值序列
- 狀態(tài)保持:每次
yield后保持函數狀態(tài)
大數據處理:處理大型文件或數據集
def read_large_file(file_path):
with open(file_path) as f:
for line in f:
yield line
流處理:實時數據處理管道
數學序列:斐波那契數列等
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
協程:實現輕量級多任務處理
3.4 高級用法:
send()方法:向生成器發(fā)送數據
throw()方法:向生成器拋出異常
close()方法:終止生成器
協程裝飾器:簡化協程初始化
def accumulator():
total = 0
while True:
value = yield total
if value is None: break
total += value
3.5注意事項:
- 生成器只能迭代一次
- 不能隨機訪問或索引
- 生成器表達式會立即求值外層表達式
- 要考慮異常處理和資源清理
4. Python中的可迭代對象、迭代器和生成器關系:
4.1 可迭代對象(Iterable)
可迭代對象是指實現了Python迭代協議(即__iter__()方法)的對象,可以通過for..in..循環(huán)進行遍歷。
常見的可迭代對象包括:
- 序列類型:
list,tuple,str,bytes,range - 映射類型:
dict - 集合類型:
set,frozenset - 文件對象:打開的文件對象
- 其他:迭代器對象、生成器對象
4.2 迭代器(Iterator)
迭代器是可迭代對象的子集,它除了實現__iter__()方法外,還必須實現__next__()方法。
迭代器的主要特點:
- 狀態(tài)記憶:能夠記住當前的遍歷位置
- 單向性:只能向前移動,不能后退或重置
- 有限性:遍歷完畢后會拋出
StopIteration異常 - 惰性計算:每次只產生一個值,節(jié)省內存
創(chuàng)建迭代器的方法:
# 通過iter()函數轉換可迭代對象 my_list = [1, 2, 3] iter_obj = iter(my_list) print(next(iter_obj)) # 1 print(next(iter_obj)) # 2 print(next(iter_obj)) # 3 print(next(iter_obj)) # 拋出StopIteration
4.3 生成器(Generator)
生成器是特殊的迭代器,Python提供兩種創(chuàng)建生成器的方式:
生成器函數:
使用yield關鍵字代替return的函數:
def count_down(n):
while n > 0:
yield n
n -= 1
# 使用示例
for i in count_down(5):
print(i) # 輸出5,4,3,2,1
生成器表達式:
類似列表推導式的語法:
gen = (x**2 for x in range(5)) print(next(gen)) # 0 print(next(gen)) # 1
生成器的優(yōu)勢在于:
- 內存高效:不需要一次性生成所有元素
- 延遲計算:只在需要時才計算值
- 無限序列:可以表示無限的數據流
判斷一個對象是否是可迭代對象可以使用isinstance(obj, Iterable)方法:
from collections.abc import Iterable
print(isinstance([1,2,3], Iterable)) # True
print(isinstance("hello", Iterable)) # True
print(isinstance(123, Iterable)) # False
4.4 三者的包含關系
可以用數學集合表示三者關系:可迭代對象 ⊃ 迭代器 ⊃ 生成器
4.5 總結:
可迭代對象是最大的集合,包含所有可以迭代的對象
迭代器是特殊的可迭代對象,增加了狀態(tài)記憶能力
生成器是最特殊的迭代器,提供了更簡潔的實現方式
總結
到此這篇關于Python可迭代對象、迭代器與生成器的文章就介紹到這了,更多相關Python可迭代對象、迭代器與生成器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python3 pandas 讀取MySQL數據和插入的實例
下面小編就為大家分享一篇python3 pandas 讀取MySQL數據和插入的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
CentOS系統下Miniconda3安裝與Python項目后臺運行全攻略
Miniconda是一個輕量級的Anaconda發(fā)行版,它只包含了conda、Python以及一些必要的依賴包,本文將詳細介紹如何在CentOS系統上安裝Miniconda3,并將Python項目部署到后臺運行2025-06-06
Python通過OpenCV的findContours獲取輪廓并切割實例
這篇文章主要介紹了Python通過OpenCV的findContours獲取輪廓并切割實例,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
Python?+?Selenium?實現模擬登錄jd實例分享
這篇文章主要介紹了Python?+?Selenium?實現模擬登錄jd實例分享的相關資料,需要的朋友可以參考下2023-06-06

