Вопрос №55279 от пользователя Renata M в уроке «Генераторы списков», курс «Python: Декларативное программирование»
Почему в тестовом вопросе о добавлении нечестных элементов в список ответ [xs.append(y) for y in ys if y % 2 == 1]
является неверным?
Потому что append
меняет исходный список по месту, а возвращает None
. Таким образом вы и декларативность теряете, и получаете ненужный список [None, None, ...]
. То есть результат вычисления list comprehensions оказывается бесполезен и код по сути просто является странным вариантом обычного императивного - меняющего состояние - цикла for .. :
.
Aleksei Pirogov, У меня не получается вывод, о которым вы говорите:
Где вы смотрите вывод?
По скриншоту могу предположить, что это Jupyter Notebook. Но в этом случае вы видите только результат вычисления последнего выражения, то есть xs
.
Вот как это выглядит в обычном REPL:
>>> ys = range(10)
>>> xs = []
>>> [xs.append(y) for y in ys if y % 2 == 1]
[None, None, None, None, None]
>>> xs
[1, 3, 5, 7, 9]
Выражение [xs.append(...)..]
вычисляется в список None
. И при этом модифицирует изменяемый объект xs
, который ещё и создать заранее нужно. Так использовать list comprehensions не принято. Потому что назначение генераторов списков - генерация новых списков, а не изменение существующих.
а если в решении автора "for one_list in" расположить на предыдущую строку, то можно избавиться от ошибки линтера WPS335. Что, мне кажется, логично - множество поиска (список) переносить на отдельную строку для единообразия со строкой 4: truths for truths in. (https://ru.hexlet.io/code_reviews/558870 - нейминг ток чур не смотреть, там швах))
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







