【发布时间】:2021-12-21 00:38:14
【问题描述】:
下面的例子由documentation给出:
在语句
for X in Y中,Y 必须是迭代器或iter()可以为其创建迭代器的某个对象。这两个语句是等价的:for i in iter(obj): print(i) for i in obj: print(i)
据此相同source,
在幕后,for 语句在容器对象上调用
iter()。该函数返回一个迭代器对象,该对象定义了方法__next__(),该方法一次访问容器中的元素。当没有更多元素时,__next__()会引发StopIteration异常,告知 for 循环终止。
考虑到这两种情况,当 Y 是一个迭代器或某个 iter() 可以为其创建迭代器的对象时,
- 如果 Y 是一个可迭代对象(具有
iter()方法),for 语句将调用此方法并返回一个迭代器,其next()方法用于遍历 Y 的每个元素。假设这是上面的第二个示例。 - 如果 Y 是一个迭代器(同时具有
iter()和next()方法),for 语句仍然调用iter()方法,但是因为它是一个迭代器,所以它返回它@ 987654335@,而next()方法照常调用。我假设这是上面的第一个示例。
我的问题是,我的推理是否正确?我不介意你指出任何对定义的误用。
【问题讨论】:
-
是的,你的逻辑是正确的。对
iter(iter(x))的调用与对iter(x)的调用相同。这基本上就是在您的两个示例循环中发生的情况,for语句对iter进行外部调用。 -
从技术上讲,如果您有一个不通过返回自身来实现
__iter__的迭代器,它们不等效。
标签: python loops iterator iterable