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
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)
Comprehension z warunkiem
comprehension_uslovie.py
chetnye = [n for n in range(10) if n % 2 == 0]
print(chetnye) # [0, 2, 4, 6, 8]
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