Глава 11 · Очень много информации!

Преобразования и comprehensions

От list()/tuple()/set() до компактного способа строить новые коллекции одной строкой — но только после того, как понятен обычный цикл.

Преобразования между коллекциями

preobrazovaniya.py
print(list("Python"))            # ['P', 'y', 't', 'h', 'o', 'n']
print(tuple([1, 2, 3]))          # (1, 2, 3)
print(set([1, 1, 2, 3]))          # {1, 2, 3}
dict() требует пары «ключ, значение»
dict(...) превращает в словарь не любую коллекцию, а только такую, из которой можно собрать пары: например, dict(zip(a, b)) из §11.14. Просто dict([1, 2, 3]) вызовет ошибку.

Строка ↔ список — самое частое преобразование

строка"a,b,c"split()['a', 'b', 'c']join()"a,b,c"
text.split() → список, ' '.join(список) → строка обратно
split_join.py
text = "python git linux"
words = text.split()
print(words)          # ['python', 'git', 'linux']
print(" ".join(words))   # "python git linux"

sorted() для разных коллекций

sorted_raznoe.py
print(sorted((3, 1, 2)))          # [1, 2, 3] — из кортежа
print(sorted({3, 1, 2}))           # [1, 2, 3] — из множества
print(sorted({"b": 1, "a": 2}))   # ['a', 'b'] — из словаря сортируются КЛЮЧИ
sorted() всегда возвращает список
Независимо от того, что было на входе — кортеж, множество или словарь — sorted() всегда отдаёт обычный list.

List comprehension — уже знакомо, теперь по шагам

comprehension_klassika.py
kvadraty = []
for n in range(1, 6):
    kvadraty.append(n ** 2)
print(kvadraty)
comprehension_novyj.py
kvadraty = [n ** 2 for n in range(1, 6)]
print(kvadraty)
источникrange(1, 6)выражениеn ** 2результат[1, 4, 9, 16, 25]
[выражение for n in источник] — то же самое, что цикл, но в одну строку

Comprehension с условием

comprehension_uslovie.py
chetnye = [n for n in range(10) if n % 2 == 0]
print(chetnye)   # [0, 2, 4, 6, 8]
источникrange(10)фильтрif n % 2 == 0результат[0, 2, 4, 6, 8]
Условие в конце — фильтр: элемент попадёт в результат, только если условие True

Set и dict comprehension

set_comprehension.py
unikalnye_bukvy = {ch.lower() for ch in "Python"}
print(unikalnye_bukvy)
dict_comprehension.py
kvadraty_slovar = {n: n ** 2 for n in range(5)}
print(kvadraty_slovar)   # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Та же идея «источник → выражение → результат», только результат оформляется в фигурных скобках — с двоеточием получаем словарь, без — множество.

Чуть глубже — генераторные выражения
(n ** 2 for n in range(5)) — генераторное выражение, похожее на comprehension, но не строящее список целиком в памяти сразу, а отдающее значения по одному. Пригодится позже, когда будем говорить об итераторах и работе с большими объёмами данных.
Сборка списка: цикл vs comprehension
Цикл с append()
kuby = []
for n in range(1, 6):
    if n % 2 == 0:
        kuby.append(n ** 3)
List comprehension
kuby = [n ** 3 for n in range(1, 6) if n % 2 == 0]
Что использовать сегодня: comprehension для простых преобразований и фильтров — короче и читается как одна мысль. Но comprehension — это НЕ универсальный инструмент глубокого копирования и не заменяет цикл, если внутри нужны побочные эффекты (print, запись в файл, несколько условий с разной логикой) — тогда обычный цикл с append() читается понятнее.
Практика: преобразования и comprehensions
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →