【问题标题】:Why are <for i in obj:> and <for i in iter(obj):> equivalent?为什么 <for i in obj:> 和 <for i in iter(obj):> 等价?
【发布时间】: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


【解决方案1】:

https://docs.python.org/3/library/stdtypes.html#typeiter

iterator.__iter__()

返回迭代器对象本身。这是 需要允许容器和迭代器与 for 和 in 语句。这个方法对应的tp_iter slot Python/C API 中 Python 对象的类型结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2011-01-07
    • 1970-01-01
    • 2013-07-15
    相关资源
    最近更新 更多