Вопрос №55322 от пользователя Сергей Воробьев в уроке «Генераторные выражения», курс «Python: Декларативное программирование»
Добрый вечер, я решил задание как в эталонном решении, но вдохновленный, видимо, примерами плохого кода из тестов попробовал следующее: Ревью. Интересен разбор полета больного разума...
Сергей Воробьев, для начала у вас лишний слой (x for x in ..)
, который ничего полезного не делает, только тратит ресурсы :)
Далее, chain(*foo)
гарантирует, что foo
будет проитерирован в любом случае, даже если от выходного итератора не попросят ни одного элемента! Хуже того, все элементы foo
будут сохранены в кортеж, который лишь затем будет передан в chain()
. А ведь для работы all()
не требуются сразу все входные данные: достаточно первого False!
Представьте теперь поток с миллионом рядов по три элемента, причём с False
в первой же тройке. Ваш each2d
сохранит весь миллион итераторов троек и только после этого передаст в chain()
, а потом окажется, что all()
дал бы ответ сразу!
some2d
- то же самое.
Обе функции должны взять из источника ровно столько рядов и в каждом ряду ровно столько элементов, сколько требуется для вычисления. И ни одним больше. Декларативность декларативностью, но и о производительности кода задумываться нужно!
sum2d
- тут всё ещё хуже. Потому что вы вообще все элементы сохраняете в куче списков (часть из которых ещё и ненужная) и только после этого вычисляете сумму!
Ошибка в тесте. (print(x) for x in (1, 2, 3)) тоже выводит на экран, а именно: <generator object <genexpr> at 0x7f2a00f1bc80> (вопрос в тесте "Какие из выражений выведут что-либо на экран (да, это плохой код)?"
user-b6044ee444e4bd07, что-либо выведет только REPL. Но в этом и состоит задача REPL - выводить значения всех вводимых выражений. И такой вывод не является эффектом вычисления выражения, это свойство интерактивного режима интерпретатора.
Если упомянутое генераторное выражение записать в файл и запустить этот файл как программу, то ничего выведено не будет.
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







