迭代器和可迭代对象
迭代不是简单的重复(简单的while循环并不是迭代),而是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值
可迭代对象(Iterable)
内置有__iter__方法的对象都是可迭代对象,字符串、列表、元组、字典、集合、打开的文件都是可迭代对象
print(dir({'name':'egon'}))
# dir()方法能够查看内置方法
迭代器(Iterator)
调用obj.iter()方法返回的结果就是一个迭代器对象(Iterator)。迭代器对象是内置有iter和next方法的对象,执行迭代器对象.iter()方法得到的仍然是迭代器本身,而执行迭代器.next()方法就会计算出迭代器中的下一个值
迭代器是Python提供的一种统一的、不依赖于索引的迭代取值方式,只要存在多个“值”,无论序列类型还是非序列类型都可以按照迭代器的方式取值
s={1,2} # 可迭代对象s
i=iter(s) # 本质就是在调用s.__iter__(),返回s的迭代器对象i
next(i) # 本质就是在调用i.__next__()
1
next(i)
2
next(i) # 返回StopIteration的异常,代表无值可取,迭代结束
for循环
# 前面讲过for循环,能够很方便的进行循环取值
dic1=['a','b','c','d','e']
for item in dic1:
print(item)
# 用while循环实现迭代效果
dic1=['a','b','c','d','e']
i=iter(dic1) # 每次都需要重新获取一个迭代器对象
while True:
try:
print(next(i))
except StopIteration: #捕捉异常终止循环
break
for 循环原理:会先调用可迭代对象dic1内置的iter方法拿到一个迭代器对象,然后再调用该迭代器对象的next方法将取到的值赋给item,执行循环体完成一次循环,直到捕捉StopIteration异常,结束迭代
迭代器与列表等容器类数据类型的比较
优点:
- 提供了一种统一的迭代取值方式
- 惰性计算:同一时刻在内存中只有一个值,可以只在需要时才去调用next来取值,理论上可以存放无穷大的数据,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存空间的限制
缺点:
- 除非取尽,否则无法获取迭代器的长度
- 只能向下取值,不能往回取,如果想要往回取值,只能重新创建迭代器