Михаил Евграфов@MishaPogrommist
Пользователь
Информация
- В рейтинге
- Не участвует
- Откуда
- Россия
- Зарегистрирован
- Активность
Специализация
Бэкенд разработчик, Разработчик приложений
Младший
Git
Python
Docker
REST
ООП
Алгоритмы и структуры данных
Разработка программного обеспечения
Объектно-ориентированное проектирование
SQL
FastAPI
Спасибо за отзыв! Был бы рад услышать, какие моменты показались сложными для понимания и какие части недостаточно подробно расписаны?
Да, вы правы, это решение действительно проще фабрики и как раз полагается на способ работы со значениями по умолчанию. Я как-то упустил этот момент, спасибо!
Хм, мне казалось, это правильный перевод на русский. А какую бы вы посоветовали формулировку?
В русскоязычной литературе натыкался только на вариант списковые, словарные, множественные включения. Это не мой прямой перевод.
И вот еще одна интересная ссылка на StackOverlow, на этот раз уже прямо по теме нашей дискуссии, про списковые включения.
Я понимаю, что вы хотите сказать. И я с вами не согласен. Вот как выглядит байткод создания списка с помощью генератора:
Здесь для создания списка мы используем вызов
list, а в качестве аргумента передаем генератор, созданный с помощью генераторного выражения, которое реализовано функциейgenexpr. На всякий случай приведу байт кодgenexprеще раз:Здесь мы создаем генератор, а при каждом вызове мы будем делать YIELD_VALUE.
Теперь еще раз посмотрим на код создания с помощью спискового включения:
Здесь и вызовов меньше, и
listне используется, и нет никакогоgenexpr. Зато вместо него появляетсяlistcomp. Как выглядитlistcomp? На всякий случай дублирую:Здесь мы сразу создаем список (инструкция по адресу 2
BUILD_LIST), а потом на каждой итерации выполняем командуLIST_APPEND. Т.е. мы так же добавляем элементы в конец списка, как и при использовании цикла и явном вызовеappend. Вот ссылка на документацию к этой команду для версии 3.11. В итоге, мы в обоих вариантах (цикл и включение) сначала создаем список, а потом изменяем его, закидывая туда элементы. Разница лишь в том, что включениям для этого требуется меньше операций.По поводу ссылок. Вот неплохой ответ на StackOverflow, правда, про словари, но сути не меняет.
Спасибо! Интересное замечание. Нужно будет обязательно проверить.
Не соглашусь. Все же с точки зрения байткода списковое включение и генераторное выражение - это два разных объекта. Они работают по одной и той же схеме, но используют немного разные операции.
Чтобы в этом убедиться, достаточно дизассемблировать код генераторного выражения:
Похоже - да. То же самое - нет. В вашем примере ассерт проходит потому что вы из генератора явно сконструировали список.
Спасибо! Не натыкался на эту стать статью, когда искал похожие материалы.
Да, все верно. Тут я сплоховал, что не конкретизировал. Называю это включениями, потому что рассматривал включения в целом (listcomp, dictcomp, setcomp). Спасибо за замечание.