Вопрос №55322 от пользователя Сергей Воробьев в уроке «Генераторные выражения», курс «Python: Декларативное программирование»

Сергей Воробьев

Добрый вечер, я решил задание как в эталонном решении, но вдохновленный, видимо, примерами плохого кода из тестов попробовал следующее: Ревью. Интересен разбор полета больного разума...

3 0

Aleksei Pirogov

Сергей Воробьев, для начала у вас лишний слой (x for x in ..), который ничего полезного не делает, только тратит ресурсы :)

Далее, chain(*foo) гарантирует, что foo будет проитерирован в любом случае, даже если от выходного итератора не попросят ни одного элемента! Хуже того, все элементы foo будут сохранены в кортеж, который лишь затем будет передан в chain(). А ведь для работы all() не требуются сразу все входные данные: достаточно первого False!

Представьте теперь поток с миллионом рядов по три элемента, причём с False в первой же тройке. Ваш each2d сохранит весь миллион итераторов троек и только после этого передаст в chain(), а потом окажется, что all() дал бы ответ сразу!

some2d - то же самое.

Обе функции должны взять из источника ровно столько рядов и в каждом ряду ровно столько элементов, сколько требуется для вычисления. И ни одним больше. Декларативность декларативностью, но и о производительности кода задумываться нужно!

sum2d - тут всё ещё хуже. Потому что вы вообще все элементы сохраняете в куче списков (часть из которых ещё и ненужная) и только после этого вычисляете сумму!

1

Евгений Идзиковский

Ошибка в тесте. (print(x) for x in (1, 2, 3)) тоже выводит на экран, а именно: <generator object <genexpr> at 0x7f2a00f1bc80> (вопрос в тесте "Какие из выражений выведут что-либо на экран (да, это плохой код)?"

0

Aleksei Pirogov

user-b6044ee444e4bd07, что-либо выведет только REPL. Но в этом и состоит задача REPL - выводить значения всех вводимых выражений. И такой вывод не является эффектом вычисления выражения, это свойство интерактивного режима интерпретатора.

Если упомянутое генераторное выражение записать в файл и запустить этот файл как программу, то ничего выведено не будет.

0

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
25 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
25 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
25 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
25 мая 5 месяцев