什么是迭代器
什么是迭代:迭代就是一个重复的过程,但是每一次重复都是基于上一次的结果而进行的
迭代器就是用来迭代取值的工具
迭代器的优点:
1、提供了一种可以不依赖索引的迭代取值方式
2、迭代器就是一个功能,对于内存只占自身代码需要的内存空间,几乎不占用内存空间
迭代器的缺点:
1、迭代器是一次性的,只能往后一直取,无法在最开始的时候预知迭代器中的值包含的格式
2、无法取到指定的值,不如按照索引取值或者key的取值方式灵活
单纯的重复不是迭代
while True:
print(1)
PS:这个不是迭代,只满足了迭代的一个特点就是重复,每一次的循环都是新的开始,和上一次的循环毫无关联,迭代必须是和上一次的循环有关联的
迭代的过程
l=['a','b','c']
i=0
while i < len(l):
print(l[i])
i+=1
PS:这个就是迭代的过程,但是这个只是用一个循环加功能实现迭代的过程,但这个不是迭代器
可迭代的对象:但凡内置有__iter__的对象就是可迭代的对象
' '.__iter__() #字符串类型
[].__iter__() #列表类型
(1,2).__iter__() #元祖类型
{'x':1}.__iter__() #字典类型
{1,2,3}.__iter__() #集合类型
open('file').__iter__() #文件类型
PS:调用可迭代对象的__iter__方法会得到一个返回值,该返回值就是迭代器对象
迭代器对象:即内置有__iter__方法又有__next__方法
直接查看类型下面有没有__next__方法,有的就是迭代器对象
PS:文件对象本身就是迭代器对象,为什么python要这样做,因为文件极有可能存储的内容很多,所以python直接将文件做成看迭代器对象
迭代器的使用方法
使用示例
dic={'x':1,'y':2,'z':3}
iter_dic=dic.__iter__() # 用iter方法将字典变成可迭代对象放入变量
print(iter_dic) #打印这个变量就可以得到一个提示,这是一个关于字典的迭代器
print(iter_dic.__next__()) #迭代器取值,用迭代器下面的next方法得到值,每执行一次只会得到一个值
使用方法
dic={'x':1,'y':2,'z':3}
iter_dic=iter()
print(next(iter_dic)
PS:迭代器取不到值也就是取值结束会报一个错误StopIteration
PS:python中的内置方法都可以有简写方式因为python已经将内置方法封装好了,dice.__iter__()可以写成iter(dice),iter_dic.__next__()可以简写成next(iter_dic)
迭代器的使用实例
dic={'x':1,'y':2,'z':3}
iter_dic=iter(dic)
while True:
try:
print(next(iter_dic))
except StopIteration:
break
print('='*100) #这里后面的代码就是一个循环下连续取值,所以第二次的取值是取不到值得,因为迭代器的特性
iter_dic=iter(dic)
while True:
try:
print(next(iter_dic))
except StopIteration:
break
PS:利用异常处理排除迭代器结束后的报错
for循环就是迭代器循环,for循环的原理就是基于迭代器
for循环的底层工作原理:
1、调用in后面那对象的内置方法__iter__,拿到一个迭代器对象iter_obj
2、执行k=next(iter_obj),循环往复直到抛出异常StopIterration
3、for循环在底层会捕捉异常然后结束循环(所以for循环取不到值得时候不会报错)
PS:可迭代对象和迭代器对象下面都有iter方法,为什么python要这样设计,就是为了统一for循环的工作机制,因为for循环的原理就是先调用一个值下面的iter方法将值变成可迭代对象,然后调用下面的next方法进行迭代,由于迭代器本身就是可迭代对象,所以迭代器下面的iter方法返回的就是迭代器本身,这样做就不用设计for循环的两套机制原理了,直接将机制原理做了统一