Уроки модуля (1/4)
Понимание списка
Понимание списка – это выражение, которое создает список, применяя
преобразование (и, возможно, фильтр) в итерируемый объект. Это
Pythonic способ написать for + append в одной строке.
# 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]Полный синтаксис
[espressione for elemento in iterabile if condizione]- выражение: что поместить в результирующий список
- для элемента в итерации: исходный цикл
- if условие (необязательно): сохраняются только те элементы, которые соответствуют
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:
[n if n > 0 else 0 for n in [-2, -1, 0, 1, 2]]
# [0, 0, 0, 1, 2]Мульти-для: декартово произведение
Вы можете вложить несколько предложений for:
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 внутри одного понимания списка. Например, чтобы свести матрицу (список списков) в один плоский список, вы можете написать:
matrix = [[1, 2], [3, 4]]
flat = [item for row in matrix for item in row]
# result: [1, 2, 3, 4]Порядок циклов точно отражает порядок вложенности традиционных циклов for.
Попробуйте это
Учитывая `nums = [1, 2, 3, 4, 5, 6]`, постройте `even_squares` из квадратов только четных чисел. Оцените `even_squares`.
Показать подсказку
если n % 2 == 0 в конце.
Решение доступно после 3 попыток
Обзор упражнения
Учитывая `words = ['Ciao', 'Mondo', 'Python', 'Java']`, создайте `lengths` с длиной КАЖДОГО слова и `short_words` только со словами короче 5 символов. Оцените `(длины, короткие_слова)`.
Показать подсказку
Два отдельных понимания.
Решение доступно после 3 попыток
Дополнительная задача
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 попыток