一. 什么是迭代
#迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。
每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。
while True: >> 这种重复执行同一个操作的形式,不叫迭代,
pass
count = 0
while count < 5: >>这种叫做迭代
count+=1
二. 什么是可迭代对象?什么是迭代器?两者有什么区别
#1.什么是可迭代对象
对象拥有内置方法__iter__的,是可迭代对象,即可使用obj.__iter__()方法的对象
字符串,列表,字典,文件对象都是可迭代对象
dir(obj)可以查看对象所拥有的方法
使用collections模块的Iterable方法 配合isinstance可以进行可迭代对象的类型检查
#什么是迭代器
可迭代对象调用__iter__()方法得到的结果就是迭代器。
迭代器对象指的是既有__iter__方法又有__next__方法的对象。
文件类型就是可迭代对象
open("tets.txt","r").__iter__()
open("text.txt","r").__next()
#迭代器一定是可迭代对象,而可迭代对象不一定是迭代器
迭代器拥有__next__方法,list是可迭代对象,而list就没有__next__就不是迭代器
三. 迭代器对象的使用
#迭代器可以使用__next__方法来获取迭代器中的值,每次调用一次就获取一个,如果迭代器中没有数据了,再次调用__next__就就抛出StopIteration的异常。
s = "python".__iter__()
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
#print(s.__next__()) 此时迭代器为空,在次调用__next__会抛出异常。
由于该方法会抛出异常,python就另寻他法,我们使用for循环要读取。
#基于for循环,我们可以完全不再依赖索引去取值了
dic={'a':1,'b':2,'c':3}
for k in dic:
print(dic[k])
#for循环的工作原理
#1:执行in后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic
#2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码
#3: 重复过程2,直到捕捉到异常StopIteration,结束循环
五. 迭代器的优缺点
#优点:
- 提供一种统一的、不依赖于索引的迭代方式
- 惰性计算,节省内存,在大文件操作时就体现出惰性计算的好处了
#缺点:
- 无法获取长度(只有在next完毕才知道到底有几个值)
- 一次性的,只能往后走,不能往前退