Python可迭代對(duì)象、迭代器與生成器實(shí)現(xiàn)示例詳解
1. 可迭代對(duì)象:
1.1 基本概念:
可迭代對(duì)象是指可以通過for...in...這類循環(huán)語句遍歷讀取數(shù)據(jù)的對(duì)象。在Python中,可迭代對(duì)象是一個(gè)實(shí)現(xiàn)了__iter__()方法或__getitem__()方法的對(duì)象,它能夠返回一個(gè)迭代器。
1.2 遍歷(迭代)過程:
遍歷(迭代)是指程序依次從可迭代對(duì)象中把一個(gè)個(gè)元素取出來的過程。
這個(gè)過程通常包括以下步驟:
- 調(diào)用可迭代對(duì)象的
__iter__()方法獲取迭代器對(duì)象 - 重復(fù)調(diào)用迭代器的
__next__()方法獲取下一個(gè)元素 - 直到捕獲
StopIteration異常,表示迭代結(jié)束
person = {'name': 'Alice', 'age': 25, 'city': 'New York'}
for key in person:
print(f"Key: {key}, Value: {person[key]}")
1.3 自定義可迭代對(duì)象:
開發(fā)者也可以通過實(shí)現(xiàn)__iter__()方法來創(chuàng)建自定義的可迭代對(duì)象:
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 注意:
- 可迭代對(duì)象不同于迭代器,前者可以多次遍歷,后者通常只能遍歷一次
- 某些可迭代對(duì)象(如生成器)是惰性求值的,只有在迭代時(shí)才會(huì)計(jì)算值
- 大型數(shù)據(jù)集使用可迭代對(duì)象可以節(jié)省內(nèi)存,因?yàn)椴恍枰淮涡约虞d所有數(shù)據(jù)
with open('data.txt') as file:
for line in file:
print(line.strip())
字典操作:遍歷字典的鍵、值或鍵值對(duì)
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)行計(jì)算或處理
person = {'name': 'Alice', 'age': 25, 'city': 'New York'}
for key in person:
print(f"Key: {key}, Value: {person[key]}")
1.6 Python中的常見可迭代對(duì)象包括:
- 序列類型:列表(list)、元組(tuple)、字符串(str)
- 非序列類型:字典(dict)、集合(set)、文件對(duì)象
- 生成器(generator)和生成器
2. 迭代器:
2.1含義:
迭代器是一種設(shè)計(jì)模式,它提供了一個(gè)可以記住遍歷位置的對(duì)象。迭代器對(duì)象從集合的第一個(gè)元素開始訪問,通過調(diào)用__next__()方法逐個(gè)訪問元素,直到所有元素被訪問完畢。迭代器的特點(diǎn)是只能單向前進(jìn),不能后退或重置。
2.2基本特征:
- 訪問方式:通過調(diào)用next()方法逐個(gè)獲取元素
- 狀態(tài)保存:內(nèi)部會(huì)記錄當(dāng)前的迭代位置
- 單向性:只能向前移動(dòng),不能后退或重新開始
- 終止機(jī)制:遍歷完成后會(huì)拋出StopIteration異常
2.3 實(shí)現(xiàn)方式:
在Python中,迭代器需要實(shí)現(xiàn)兩個(gè)特殊方法:
- iter(): 返回迭代器對(duì)象本身
- next(): 返回下一個(gè)元素
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)點(diǎn):
- 統(tǒng)一的訪問接口
- 支持惰性求值
- 節(jié)省內(nèi)存資源
- 適用于無限序列
2.5 注意事項(xiàng):
- 迭代器是一次性的,遍歷完成后需要重新創(chuàng)建
- 不能隨機(jī)訪問元素
- 無法預(yù)知剩余元素?cái)?shù)量
3. 生成器:
3.1概念與定義:
生成器(Generator)是一種特殊的迭代器,它允許你在需要時(shí)才生成值,而不是一次性生成所有值。這種特性使得生成器在處理大量數(shù)據(jù)或無限序列時(shí)特別高效。
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)式,但使用圓括號(hào)
squares = (x*x for x in range(10))
3.3 特點(diǎn)與優(yōu)勢(shì):
- 內(nèi)存高效:只在需要時(shí)生成值,不占用大量?jī)?nèi)存
- 惰性求值:按需計(jì)算,提高性能
- 無限序列:可以表示無限的數(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í)時(shí)數(shù)據(jù)處理管道
數(shù)學(xué)序列:斐波那契數(shù)列等
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
協(xié)程:實(shí)現(xiàn)輕量級(jí)多任務(wù)處理
3.4 高級(jí)用法:
send()方法:向生成器發(fā)送數(shù)據(jù)
throw()方法:向生成器拋出異常
close()方法:終止生成器
協(xié)程裝飾器:簡(jiǎn)化協(xié)程初始化
def accumulator():
total = 0
while True:
value = yield total
if value is None: break
total += value
3.5注意事項(xiàng):
- 生成器只能迭代一次
- 不能隨機(jī)訪問或索引
- 生成器表達(dá)式會(huì)立即求值外層表達(dá)式
- 要考慮異常處理和資源清理
4. Python中的可迭代對(duì)象、迭代器和生成器關(guān)系:
4.1 可迭代對(duì)象(Iterable)
可迭代對(duì)象是指實(shí)現(xiàn)了Python迭代協(xié)議(即__iter__()方法)的對(duì)象,可以通過for..in..循環(huán)進(jìn)行遍歷。
常見的可迭代對(duì)象包括:
- 序列類型:
list,tuple,str,bytes,range - 映射類型:
dict - 集合類型:
set,frozenset - 文件對(duì)象:打開的文件對(duì)象
- 其他:迭代器對(duì)象、生成器對(duì)象
4.2 迭代器(Iterator)
迭代器是可迭代對(duì)象的子集,它除了實(shí)現(xiàn)__iter__()方法外,還必須實(shí)現(xiàn)__next__()方法。
迭代器的主要特點(diǎn):
- 狀態(tài)記憶:能夠記住當(dāng)前的遍歷位置
- 單向性:只能向前移動(dòng),不能后退或重置
- 有限性:遍歷完畢后會(huì)拋出
StopIteration異常 - 惰性計(jì)算:每次只產(chǎn)生一個(gè)值,節(jié)省內(nèi)存
創(chuàng)建迭代器的方法:
# 通過iter()函數(shù)轉(zhuǎn)換可迭代對(duì)象 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)勢(shì)在于:
- 內(nèi)存高效:不需要一次性生成所有元素
- 延遲計(jì)算:只在需要時(shí)才計(jì)算值
- 無限序列:可以表示無限的數(shù)據(jù)流
判斷一個(gè)對(duì)象是否是可迭代對(duì)象可以使用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)系:可迭代對(duì)象 ⊃ 迭代器 ⊃ 生成器
4.5 總結(jié):
可迭代對(duì)象是最大的集合,包含所有可以迭代的對(duì)象
迭代器是特殊的可迭代對(duì)象,增加了狀態(tài)記憶能力
生成器是最特殊的迭代器,提供了更簡(jiǎn)潔的實(shí)現(xiàn)方式
總結(jié)
到此這篇關(guān)于Python可迭代對(duì)象、迭代器與生成器的文章就介紹到這了,更多相關(guān)Python可迭代對(duì)象、迭代器與生成器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3 pandas 讀取MySQL數(shù)據(jù)和插入的實(shí)例
下面小編就為大家分享一篇python3 pandas 讀取MySQL數(shù)據(jù)和插入的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04
CentOS系統(tǒng)下Miniconda3安裝與Python項(xiàng)目后臺(tái)運(yùn)行全攻略
Miniconda是一個(gè)輕量級(jí)的Anaconda發(fā)行版,它只包含了conda、Python以及一些必要的依賴包,本文將詳細(xì)介紹如何在CentOS系統(tǒng)上安裝Miniconda3,并將Python項(xiàng)目部署到后臺(tái)運(yùn)行2025-06-06
Django web自定義通用權(quán)限控制實(shí)現(xiàn)方法
這篇文章主要介紹了Django web自定義通用權(quán)限控制實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Django使用redis緩存服務(wù)器的實(shí)現(xiàn)代碼示例
這篇文章主要介紹了Django使用redis緩存服務(wù)器的實(shí)現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Python通過OpenCV的findContours獲取輪廓并切割實(shí)例
這篇文章主要介紹了Python通過OpenCV的findContours獲取輪廓并切割實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Python使用Mammoth將DOCX轉(zhuǎn)換為HTML
這篇文章主要介紹了如何使用Python的Mammoth庫將DOCX文件轉(zhuǎn)換為HTML,包括安裝Mammoth、提取文本、自定義樣式映射、處理圖像以及使用命令行工具進(jìn)行轉(zhuǎn)換,需要的朋友可以參考下2026-01-01
python 函數(shù)內(nèi)部修改外部變量的方法
今天小編就為大家分享一篇python 函數(shù)內(nèi)部修改外部變量的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12
Python?+?Selenium?實(shí)現(xiàn)模擬登錄jd實(shí)例分享
這篇文章主要介紹了Python?+?Selenium?實(shí)現(xiàn)模擬登錄jd實(shí)例分享的相關(guān)資料,需要的朋友可以參考下2023-06-06
python實(shí)現(xiàn)ipsec開權(quán)限實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)ipsec開權(quán)限的方法,彌補(bǔ)了windows自帶的命令行工具netsh ipsec static add filter不支持批量添加及添加重復(fù)規(guī)則的不足,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11
Python使用uuid庫生成唯一標(biāo)識(shí)ID
這篇文章主要介紹了Python使用uuid模塊生成唯一標(biāo)識(shí)ID,需要的朋友可以參考下2020-02-02

