← Все вопросы

Почему for i in range(n): a.append(i) лучше переписать в comprehension?

Задан 6 месяцев назад499 просмотров3 ответа
12

Наполняю список в цикле через append. Постоянно слышу, что так не делают и надо list comprehension. Это просто вкусовщина или есть реальная разница?

3 ответа

20
✓ Принятый ответ — помог автору

Разница есть, и не только в стиле.

# было
a = []
for i in range(n):
    a.append(i * i)

# стало
a = [i * i for i in range(n)]

Comprehension быстрее (append вызывается как метод на каждом шаге — это накладные расходы, у включения цикл крутится на уровне интерпретатора оптимальнее), короче и читается как «список квадратов от 0 до n». Плюс намерение видно сразу: «строю новый список», тогда как цикл с append приходится дочитывать до конца, чтобы понять, что он только наполняет.

11

Но не тащи в comprehension всё подряд. Если внутри побочные эффекты (print, запись в файл) или логика на несколько строк с вложенными условиями — обычный цикл честнее. Comprehension хорош именно для «собрать список из значений».

Max Pogodin Плюсую, видел монструозные вложенные включения — лучше бы цикл · 6 месяцев назад
8

Для этого конкретного примера вообще a = list(range(n)).

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект