看看这个,问题的症结就在下面:

>>> 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实际上被提升了,这次列表理解受到了冲击。

10-06 01:08