функция фильтра дает другой результат для функций и лямбда-выражений, почему?

#python #python-3.x

#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 отсутствует при использовании определенной функции?

Комментарии:

1. Ваша evenNum() функция возвращает «ложное» значение (ноль) при вводе нуля.

Ответ №1:

Потому filter что оставляет только те элементы, для которых возвращается предоставленный метод True . Ваш метод:

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

Не возвращает bool , но либо None который преобразуется False , либо num который также преобразуется bool(num) . И bool(0) == False , таким образом, ваш метод filter не будет передавать 0. Вам нужно изменить его, чтобы вернуть значение bool:

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

Ответ №2:

Ваши функции не возвращают одно и то же. Ваш лямбда-код правильно возвращает логическое значение. Но ваша другая функция возвращает само число; а 0 — это логическое значение False .

Чтобы получить правильный результат, вы должны вернуть bool:

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

Ответ №3:

Ваша функция возвращает число, если оно четное. В противном случае он возвращает None.

Ваша лямбда возвращает True, если число четное, False в противном случае.

Если вы отфильтруете то, что возвращается каждым из них, ваша функция исключит 0, потому что 0 вычисляется как false . Лямбда вернет значение True для 0, поэтому оно будет включено.