2.8. Krotki

Krotka to niezmienna, uporządkowana sekwencja wartości. Po utworzeniu elementów w środku nie można dodawać, usuwać ani zmieniać.

2.8.1. Tworzenie krotek

Użyj nawiasów (lub po prostu przecinków), aby utworzyć krotkę:

empty   = ()
point   = (3, 4)
triple  = 1, 2, 3                # parentheses are optional
mixed   = (1, "two", 3.14)
nested  = ((1, 2), (3, 4))

2.8.1.1. Pułapka jednoelementowa

Nawiasy wokół wartości to po prostu nawiasy; tym, co faktycznie tworzy krotkę, jest przecinek. Krotka jednoelementowa wymaga końcowego przecinka:

>>> (1)
1                                # just an int in parens
>>> (1,)
(1,)                             # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)

2.8.2. Długość, indeksowanie i wycinanie

Tak samo jak listy i łańcuchy znaków – len(), indeksowanie, wycinanie, in oraz + / * działają w ten sam sposób:

>>> point = (3, 4, 5)
>>> len(point)
3
>>> point[0]
3
>>> point[1:]
(4, 5)
>>> 4 in point
True
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)

2.8.3. Niezmienność

Krotki nie mają append, pop, sort ani żadnej innej metody działającej w miejscu. Przypisanie z indeksem zgłasza TypeError:

>>> point = (3, 4)
>>> point[0] = 99
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment

Aby „zmodyfikować” krotkę, zbuduj nową ze zmienionymi wartościami.

2.8.4. Rozpakowywanie

Główną supermocą krotki jest rozpakowywanie: przypisanie każdego elementu do osobnej zmiennej w jednej instrukcji.

Trójelementowa krotka (1, 2, 3) rozpakowywana do trzech nazwanych zmiennych x, y, z.

Rozpakowywanie wiąże każdy element krotki z nazwaną zmienną w jednym przypisaniu.

>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4

Prawa strona może być dowolnym obiektem iterowalnym – listą, łańcuchem znaków, wartością zwracaną przez funkcję:

>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')

Wiodąca * zbiera „resztę” rozpakowania do listy:

>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]

2.8.5. Wiele wartości zwracanych

Funkcja może zwrócić krotkę, aby dostarczyć kilka wartości naraz; wywołujący rozpakowuje je przy wejściu:

def size_of(rect):
    return (rect[2] - rect[0], rect[3] - rect[1])

width, height = size_of((10, 20, 110, 140))
# width = 100, height = 120

Nawiasy w return są opcjonalne – samo return a, b to też krotka.

2.8.6. Krotka a lista

Praktyczny przewodnik, po co sięgnąć:

  • Krotka dla danych o stałym kształcie, często niejednorodnych: punkty (x, y), kolory (r, g, b), wiele wartości zwracanych, argumenty funkcji spakowane do późniejszego użycia.

  • Lista dla danych o zmiennej długości, często jednorodnych: lista pomiarów, kolejka elementów do przetworzenia, wszystko, do czego spodziewasz się dołączać.

Krotki są również haszowalne (o ile każdy element w środku jest haszowalny), więc mogą być używane jako klucze w dict.