看看这个,问题的关键在底部:
>>> scan = iter('FHUR203459')
>>> while True:
print(next(scan))
F
H
U
R
2
0
3
4
5
9
Traceback (most recent call last):
File "<pyshell#11>", line 2, in <module>
print(next(scan))
StopIteration
>>> scan = iter('FHUR203459')
>>> for i in range(12): # 12 * 2 for each join is 24, much longer than the string; should raise error.
print(''.join(next(scan) for i in range(2)))
FH
UR
20
34
59
>>>
换句话说,我们可以看到迭代器在两种情况下都到达了末尾,但是它只在第一种情况下引发了 StopIteration
,即使 next()
是到达终点后在这两种情况下都使用。为什么在 join
中使用它似乎可以避免该错误?或者这是一个错误?
最佳答案
在第一种情况下,StopIteration
没有在任何地方处理。但在第二种情况下,
''.join(next(scan) for i in range(2))
我们将生成器表达式传递给''.join
,它处理 StopIteration
由 next(scan)
提出并且每次都会退出。这就是为什么''.join
产生空字符串。
您可以稍微修改一下,并将列表传递给 ''.join
并查看自己引发的异常,如下所示
>>> scan = iter('FHUR203459')
>>> for i in range(12):
... print(''.join([next(scan) for i in range(2)]))
...
FH
UR
20
34
59
Traceback (most recent call last):
File "<input>", line 2, in <module>
File "<input>", line 2, in <listcomp>
StopIteration
它表明StopIteration
实际上,这一次,列表理解受到了影响。
关于python - 为什么这里没有引发 StopIteration ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26552333/