Перейти к основному содержимому
Модуль 6 · Урок 1 из 421/36 в курсе~12 min
Уроки модуля (1/4)

Понимание списка

Понимание списка – это выражение, которое создает список, применяя преобразование (и, возможно, фильтр) в итерируемый объект. Это Pythonic способ написать for + append в одной строке.

Python
# stile imperativo (verboso)
quadrati = []
for n in range(5):
    quadrati.append(n * n)

# stile pythonico
quadrati = [n * n for n in range(5)]
# [0, 1, 4, 9, 16]

Полный синтаксис

Python
[espressione for elemento in iterabile if condizione]
  • выражение: что поместить в результирующий список
  • для элемента в итерации: исходный цикл
  • if условие (необязательно): сохраняются только те элементы, которые соответствуют
Python
pari = [n for n in range(10) if n % 2 == 0]
# [0, 2, 4, 6, 8]

maiuscole = [p.upper() for p in ["ciao", "mondo"]]
# ['CIAO', 'MONDO']

lunghe = [p for p in ["a", "bb", "ccc", "dddd"] if len(p) >= 3]
# ['ccc', 'dddd']

if/else внутри выражения (тройное)

Чтобы преобразовать условно (а не фильтровать), используйте троичный оператор выражение ПЕРЕД for:

Python
[n if n > 0 else 0 for n in [-2, -1, 0, 1, 2]]
# [0, 0, 0, 1, 2]

Мульти-для: декартово произведение

Вы можете вложить несколько предложений for:

Python
coppie = [(x, y) for x in range(3) for y in range(2)]
# [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]

Порядок предложений for — «внешний-перед-внутренним», как если бы они были вложенные циклы.

Когда НЕ использовать понимание

— Сложная логика со множеством вложенных ветвей if/else → используйте явный цикл.

  • Побочные эффекты (печать, запись в файл) → цикл, а не понимание.
  • Более двух вложенных уровней → явный именованный цикл почти всегда лучше.

Вложенные списки

Вы можете объединить несколько циклов for внутри одного понимания списка. Например, чтобы свести матрицу (список списков) в один плоский список, вы можете написать:

Python
matrix = [[1, 2], [3, 4]]
flat = [item for row in matrix for item in row]
# result: [1, 2, 3, 4]

Порядок циклов точно отражает порядок вложенности традиционных циклов for.

Попробуйте это

Упражнение#python.m6.l1.e1
Попыток: 0Загрузка…

Учитывая `nums = [1, 2, 3, 4, 5, 6]`, постройте `even_squares` из квадратов только четных чисел. Оцените `even_squares`.

Загрузка редактора…
Показать подсказку

если n % 2 == 0 в конце.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#python.m6.l1.e2
Попыток: 0Загрузка…

Учитывая `words = ['Ciao', 'Mondo', 'Python', 'Java']`, создайте `lengths` с длиной КАЖДОГО слова и `short_words` только со словами короче 5 символов. Оцените `(длины, короткие_слова)`.

Загрузка редактора…
Показать подсказку

Два отдельных понимания.

Решение доступно после 3 попыток

Дополнительная задача

Упражнение#python.m6.l1.e3
Попыток: 0Загрузка…

Use a list comprehension to calculate the squares of only the even integers between 1 and 10 inclusive. Store the list in `even_squares` and evaluate it.

Загрузка редактора…
Показать подсказку

Используйте range(1, 11) для итерации, if x % 2 == 0 для фильтрации и x**2 в качестве выражения.

Решение доступно после 3 попыток