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、值去不干净,永远无法预测迭代器的长度
posted @ 2018-05-08 11:03  cyh追梦寻  阅读(123)  评论(0编辑  收藏  举报