python基础三之迭代器
1、什么是迭代器
迭代的工具
什么是迭代?
迭代是一个重复的过程,每一次重复都是基于上一次结果而进行的
# 单纯的重复并不是迭代
while True:
print('=====>')
2、为什么要用迭代器
找到一种可以不依赖索引的迭代取值方式
3、怎么用迭代器
可迭代对象?
在python中,但凡内置有__iter__方法对象,都是可迭代的对象
迭代器对象?
执行可迭代对象下__iter__方法得到的返回值就是一个迭代器对象
迭代器对象内置
__next__方法
__iter__方法,执行该方法得到仍然是迭代器本身,干什么用??
迭代器对象一定是可迭代的对象
可迭代的对象不一定是迭代器对象
# l=['a','b','c']
# l='hello'
# l=('a','b','c','d','e')
# l={'a':1,'b':2,'c':3}
# i=0
# while i < len(l):
# print(l[i])
# i+=1
a=1
b=1.1
# 以下都是可迭代的对象
c='hello'
d=[1,2,3]
e=(1,2,3)
d={'a':1}
g={1,2,3}
f=open('aa.py','rb') # 本身就是迭代器对象
执行可迭代对象的__iter__方法得到迭代器对象
dic={'k1':1,'k2':2,'k3':3}
iter_obj=dic.__iter__()
# print(iter_obj)
print(iter_obj.__next__())
print(iter_obj.__next__())
print(iter_obj.__next__())
print(iter_obj.__next__())
f=open('aa.py','rt',encoding='utf-8')
iter_obj=f.__iter__()
print(iter_obj.__next__(),end='')
print(iter_obj.__next__(),end='')
print(iter_obj.__next__(),end='')
基于迭代器的迭代取值方式
dic={'k1':1,'k2':2,'k3':3}
iter_obj=dic.__iter__()
# print(iter_obj.__iter__().__iter__().__iter__().__iter__() is iter_obj)
while True:
try:
print(iter_obj.__next__())
except StopIteration:
break
for循环的底层运行机制:for循环可以称之为迭代器循环
1、先调用in后那个对象的__iter__方法,得到该对象的迭代器对象
2、执行迭代器对象的__next__方法,将得到的返回值赋值in前面的变量名,然后执行一次循环体代码
3、循环往复,直到取干净迭代器内所有的值,自动捕捉异常结束循环
for k in dic: #iter_obj=dic.__iter__()
print(k)
for x in 10:
pass
f=open('aa.py','rt',encoding='utf-8')
for line in f:
print(line)
示范一
dic={'k1':1,'k2':2,'k3':3}
iter_obj=dic.__iter__()
print('第一次迭代iter_obj')
for k in iter_obj: #iter_obj.__iter__()
print(k)
print('第二次迭代iter_obj')
for k in iter_obj:
print(k)
示范二
dic={'k1':1,'k2':2,'k3':3}
iter_obj=dic.__iter__()
print('第一次迭代iter_obj')
for k in iter_obj:
print(k)
iter_obj=dic.__iter__()
print('第二次迭代iter_obj')
for k in iter_obj:
print(k)
示范三
dic={'k1':1,'k2':2,'k3':3}
print('第一次迭代')
for k in dic: #dic.__iter__()
print(k)
print('第二次迭代')
for k in dic:
print(k)
总结迭代器的优缺点:
优点:
1、提供一种不依赖与索引的迭代取值方式====》应用于for循环
2、节省内存
l=[1,2,3,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,]
# obj=l.__iter__()
# f=open('aa.py')
# print(f.__next__())
# f.readline()
# for line in f:
# print(line)
for i in range(1,10000):
print(i)
缺点:
1、只能往后取,不能往前取,是一次性的,值取值干净后无法再次取值,除非重新得到新的迭代器对象,
# 不如按照索引取值的方式灵活
2、值去不干净,永远无法预测迭代器的长度

浙公网安备 33010602011771号