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
matrix[1][2] → 6 – najpierw łańcuch znaków, potem kolumna
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!
grid[0]grid[1]grid[2][0, 0, 0]
[[0]*3]*3 tworzy JEDEN wewnętrzny lista i kopiuje do niego odnośnik trzy razy
*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
Otwórz praktykę →