我无法理解为什么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)
答案 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
迭代器很不寻常,因为它使用基础流的状态,而不是保持其自己的状态。