Python可迭代對象、迭代器與生成器實現(xiàn)示例詳解
1. 可迭代對象:
1.1 基本概念:
可迭代對象是指可以通過for...in...這類循環(huán)語句遍歷讀取數(shù)據(jù)的對象。在Python中,可迭代對象是一個實現(xiàn)了__iter__()方法或__getitem__()方法的對象,它能夠返回一個迭代器。
1.2 遍歷(迭代)過程:
遍歷(迭代)是指程序依次從可迭代對象中把一個個元素取出來的過程。
這個過程通常包括以下步驟:
- 調(diào)用可迭代對象的
__iter__()方法獲取迭代器對象 - 重復(fù)調(diào)用迭代器的
__next__()方法獲取下一個元素 - 直到捕獲
StopIteration異常,表示迭代結(jié)束
person = {'name': 'Alice', 'age': 25, 'city': 'New York'}
for key in person:
print(f"Key: {key}, Value: {person[key]}")
1.3 自定義可迭代對象:
開發(fā)者也可以通過實現(xiàn)__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 注意:
- 可迭代對象不同于迭代器,前者可以多次遍歷,后者通常只能遍歷一次
- 某些可迭代對象(如生成器)是惰性求值的,只有在迭代時才會計算值
- 大型數(shù)據(jù)集使用可迭代對象可以節(jié)省內(nèi)存,因為不需要一次性加載所有數(shù)據(jù)
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)
文件讀取:逐行讀取文件內(nèi)容
with open('data.txt') as file:
for line in file:
print(line.strip())
數(shù)據(jù)處理:遍歷列表中的數(shù)據(jù)進(jìn)行計算或處理
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含義:
迭代器是一種設(shè)計模式,它提供了一個可以記住遍歷位置的對象。迭代器對象從集合的第一個元素開始訪問,通過調(diào)用__next__()方法逐個訪問元素,直到所有元素被訪問完畢。迭代器的特點是只能單向前進(jìn),不能后退或重置。
2.2基本特征:
- 訪問方式:通過調(diào)用next()方法逐個獲取元素
- 狀態(tài)保存:內(nèi)部會記錄當(dāng)前的迭代位置
- 單向性:只能向前移動,不能后退或重新開始
- 終止機制:遍歷完成后會拋出StopIteration異常
2.3 實現(xiàn)方式:
在Python中,迭代器需要實現(xiàn)兩個特殊方法:
- 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)點:
- 統(tǒng)一的訪問接口
- 支持惰性求值
- 節(jié)省內(nèi)存資源
- 適用于無限序列
2.5 注意事項:
- 迭代器是一次性的,遍歷完成后需要重新創(chuàng)建
- 不能隨機訪問元素
- 無法預(yù)知剩余元素數(shù)量
3. 生成器:
3.1概念與定義:
生成器(Generator)是一種特殊的迭代器,它允許你在需要時才生成值,而不是一次性生成所有值。這種特性使得生成器在處理大量數(shù)據(jù)或無限序列時特別高效。
3.2 基本語法:
在Python中,生成器可以通過兩種方式創(chuàng)建:
生成器函數(shù):使用yield關(guān)鍵字代替return的函數(shù)
def count_up_to(max):
count = 1
while count <= max:
yield count
count += 1
生成器表達(dá)式:類似列表推導(dǎo)式,但使用圓括號
squares = (x*x for x in range(10))
3.3 特點與優(yōu)勢:
- 內(nèi)存高效:只在需要時生成值,不占用大量內(nèi)存
- 惰性求值:按需計算,提高性能
- 無限序列:可以表示無限的數(shù)值序列
- 狀態(tài)保持:每次
yield后保持函數(shù)狀態(tài)
大數(shù)據(jù)處理:處理大型文件或數(shù)據(jù)集
def read_large_file(file_path):
with open(file_path) as f:
for line in f:
yield line
流處理:實時數(shù)據(jù)處理管道
數(shù)學(xué)序列:斐波那契數(shù)列等
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
協(xié)程:實現(xiàn)輕量級多任務(wù)處理
3.4 高級用法:
send()方法:向生成器發(fā)送數(shù)據(jù)
throw()方法:向生成器拋出異常
close()方法:終止生成器
協(xié)程裝飾器:簡化協(xié)程初始化
def accumulator():
total = 0
while True:
value = yield total
if value is None: break
total += value
3.5注意事項:
- 生成器只能迭代一次
- 不能隨機訪問或索引
- 生成器表達(dá)式會立即求值外層表達(dá)式
- 要考慮異常處理和資源清理
4. Python中的可迭代對象、迭代器和生成器關(guān)系:
4.1 可迭代對象(Iterable)
可迭代對象是指實現(xiàn)了Python迭代協(xié)議(即__iter__()方法)的對象,可以通過for..in..循環(huán)進(jìn)行遍歷。
常見的可迭代對象包括:
- 序列類型:
list,tuple,str,bytes,range - 映射類型:
dict - 集合類型:
set,frozenset - 文件對象:打開的文件對象
- 其他:迭代器對象、生成器對象
4.2 迭代器(Iterator)
迭代器是可迭代對象的子集,它除了實現(xiàn)__iter__()方法外,還必須實現(xiàn)__next__()方法。
迭代器的主要特點:
- 狀態(tài)記憶:能夠記住當(dāng)前的遍歷位置
- 單向性:只能向前移動,不能后退或重置
- 有限性:遍歷完畢后會拋出
StopIteration異常 - 惰性計算:每次只產(chǎn)生一個值,節(jié)省內(nèi)存
創(chuàng)建迭代器的方法:
# 通過iter()函數(shù)轉(zhuǎn)換可迭代對象 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)建生成器的方式:
生成器函數(shù):
使用yield關(guān)鍵字代替return的函數(shù):
def count_down(n):
while n > 0:
yield n
n -= 1
# 使用示例
for i in count_down(5):
print(i) # 輸出5,4,3,2,1
生成器表達(dá)式:
類似列表推導(dǎo)式的語法:
gen = (x**2 for x in range(5)) print(next(gen)) # 0 print(next(gen)) # 1
生成器的優(yōu)勢在于:
- 內(nèi)存高效:不需要一次性生成所有元素
- 延遲計算:只在需要時才計算值
- 無限序列:可以表示無限的數(shù)據(jù)流
判斷一個對象是否是可迭代對象可以使用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 三者的包含關(guān)系
可以用數(shù)學(xué)集合表示三者關(guān)系:可迭代對象 ⊃ 迭代器 ⊃ 生成器
4.5 總結(jié):
可迭代對象是最大的集合,包含所有可以迭代的對象
迭代器是特殊的可迭代對象,增加了狀態(tài)記憶能力
生成器是最特殊的迭代器,提供了更簡潔的實現(xiàn)方式
總結(jié)
到此這篇關(guān)于Python可迭代對象、迭代器與生成器的文章就介紹到這了,更多相關(guān)Python可迭代對象、迭代器與生成器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python bottle框架支持jquery ajax的RESTful風(fēng)格的PUT和DELETE方法
下面小編就為大家?guī)硪黄猵ython bottle框架支持jquery ajax的RESTful風(fēng)格的PUT和DELETE方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
Python unittest discover批量執(zhí)行代碼實例
這篇文章主要介紹了Python unittest discover批量執(zhí)行代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
python GUI庫圖形界面開發(fā)之PyQt5單選按鈕控件QRadioButton詳細(xì)使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5單選按鈕控件QRadioButton詳細(xì)使用方法與實例,需要的朋友可以參考下2020-02-02
淺談Python 多進(jìn)程默認(rèn)不能共享全局變量的問題
今天小編就為大家分享一篇淺談Python 多進(jìn)程默認(rèn)不能共享全局變量的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01

