迭代器协议和for循环工作机制
1、迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,已终止迭代(只能往后走不能往前退)
2、可迭代对象,实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)
3、协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max,函数等)使用迭代器访问对象
l = [1, 2, 3]
for i in l:
print(i)
for循环机制
for循环本质,循环所有对象,全都是使用迭代器协议。
(字符串,列表,元祖,字典,集合)这些都不是可迭代对象,只不过for循环试,调用了他们内部的__iter__方法,把他们变成了可迭代对象,然后他们变成了可迭代对象
然后for循环调用可迭代的对象的__next__方法去取值,而且for循环会捕捉StopIteration异常,以终止迭代
x = 'hello'
print(dir(x))
iter_text = x.__iter__()
print(iter_text.__next__())
print(iter_text.__next__())
print(iter_text.__next__())
print(iter_text.__next__())
print(iter_text.__next__())
print(iter_text.__next__())
转换成可迭代对象
xl = x.__iter__()
print(xl.__next__())
x = 'hello'
index = 0
while index< len(x):
print(x[index])
index+=1
有序的可以按照序列访问 while,无序的无法办到
for 循环可以循环任何
dic = {'a': 1, 'b': 2}
dic_l = dic.__iter__()
print(dic_l.__next__())
迭代器补充
存储于内存
l = ['dd','ee','ss']
这种方式 只得到地址
itr = l.__iter__()
print(itr.__next__())
print(itr.__next__())
print(itr.__next__())
print(itr.__next__())
next 方法就是调用 iter 的next方法
print(next(itr))
网友评论