Можно ли упростить функцию подсчета, убрав лишние переменные и сразу возвращать результат в Python
Что проверяют
Знаете ли вы идиоматический Python и понимаете ли, где короче значит лучше, а где вы молча меняете поведение. Вопрос идёт следом за вашим же кодом, поэтому проверяют ещё и то, как вы принимаете правку: спорите, соглашаетесь не глядя или сначала уточняете.
Как отвечать
Да, счётчик с циклом почти всегда сворачивается. Каноничный вид такой:
def count_even(nums):
return sum(1 for n in nums if n % 2 == 0)Генераторное выражение не строит промежуточный список, память остаётся постоянной, и работает это на любом итераторе, включая построчное чтение файла. Если условие уже оформлено функцией, короче через sum(map(is_even, nums)): тут помогает то, что bool наследник int.
Когда считается длина готовой коллекции, нужен просто len(). Когда считаются частоты по ключу, collections.Counter и читается лучше, и работает быстрее, потому что подсчёт идёт внутри реализации, а не в вашем цикле.
Обязательная оговорка: свернуть можно то, что действительно является подсчётом. Если в цикле есть break, ранний возврат или побочный эффект, однострочник уже другая функция. Вопрос «а этот счётчик точно проходит весь вход?» звучит лучше молчаливой правки.
И про меру. Три вложенных условия внутри генератора читаются хуже обычного цикла. Цель правки в том, чтобы убрать лишнюю переменную и лишнее состояние, а не сжать строку до предела.
Где спотыкаются
Пишут len([n for n in nums if n % 2 == 0]). Результат верный, но ради одного числа в памяти собирается целый список. На генераторе с sum этого не происходит, и на большом входе разница видна сразу.
Сворачивают цикл, не заметив выхода из него. Исходная функция считала до первого совпадения и прерывалась, а новая честно проходит весь вход; на бесконечном итераторе она просто зависнет. Если нужен ответ «есть ли хоть один», берут any(), он останавливается на первом истинном значении.
Считают, что короткая запись всегда быстрее. Генератор добавляет свои накладные расходы и не обязан обгонять явный цикл, а len() на генераторе не работает вовсе, потому что длина заранее неизвестна. Про скорость говорят после замера, а не вместо него.