python 迭代器协议和for循环工作机制

迭代器协议和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))

你可能感兴趣的:(python 迭代器协议和for循环工作机制)