D18-05 迭代器 生成器

1、迭代器协议:对象必须提供一个next方法,执行方法要么返回迭代中的下一项,要么就引一个stoplteration异常以终止迭代。(智能往后不能往前走)

2、可迭代对象:实现了迭代器协议的对象(如何实现 对象内部定义一个__iter__()方法)

3、协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max等)使用迭代器协议访问对象。

(字符串,列表,元组,字典,集合,文件对象)都不是可迭代对象,只不过在for循环形式,调用了他们内部__iter__()方法,把他们变成了可迭代对象。

然后for循环调用可迭代对象的next方法取值,而且for循环会捕捉stoplteration异常已终止迭代。

l = [1,2,3]
for i in l:
    pass
a = l.__iter__() #先用内置方法转换
b = a.__next__() #在用next方法
print(b)
输出结果 1

 

l = [1,2,3]
print(l[0])
iter_l = l.__iter__() #遵循迭代器协议,转换可迭代对象。
print(iter_l.__next__())

  

如果没有迭代器可以通过以下代码实现

l = [1,2,3]
index = 0
while index<len(l):
    print(l[index])
    index+=1

 

实际上的for循环的本质是通过以下方式来实现的两次转换iter ,next,通过except捕捉到异常 然后终止。

l = [1,2,3,4,5]
diedai = l.__iter__()

while True:
    try:
        print(diedai.__next__())
    except StopIteration:
        print('迭代完毕,循环终止')
        break
打印结果:
1
2
3
4
5
迭代完毕,循环终止

 

补充

函数的内置方法

print(next(l._iter_))实际上是调用 iter_l._next_()

 

posted @ 2018-09-04 14:34  犀利的攻城狮  阅读(99)  评论(0)    收藏  举报