迭代是一個(gè)重復(fù)的過程厨诸,每一次重復(fù)飒赃,都是基于上一次的結(jié)果而來。
迭代器的作用:主要用于去除序列類型中的值
可迭代對(duì)象:凡是對(duì)象有iter方法: 對(duì)象.iter聪全,該對(duì)象就是可以迭代對(duì)象泊藕。包括字典,集合等。
使用iter方法后恨溜,可迭代對(duì)象就成為一個(gè)迭代器對(duì)象仪糖。使用迭代器對(duì)象對(duì)無序列的元素取值:
l={'ad':1,'b':2}
i=iter(l)
print(next(i))
print(next(i))
s={1,2,3,4}
i=iter(s)
print(next(i))
print(next(i))
print(next(i))
print(next(i))
使用迭代對(duì)象不僅能對(duì)非序列元素進(jìn)行操作,也可以對(duì)序列元素如字符串踊餐,列表元組等進(jìn)行操作。
迭代器的特點(diǎn)
- 可迭代對(duì)象通過iter可以得到迭代器對(duì)象臀稚。
- 迭代器對(duì)象由iter方法吝岭,執(zhí)行得到的仍然是迭代器本身。
- 可迭代對(duì)象有iter方法。
- 迭代器對(duì)象有iter方法窜管,還有next方法散劫。
- 迭代器對(duì)象使用next,可以得到下一個(gè)值
- 文件是迭代器對(duì)象,字符串,列表幕帆,元組获搏,字典,集合都是可迭代對(duì)象失乾。
from collections import Iterable,Iterator
s='python'
l=['a','b','c']
t=('a','b','c')
dic={'a':1,'b':2}
set1={1,2,3,4}
f=open('a.txt')
print(isinstance(s,Iterable))
print(isinstance(l,Iterable))
print(isinstance(t,Iterable))
print(isinstance(dic,Iterable))
print(isinstance(set1,Iterable))
print(isinstance(f,Iterable))
輸出結(jié)果: 文件常熙,字符串,列表,元組碱茁,字典裸卫,集合都是可迭代對(duì)象。
True
True
True
True
True
True
迭代器對(duì)象:
from collections import Iterable,Iterator
s='python'
l=['a','b','c']
t=('a','b','c')
dic={'a':1,'b':2}
set1={1,2,3,4}
f=open('a.txt')
print(isinstance(s,Iterator))
print(isinstance(l,Iterator))
print(isinstance(t,Iterator))
print(isinstance(dic,Iterator))
print(isinstance(set1,Iterator))
print(isinstance(f,Iterator))
輸出結(jié)果: 文件是迭代器對(duì)象纽竣,其他的都是可迭代對(duì)象墓贿。
False
False
False
False
False
True
迭代器對(duì)象的優(yōu)點(diǎn)
- 迭代器提供了一種統(tǒng)一的(不依賴于索引的)迭代方式
- 迭代器本身,比其他的數(shù)據(jù)類型更省內(nèi)存
- 文件也是一個(gè)迭代器對(duì)象
迭代器的缺點(diǎn)
- 一次性蜓氨,只能往后走聋袋,不能回退,不如索引取值靈活穴吹。
- 無法預(yù)知什么時(shí)候取值結(jié)束幽勒,既無法預(yù)知長(zhǎng)度。
for 循環(huán)的原理
for 循環(huán)就是利用的迭代器的原理刀荒,對(duì)傳入的可迭代對(duì)象使用__iter__
方法代嗤,然后再對(duì)生成的迭代器對(duì)象執(zhí)行__next__
方法。如對(duì)文件的操作:
with open('a.txt','r',encoding='utf-8') as f:
for line in f:
print(line)
代碼等同于:
with open('a.txt','r',encoding='utf-8') as f:
f1=f.__iter__()
try: # 執(zhí)行多個(gè)next,使用異常捕獲
f2=f1.__next__()
print(f2)
except Exception as err:
exit(0)
try:
f2=f1.__next__()
print(f2)
except Exception as err:
exit(0)
try:
f2=f1.__next__()
print(f2)
except Exception as err:
exit(0)
...