我正在阅读filter
,lambda
和map
。当我尝试使用它们时,我发现了这个特点:
def returnAsIs(element):
return element
print range(10)
print filter(returnAsIs, range(10))
print map(lambda x : x, range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
为什么过滤器省略了第一个条目?
答案 0 :(得分:7)
为什么在0
中跳过了元素filter()
?
这是因为值0
评估为False
。
根据函数的iterable元素构造一个列表 返回true。
因此,当我们将filter(function, iterable)
应用于iterable
时,只返回函数返回True
的那些元素。
当Python迭代从0
到9
的元素时,它会检查哪个元素的计算结果为True
,并且只返回那些元素。现在,0
评估为False
,因此filter()
不会返回此值。仅返回1
到9
中的元素。
如何检查元素的布尔值?
由于您的函数按原样返回元素,我们需要检查哪些元素的计算结果为True
。只返回那些评估为True
的元素。
要检查布尔值,我们可以使用bool()
函数。
In [1]: for x in range(10):
...: print x, bool(x)
...:
0 False # boolean-ness of '0' is False
1 True
2 True
3 True
4 True
5 True
6 True
7 True
8 True
9 True
答案 1 :(得分:3)
这是因为python将0
视为False。您可以使用函数bool
>>> bool(0)
False
当您阅读docs时,
根据iterable的元素构造一个列表,该函数返回 true 。
因此,在过滤函数之后不会返回0
,因为值的计算结果为False
。类似的情况是0
列表中的任何位置
>>> print filter(returnAsIs, [1,2,1,0])
[1, 2, 1]
答案 2 :(得分:0)
过滤器函数检查值是true还是false。 将真实值考虑在内,返回false的值将被拒绝,并在完成时返回一个列表... 以下是更好的代表性
filter
(函数或无,序列) - >列表,元组或字符串返回函数(item)为true的序列项。如果 function为None,返回true的项。如果序列是一个元组 或者字符串,返回相同的类型,否则返回一个列表。