为什么我会收到 ValueError 错误?

3
l=['Python', 3, 2, 4, 5, 'version']
l=filter(lambda x:type(x)==int,l)
print(list(l))
print(max(l))

遇到这个错误但我不知道为什么... ValueError: max()的参数是一个空序列

如果我不打印list(l)就可以运行...

l=['Python', 3, 2, 4, 5, 'version']
l=filter(lambda x:type(x)==int,l)
print(max(l))

输出: 5

在打印筛选对象列表后,它不起作用,我不知道为什么,你能帮忙解决吗?有修复方法吗?


我认为list(l)会消耗序列,使得l成为序列末尾的迭代器。 - UnholySheep
2
在Python 2中,filter是一个返回列表的函数。在Python 3中,它是一个类,其实例是迭代器。 - chepner
1个回答

6

filter 返回一个迭代器。在调用 list(l) 后,迭代器已经被耗尽,因此您无法从中再获取任何值。

您可以尝试并查看:

l = ['Python', 3, 2, 4, 5, 'version']
l = filter(lambda x: type(x) == int, l)
print(list(l))
print(list(l))

第二个打印语句会输出空列表:

[3, 2, 4, 5]
[]

这样可以正常工作:
l = ['Python', 3, 2, 4, 5, 'version']
l = filter(lambda x: type(x) == int, l)
l = list(l)
print(l)
print(max(l))

1
请参阅 https://dev59.com/WHE85IYBdhLWcg3wbTD2,了解Python生成器和迭代器之间的区别。 - mkrieger1
感谢@chepner的修改!我肯定错过了那个。 - kwkt
1
“生成器”是一种特定的类,其实例可通过生成器表达式或生成器函数进行定义。迭代器是指任何实现了“__next__”方法的东西,使您可以通过“next”函数检索参数。据我所知,您可以将“生成器”用作“迭代器”的同义词,但我认为避免歧义更清晰。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接