Python循环中的Iter()

时间:2019-07-02 19:17:52

标签: python python-3.x list loops

我无法理解为什么issup("oFB","FooBar")返回False。 iter(t)在此循环中的行为如何?

参考此 https://leetcode.com/problems/camelcase-matching/ https://leetcode.com/problems/camelcase-matching/discuss/270029/JavaC%2B%2BPython-Check-Subsequence-and-Regax

我猜iter(t)"FooBar"开始,然后在下一次迭代中转到"ooBar",依此类推。

def issup(s, t):
    it = iter(t)
    return all(c in it for c in s)

1 个答案:

答案 0 :(得分:2)

iter(t)返回一个迭代器,该迭代器返回t的所有元素。因此它将返回"F""o""o""B""a""r"

但是,迭代器只能使用一次;一旦返回所有元素,它将为空。因此,生成器第一次执行c in it时,它将逐步遍历迭代器,直到找到与c的值匹配为止。当它尝试寻找下一个c时,它将从上次停止的地方继续。而且,如果其中任何一个都找不到匹配项,它将到达迭代器的末尾,并且以下c in it测试都不会成功。

因此,当您执行issup("oFB", "FooBar")时,第一次迭代将找到第一个o。第二次迭代查找F,但是找不到,因为我们已经在迭代器中超过了该元素。此时,all()返回False

许多Python错误是由于没有意识到迭代器只能被执行一次。例如。像这样的东西:

with open("filename") as f:
    for _ in range(10):
        for line in f:
            # do stuff

f是文件行上的迭代器。当您到达for line循环的末尾时,其中没有任何内容,因此for _的下一个迭代将无任何循环。在这种情况下,您实际上可以使用f.seek(0)来修复它以倒带,但是大多数迭代器没有这样的内容。 file迭代器很不寻常,因为它使用基础流的状态,而不是保持其自己的状态。