过滤器函数为函数和lambda表达式提供了不同的结果,为什么?

时间:2019-04-19 16:02:46

标签: python python-3.x

我正在尝试使用Python的过滤功能从列表中过滤偶数

def evenNum(num):
    if num % 2 == 0 :
        return num

list1 = [i for i in range(-10 , 10)]

print (list1)
# [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(list(filter(evenNum,list1)))
# [-10, -8, -6, -4, -2, 2, 4, 6, 8]

print(list(filter(lambda x: x % 2 == 0 , list1)))
# [-10, -8, -6, -4, -2, 0, 2, 4, 6, 8]

为什么使用定义的函数时缺少0?

3 个答案:

答案 0 :(得分:6)

因为True仅保留了所提供的方法为其返回def evenNum(num): if num % 2 == 0 : return num 的那些元素。您的方法:

bool

不返回None,而是返回False(已翻译为num)或bool(num)(也已翻译为bool(0) == False)。还有def evenNum(num): return num % 2 == 0 ,因此您的filter方法不会传递0。您需要对其进行修改以返回bool值:

Dim r As Range, s As Range
Set r = Range("B2:C3")     ' r is a 4-cell range object at B2
Set s = r.AdjustMe(OffsetRows:=-1,OffsetColumns:=2,Columns:=+2,Rows:=+3) ' s is now a 20-cell range at D1
Set s = s.AdjustMe(Rows:=-4) ' s is now a single row reference

答案 1 :(得分:3)

您的函数不会返回相同的东西。您的lambda正确返回一个布尔值。但是您的另一个函数将返回数字本身。而0为布尔False。

要获得正确的结果,您应该返回布尔值:

Float

答案 2 :(得分:1)

您的函数返回的数字是偶数。否则,它返回None。

如果数字为偶数,则您的lambda返回True,否则返回False。

如果您对每个函数返回的内容进行过滤,则您的函数将排除0,因为0的计算结果为false。 lambda将返回True表示0,因此将包含在内。