Короткий ответ
Функция не содержит инструкции return после цикла, поэтому она всегда неявно возвращает None, хотя внутри корректно строит список result — исправление: добавить явный return result после цикла.
Как это работает подробнее
Если функция доходит до конца тела без явного return value, Python автоматически завершает её, возвращая None. Это не вызывает ошибку интерпретатора — код "работает" в смысле не падает, но вызывающая сторона получает None вместо ожидаемого значения, и ошибка обнаруживается только там, где это None пытаются использовать как список.
Пример кода
example.py
def filter_even_broken(numbers):
result = []
for n in numbers:
if n % 2 == 0:
result.append(n)
# забыли return result — функция всегда отдаёт None
def filter_even_fixed(numbers):
result = []
for n in numbers:
if n % 2 == 0:
result.append(n)
return result
print(filter_even_broken([1, 2, 3, 4])) # None — баг
print(filter_even_fixed([1, 2, 3, 4])) # [2, 4] — исправленоЧто использовать на практике
- Практика. Отлавливают такие баги через unit-тесты, проверяющие именно возвращаемое значение (
assert result == [2, 4]), а не только отсутствие исключений. Также полезно включить проверку типов (type hints + статический анализатор типа mypy), который подскажет несоответствие аннотированного-> list[int]и фактическогоNoneв некоторых путях выполнения.
Подводные камни
- Риски. Забывают return при рефакторинге, когда переносят логику из цикла, который раньше печатал результат, в функцию, которая должна его возвращать. Также кладут
returnвнутрь цикла по ошибке, из-за чего функция возвращает результат после обработки только первого элемента, а не всего списка.