all([]) равно True
Почему проверка «все оценки пятёрки» пропускает ученика без оценок.
Что происходит
all([]) # True
any([]) # False
Математически это верно: утверждение «все элементы пустого множества обладают свойством» истинно, потому что опровергнуть его нечем.
По смыслу задачи — почти всегда неправда.
Как кусается
def otlichnik(ocenki):
return all(o == 5 for o in ocenki)
otlichnik([5, 5, 5]) # True — верно
otlichnik([]) # True — ученик без единой оценки отличник
Отчёт соберётся, число отличников будет больше настоящего, и разобраться, откуда взялись лишние, получится не сразу.
Как надо
Проверять наполненность отдельно:
def otlichnik(ocenki):
return len(ocenki) >= 3 and all(o == 5 for o in ocenki)
Сколько именно требовать — вопрос задачи, а не программирования.
Важно, что это решение должно быть принято сознательно, а не
достаться по умолчанию от all.
Где ещё то же самое
min([]) # ошибка, а не пустота
max([]) # ошибка
sum([]) # 0 — а это как раз обычно то, что нужно
"".join([]) # "" — тоже нормально
Каждая функция ведёт себя на пустом по-своему. Проверять поведение на пустых данных стоит всегда — это один из трёх случаев, на которых ломается больше всего кода, вместе с «одним элементом» и «все одинаковые».