我正在写一个循环,在4个列表迭代器上如下所示:
it0 = iter(['foo','bar'])
it1 = iter(['bar','foo'])
it2 = iter(['foo','foo'])
it3 = iter(['bar','bar'])
try:
a, b, c, d = map(next, (it0, it1, it2, it3))
while True:
#some operations that can raise ValueError
if a+b+c+d == 'foobar'*2:
a, b, c, d = map(next, (it0, it1, it2, it3))
elif a+b == 'foobar':
c, d = map(next,(it2, it3))
else:
a, b = map(next,(it0, it1))
except StopIteration:
pass
但是当我在Python3中运行这段代码时,我得到一个ValueError: not enough values to unpack (expected 2, got 0)
在预期的StopIteration
之前出现。在
我不想在except
语句中捕捉ValueError
,因为while循环中的某些操作也可能导致ValueError
,该操作应停止程序。在
next
怎么不在赋值之前引发它的异常?在
在Python2.7中,StopIteration
首先被引发。在
引发了
StopIteration
,但元组赋值将其吞并,因为它将StopIteration
视为来自map()
迭代器的信号,该迭代器生成值:这是正常的行为;期望迭代器作为输入的Python内置程序总是使用
StopIteration
作为“迭代完成”信号,元组解包必须在这里迭代。在请先将}。在
map()
输出转换为列表并测试长度,对每个iterable分别使用next()
,而不是使用map()
,或者在本地捕获{测试长度必须重新提高
^{pr2}$StopIteration
:注意,这里
list()
吞并了StopIteration
异常。在仅为
map()
操作捕获ValueError
:在每个迭代器上单独调用
next()
,根本不使用map()
:或者使用列表理解:
这两种方法都确保在赋值发生之前调用
next()
,而不是在赋值过程中调用。在根据Martijn Pieters的回答,直接使用列表理解是有效的:
这post澄清了为什么}。在
for
在iterable上而不是在循环体中捕捉{另一种可能的方法是,利用
^{pr2}$next
的default
参数:相关问题 更多 >
编程相关推荐