什么是迭代:
迭代:指的是一个重复的过程,每次重复称为一次迭代,并且每次重复的结果是下一次重复的初始值
为什么要有迭代器:
#对于序列类型:str,list,tuple,可以依赖索引来迭代取值 #但是对于dict,set,文件,python必须为我们提供一种不依赖于索引的迭代取值的方式=》迭代器
可迭代对象:(即内置有obj.__iter__()方法)
name="egon" l=[1,2,3] t=(1,2,3) d={"name":"egon","age":18,"sex":"male"} s={"a","b","c"} f=open("file.txt","r",encoding="utf-8") name.__iter__() #字符串类型为可迭代对象;也可以写成name_iter=iter(name) l.__iter__() #列表类型为可迭代对象 t.__iter__() #元组类型为可迭代对象 d.__iter__() #字典类型为可迭代对象 s.__iter__() #集合类型为可迭代对象 f.__iter__() #文件类型为可迭代对象
迭代器对象:(即内置既有obj.__iter__()方法也有obj.__next__()方法)
文件对象本身即内置既有obj.__iter__()方法也有obj.__next__()方法是迭代器对象
调用obj.__iter__()方法
name="egon" name_iter=name.__iter__() #调用obj.__iter__()方法可以使可迭代对象变成迭代器对象 name_iter.__iter__() name_iter.__next__()
总结:
1、可迭代对象不一定是迭代器对象 2、迭代器对象一定是可迭代对象 3、调用obj.__iter__()方法,得到的是迭代器对象(对于迭代器对象,执行obj.__iter__()方法得到的仍然是它本身)
迭代器优点:
#优点: 1、提供一种统一的,不依赖于索引的取值方式,为for循环的实现提供了依据 2、迭代器同一时间在内存中只有一个值,==》更节省内存空间 #缺点: 1、只能往后取,并且是一次性的 2、不能统计值的个数,即长度
示例:
d={"name":"egon","age":18,"sex":"male"} d_iter=d.__iter__() #也可以写成d_iter=iter(d) #迭代器d_iter没有值了,就会抛出异常StopIteration while True: try: data=d_iter.__next__(); #也可以写成data=next(d_iter) print(d[data]) except StopIteration: print("取值完毕") break
for循环原理
#for循环的工作原理:for循环可以称之为叫迭代器循环 d={'a':1,'b':2,'c':3} # 1、d.__iter__()得到一个迭代器对象 # 2、迭代器对象.__next__()拿到一个返回值,然后将该返回值赋值给k # 3、循环往复步骤2,直到抛出StopIteration异常for循环会捕捉异常然后结束循环 # for k in d: # print(k)