Rozdział 11 · Mnóstwo informacji!
Jeszcze ciekawsze rzeczy z listami!
Przydatne wbudowane funkcje, listy zagnieżdżone, znana pułapka mnożenia list zagnieżdżonych – oraz bardziej zwięzły sposób tworzenia nowych list.
Kilka dodatkowych sztuczek, które często przydają się przy pracy z listami.
len(), min(), max(), sum()
vstroennye_funkcii.py
chisla = [4, 8, 15, 16, 23, 42]
print(len(chisla)) # 6 — liczba elementów
print(min(chisla)) # 4
print(max(chisla)) # 42
print(sum(chisla)) # 108
Listy Listy (Podlisty) - Macierz
Elementem listy może być inny lista — tak powstają tabele (macierze):
vlozhennye_spiski.py
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(matrix[0]) # [1, 2, 3] — pierwszy łańcuch znaków
print(matrix[0][1]) #2 jest drugim elementem pierwszej linijki
print(matrix[1][2]) #6 – łańcuch znaków 1, kolumna 2
kolumna 0
kolumna 1
kolumna 2
łańcuch znaków 0
1
2
3
łańcuch znaków 1
4
5
6
łańcuch znaków 2
7
8
9
perebor_matricy.py
for row in matrix:
for value in row:
print(value, end=' ')
print()
Zagnieżdżony lista + zagnieżdżona pętla — bezpośredni przeniesienie z rozdziału 10
Zewnętrzna pętla idzie po łańcuch znaków, wewnętrzna — po wartościach w wierszu. To dokładnie ten sam wzorzec zagnieżdżonych pętli, co tabliczka mnożenia w rozdziale 10, tylko teraz dane są już gotowe w postaci macierzy, a nie obliczane na bieżąco.
Pułapka: [[0] * 3] * 3
chcę stworzyć siatkę 3×3 z zer w jednej linii — ale to częsty i podstępny błąd:
lovushka_umnozheniya.py
grid = [[0] * 3] * 3
grid[0][0] = 1
print(grid) # [[1, 0, 0], [1, 0, 0], [1, 0, 0]] – WSZYSTKIE linie się zmieniły!
*3 powtarza odwołanie, zamiast tworzyć trzy niezależne listy
[значение] * n dla wartości niezmiennych (liczb, łańcuch znaków) działa bezpiecznie. Ale gdy значение sam jest listą, * n po prostu kopiuje odniesienie do tych samych wewnętrznych lista n czasów — dokładnie ta sama zasada aliasing z §11.9. Poprawnym sposobem utworzenia trzech NIEZALEŻNYCH wierszy jest comprehension:pravilnaya_setka.py
grid = [[0] * 3 for _ in range(3)]
grid[0][0] = 1
print(grid) # [[1, 0, 0], [0, 0, 0], [0, 0, 0]] - tylko pierwszy łańcuch znaków
Iteracja listy pętlą for
perebor_spiska_v4.py
fruits = [„jabłko”, „banan”, „wiśnia”]
for fruit in fruits:
print(fruit)
Budowanie listy: Pętla z generatorem append() → List
Klasyczne podejście
kvadraty = []
for n in range(1, 6):
kvadraty.append(n ** 2)
print(kvadraty)
Nowoczesny Python (list comprehension)
kvadraty = [n ** 2 for n in range(1, 6)]
print(kvadraty)
Co używać dzisiaj: list comprehension (generator list) dla prostych przypadków — istnieje w Python od wersji 2.0, więc to nie kwestia nowości, a kwestia stylu: krócej i, przy pewnej praktyce, czyta się jak jedno zdanie („kwadrat n dla każdego n z zakresu”). Dla bardziej skomplikowanej logiki (z kilkoma warunkami lub efektami ubocznymi) pętla z
append() często pozostaje jaśniejsze — nie zawsze jest „gorzej”Praktyka: len/min/max/sum, listy zagnieżdżone, list comprehension
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji