1、什么是迭代器?
迭代器是一个重复的过程,并且每次重复都是机遇上一次的结果而来
要想了解迭代器到底是什么?必须先了解一个概念,即什么是可迭代的对象?
可迭代对象:在python中,但凡内置有__iter__方法的对象,都是可迭代对象
以下都是可迭代的对象: ( 你可以自己在对象后面 ._ 看下有没有__iter__ ) str=‘hello‘ list=[1,2,3] tup={1,2,3} dic={‘x‘:1} s1={‘a‘,‘b‘,‘c‘} f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)
2、迭代器
迭代器:迭代取值工具,可迭代的对象执行__iter__方法得到的返回值就是迭代器对象
dic={‘x‘:1,‘y‘:2,‘z‘:3} iter_dic=dic.__iter__() #第一件事是获得一个可迭代器,即调用了__iter__()函数 print(iter_dic.__next__()) #第二件事是循环的过程,循环调用__next__()函数。 print(iter_dic.__next__()) print(iter_dic.__next__())
print(iter_dic.__next__()) #第四行会提示哦,也相当于报错,只有三个值,你取第四个值的时候会停止迭代
# print(iter_dic.__next__())
StopIteratio
4、可迭代的对象vs迭代器对象?
可迭代的对象:str,list,tuple,dict,set,file
1、获取可迭代对象的方式:python内置的有str,list,tuple,dict,set,file都是可迭代对象
2、特点:内置有__iter__方法的都叫可迭代的对象,执行该方法会拿到一个迭代器对象。
迭代器对象:文件对象本身就是迭代器对象
1、获取迭代器对象的方式:
执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象
2、特点:
内置有__next__方法,执行该方法会拿到迭代器对象中的一个值
内置有__iter__方法,执行该方法会拿到迭代器本身
str1=‘hello‘ list1=[1,2,3] tup1=(1,2,3) dic={‘x‘:1} s1={‘a‘,‘b‘,‘c‘} #文件本身就是迭代器对象 f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘) f.__next__()
5、迭代器的优缺点分析
迭代器的优点:
提供了一种可不依赖于索引的取值方式
迭代器更加节省内存
迭代器的缺点:
取值麻烦,只能一个一个取,只能往后取
并且是一次性的,无法用len获取长度
1、提供了一种可不依赖于索引的取值方式
#这是a.txt文件的内容 adadaaasdasd dasdas das l=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) iter=l.__iter__() while True: #死循环 try: #用这个参数来检测 print(iter.__next__(),end=‘‘) except StopIteration: #检测什么时候出现StopIteration break #监测到出现StopIteration 就break
l.close()
#结果如下
adadaaasdasd
dasdas
das
#没有报错
2、迭代器更加节省内存
item=range(0,100000000000000000000000000000000000000000000) #如rang,python2中会依次打印1,2,3,4,5,6.。。。python3中优化了迭代器直接打印出来,所以更省内存
print(item)
#结果如下
range(0, 100000000000000000000000000000000000000000000)
#取值麻烦,只能一个一个取,只能往后取 x=[1,2,3] iter_x=x.__iter__() while True: try: print(iter_x.__next__()) except StopIteration: break print(‘第二次=================================》‘) iter_x=x.__iter__() while True: try: print(iter_x.__next__()) except StopIteration: break #结果如下 1 2 3 第二次=================================》 1 2 3
6、for循环原理分析:
#6.1、for 循环称之为迭代器循环,in后跟的必须是可迭代的对象 #6.2、for循环会执行in后对象的__iter__方法,拿到迭代器对象 #6.3、然后调用迭代器对象的__next__方法,拿到一个返回值赋值给line,执行一次循环体 #6.4、周而复始,直到取值完毕,for循环会检测到异常自动结束循环 l=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) for line in l: #iter_l=l.__iter__() print(line,end=‘‘) for item in {‘x‘:1,‘y‘:2}: print(item,end=‘‘) #结果如下 adadaaasdasd dasdas das xy