迭代是一个重复的过程,每一次重复,都是基于上一次的结果而来。
迭代器的作用:主要用于去除序列类型中的值
可迭代对象:凡是对象有iter方法: 对象.iter,该对象就是可以迭代对象。包括字典,集合等。
使用iter方法后,可迭代对象就成为一个迭代器对象。使用迭代器对象对无序列的元素取值:
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))
使用迭代对象不仅能对非序列元素进行操作,也可以对序列元素如字符串,列表元组等进行操作。
迭代器的特点
- 可迭代对象通过iter可以得到迭代器对象。
- 迭代器对象由iter方法,执行得到的仍然是迭代器本身。
- 可迭代对象有iter方法。
- 迭代器对象有iter方法,还有next方法。
- 迭代器对象使用next,可以得到下一个值
- 文件是迭代器对象,字符串,列表,元组,字典,集合都是可迭代对象。
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))
输出结果: 文件,字符串,列表,元组,字典,集合都是可迭代对象。
True
True
True
True
True
True
迭代器对象:
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))
输出结果: 文件是迭代器对象,其他的都是可迭代对象。
False
False
False
False
False
True
迭代器对象的优点
- 迭代器提供了一种统一的(不依赖于索引的)迭代方式
- 迭代器本身,比其他的数据类型更省内存
- 文件也是一个迭代器对象
迭代器的缺点
- 一次性,只能往后走,不能回退,不如索引取值灵活。
- 无法预知什么时候取值结束,既无法预知长度。
for 循环的原理
for 循环就是利用的迭代器的原理,对传入的可迭代对象使用__iter__
方法,然后再对生成的迭代器对象执行__next__
方法。如对文件的操作:
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: # 执行多个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)
...
网友评论