📖 Теория

⚡ Кратко

List comprehension создаёт новый список из итерируемого объекта в одной строке.

Фильтр if в конце добавляет только подходящие элементы.

Условное выражение if-else стоит перед for и выбирает значение для каждого элемента.

Вложенные comprehension читаются слева направо как вложенные циклы.

zip() объединяет элементы нескольких последовательностей по позициям и останавливается на самой короткой.

Стек работает по LIFO и удобно реализуется append()/pop().

Очередь работает по FIFO, для неё лучше использовать collections.deque и popleft().

sorted() и list.sort() в Python устойчивы: равные ключи сохраняют исходный порядок.

numbers = [1, 4, 6, 7, 9]
squares = [number ** 2 for number in numbers]
print(squares)
print(numbers)

Топ-3 ошибки: путать ссылку и копию; ожидать порядок там, где его нет; усложнять выражение, когда обычный цикл читается лучше.

Базовый list comprehension

Списковое включение создаёт новый список, применяя выражение к каждому элементу итерируемого объекта.

Исходный список при этом не меняется, если выражение само не вызывает побочных эффектов.

numbers = [1, 4, 6, 7, 9]
squares = [number ** 2 for number in numbers]
print(squares)
print(numbers)

Фильтр if

Фильтр после for определяет, какие элементы попадут в результат.

Такой вариант хорошо читается, когда условие короткое и не требует дополнительных шагов.

even_numbers = [number for number in range(10) if number % 2 == 0]
print(even_numbers)

Условное выражение if-else

Если нужно добавить значение для каждого элемента, но выбрать форму значения по условию, if-else пишется перед for.

Вложенный if-else внутри comprehension допустим, но быстро ухудшает читаемость.

numbers = [2, 7, 5, 4, 1, 1, 7, 8]
modified = [number if number % 2 == 0 else -1 for number in numbers]
print(modified)

Вложенный цикл и матрица

Вложенный comprehension можно читать как обычные вложенные for в том же порядке.

Для разворачивания матрицы сначала перебирается строка, затем значение в строке.

matrix = [[1, 2, 3], [4, 5, 6]]
flattened = [value for row in matrix for value in row]
print(flattened)

zip()

zip() объединяет несколько последовательностей в пары или кортежи по позициям.

Если длины различаются, результат заканчивается на самой короткой последовательности.

names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]

for name, age in zip(names, ages):
    print(f"{name} is {age} years old.")

Стек, очередь и устойчивая сортировка

Стек возвращает последним добавленный элемент: append() добавляет, pop() снимает верхушку.

Очередь возвращает первым добавленный элемент. Для эффективного удаления слева используйте deque.

Устойчивость сортировки означает, что элементы с одинаковым ключом остаются в исходном относительном порядке.

from collections import deque

stack = []
stack.append("open")
stack.append("edit")
print(stack.pop())

queue = deque(["print", "scan", "send"])
print(queue.popleft())
Проверить по документации: Современные уточнения в этом разделе сверяйте с актуальной документацией Python 3.x, особенно если используете поведение памяти или производительности как часть архитектурного решения.