【问题标题】:How does keyword`in` works in iterator?关键字`in`如何在迭代器中工作?
【发布时间】:2014-08-18 01:46:25
【问题描述】:

我有这个:

>>> 1 in (i for i in range(0, 5))
True

>>> 2 in (i for i in range(0, 5))
True

之后:

>>> gen = (i for i in range(0, 5))
>>> 1 in gen
True
>>> 3 in gen
True
>>> 2 in gen
False

keywordin 的工作方式类似于:

3 in gen

等于:

j = 3
for i in gen:
    if i == j:
        return True
    else:
        return False

但是在for循环之后,不要再次将迭代器重置为第一个。

对吗?

【问题讨论】:

  • 当我在 python 2.7 和 python 3 中运行你的第二个示例时,我得到一个NameError: Name 'i' is not defined。你确定你没有在解释器会话的早些时候定义 i 吗?
  • @happydave 我的错,我之前确实看到了那个结果,但是刚才,我测试了代码,我得到了你的结果。也许我在那次测试中写了i。现在更正它。

标签: python iterator in-operator


【解决方案1】:

in 运算符的工作方式类似于下面定义的 f_in 函数:

def f_in(aj, gen):
    j = aj
    while(True):
        try:
            if(j == gen.next()):
                return True
        except StopIteration:
            return False
mygen = xrange(5)
agen = iter(mygen)

print f_in(1, agen)
print f_in(3, agen)
print f_in(2, agen)

这很有意义,因为迭代器可以是无限的,并且成功调用 3 in it 不需要遍历整个(可能是无限的)迭代器。

【讨论】:

    【解决方案2】:

    From the docs on the Python data model:

    成员资格测试运算符 (in and not in) 正常实现 作为通过序列的迭代。

    它开始遍历迭代器直到它到达项目,并返回True,或者耗尽迭代器并返回False。如果迭代器没有用完,您仍然可以从中获取剩余的项目,但这不会重新启动生成器,您只会遍历剩余的元素。

    【讨论】:

      【解决方案3】:

      生成器在产生值时维护上下文。所以,当你这样做时

      1 in gen
      

      它将开始迭代,当它到达1 时,它返回True,但当前状态为1。接下来,当您执行3 in gen 时,它会迭代直到3 并产生True。然后当你这样做时

      2 in gen
      

      它从3 开始迭代,而不是从头开始。这就是为什么你会收到False

      在你的程序中,

      j = 3
      for i in gen:
          if i == j:
              return True
          else:
              return False
      

      如果i不等于j,它将立即返回False。相反,它可以松散地理解为,

      return any(i == j for j in gen)
      

      any 迭代生成器,直到任何项目符合条件。如果没有匹配的项目,它将耗尽生成器并返回False

      【讨论】:

        猜你喜欢
        • 2011-10-30
        • 2016-07-04
        • 1970-01-01
        • 1970-01-01
        • 2014-01-20
        • 2020-01-07
        • 1970-01-01
        • 2021-09-05
        • 1970-01-01
        相关资源
        最近更新 更多