迭代的一些概念与for循环机制

一些概念
迭代:每次的结果都是根据上次迭代的结果来的。

迭代器协议:对象必须以同一个 .next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopIteration异常以终止迭代。(只能往后走,不能往前退)

可迭代对象:遵循迭代器协议的对象就是可迭代对象。

for循环机制
字符串、列表、元组、字典、集合、文件对象这些都不是可迭代对象,在for循环中调用了他们的__iter__()方法,将他们转化成了可迭代对象。

for循环做的一件事就是将数据调用__iter__()方法转化为可迭代对象,第二件事为捕获stopIteration异常并在出现异常时终止迭代。

所以我们说for循环是遵循迭代器协议去访问对象的。

for 循环存在的必要性:字符串、列表、元组是有序的,可以通过索引的方式遍历,但无序的字典、集合、文件对象是不可通过引索遍历的,只能通过for循环

iter_test = x.__iter__()
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())
L = [1, 2, 3]
iter_test = L.__iter__()
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())

针对集合和文件对象的情况:

s = {1, 2, 3}
iter_s = s.__iter__()
print(iter_s.__next__())
print(iter_s.__next__())
print(iter_s.__next__())
#这也解释了为什么for循环文件句柄时是要一行给一行(底层执行的是__next__()操作)
f = open("Test1", "r+", encoding="utf8")
iter_f = f.__iter__()
print(iter_f.__next__(), end="")
print(iter_f.__next__(), end="")
print(iter_f.__next__(), end="")
print(iter_f.__next__(), end="")
f.close()

此外,除了调用可迭代对象中的__next__()方法得到下一项,还可以利用内置函数next()得到可迭代对象的下一项内容。

L = [1, 2, 3, 4]
iter_L = L.__iter__()
print(iter_L.__next__())
print(next(iter_L))

用while去模拟for循环所做的事

try:
except:
关键字表示在不报错的情况下运行

L = [1, 2, 3, 4, 5]
diedai_L = L.__iter__()
while True:
    try:
        print(diedai_L.__next__())
    except:
        print("结束")
        break

你可能感兴趣的:(Python)