Rozdział 11 · Mnóstwo informacji!

Przemiany i comprehensions

Od list()/tuple()/set() do zwartego sposobu budowania nowych kolekcji w jednej linii — ale dopiero po zrozumieniu zwykłego cyklu.

Konwersje między kolekcjami

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() wymaga pary „klucz, wartość”
dict(...) przekształca w słownik nie każdą kolekcję, tylko taką, z której można utworzyć pary: na przykład, dict(zip(a, b)) z §11.14. Proste dict([1, 2, 3]) spowoduje błąd.

String lista ↔ to najczęstsza konwersja

łańcuch znaków"a,b,c"split()['a', 'b', 'c']join()"a,b,c"
text.split() → lista, ' '. join(lista) → łańcuch znaków z powrotem
split_join.py
text = "python git linux"
words = text.split()
print(words)          # ['python', 'git', 'linux']
print(" ".join(words))   # "python git linux"

sorted() dla różnych kolekcji

sorted_raznoe.py
print(sorted((3, 1, 2)))          # [1, 2, 3] - z krotki
print(sorted({3, 1, 2}))           # [1, 2, 3] — zestawu
print(sorted({"b": 1, "a": 2}))   # ['a', 'b'] — KLUCZE są sortowane ze słownika
sorted() zawsze zwraca lista
Niezależnie od tego, co było przy wejściu – konwoj, zbiór czy słownik – sorted() zawsze daje to, co zwykle. list.

List comprehension już jest znajome, teraz krok po kroku

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)
źródłorange(1, 6)wyraz twarzyn ** 2wynik[1, 4, 9, 16, 25]
[wyrażenie for n in źródło] jest tym samym co pętla, ale w jednej linii

Comprehension z warunkiem

comprehension_uslovie.py
chetnye = [n for n in range(10) if n % 2 == 0]
print(chetnye)   # [0, 2, 4, 6, 8]
źródłorange(10)filtrif n % 2 == 0wynik[0, 2, 4, 6, 8]
Końcowy warunek - Filtr: Element zostanie uwzględniony w wyniku tylko wtedy, gdy warunek True

Set i 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}

Ta sama idea „źródło → wyrażenie → wynik”

Trochę głębiej — wyrażenia generatorowe
(n ** 2 for n in range(5)) — wyrażenie generatorowe, podobne do comprehension, ale nie budujące lista całego na raz w pamięci, tylko zwracające wartości po jednej. Przyda się później, gdy będziemy mówić o iteratorach i pracy z dużymi zbiorami danych.
Budowanie listy: cykl vs comprehension
Cykl z 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]
Co używać dzisiaj: comprehension prostych transformacji i filtrów — krótko mówiąc, i czyta się jak jedna myśl. Ale comprehension NIE jest uniwersalnym narzędziem do głębokiego kopiowania i nie zastępuje pętli, jeśli potrzebujesz efektów ubocznych w środku (print, zapis do pliku, kilka warunków z inną logiką) — wtedy zwykła pętla z append() jest łatwiejsza do odczytania.
Praktyka: transformacje i comprehensions
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →