谁可以向我解释为什么这个列表理解失败:
provider1 = {'id': 1, 'name': 'Een'}
provider2 = {'id': 2, 'name': 'Twee'}
provider3 = {'id': 3, 'name': 'Drie'}
provider4 = {'id': 4, 'name': 'Vier'}
provider5 = {'id': 5, 'name': 'Vijf'}
provider6 = {'id': 6, 'name': 'Zes'}
provider7 = {'id': 7, 'name': 'Zeven'}
providers = [provider1, provider2, provider3, provider4, provider5, provider6, provider7]
def testfunc(id):
return next(provider for provider in providers if int(provider['id']) == int(id))
for x in range(0, 8):
print testfunc(x)
当我运行此函数并将0传递给函数时,其输出为:
Traceback (most recent call last):
File "/Users/me/Documents/scratchpad/main.py", line 17, in <module>
print testfunc(x)
File "/Users/me/Documents/scratchpad/main.py", line 13, in testfunc
return next(provider for provider in providers if int(provider['id']) == int(id))
StopIteration
Process finished with exit code 1
它适用于非零整数。
答案 0 :(得分:3)
这是因为next
函数在没有下一个项目时会引发StopIteration
。特别是当底层迭代器为空时发生这种情况,这是id == 0
的情况。
答案 1 :(得分:2)
字典没有键0
的值。它将值视为None
,并且无法确定迭代的下一个值。
将代码替换为有效范围,代码将起作用
for x in range(1, 8):
print( testfunc(x))
或
您可以添加provider0 = {'id': 0, 'name': 'Onkar'}
和providers = [provider0,provider1, provider2, provider3, provider4, provider5, provider6, provider7]
制作
for x in range(0, 8):
print( testfunc(x))
工作
答案 2 :(得分:0)
是的,因为你的发电机是空的。您的数据都不匹配
if int(provider['id']) == 0
在空发生器上调用next
会抛出StopIteration
。