2.8. Tuples¶
En tupel är en oföränderlig, ordnad följd av värden. När den väl har skapats kan elementen inuti inte läggas till, tas bort eller ändras.
2.8.1. Skapa tupler¶
Använd parenteser (eller bara kommatecken) för att skapa en tupel:
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. Fallgropen med ett enda element¶
Parenteser runt ett värde är bara parenteser; det som faktiskt gör en tupel är kommatecknet. En tupel med ett element behöver ett avslutande kommatecken:
>>> (1)
1 # just an int in parens
>>> (1,)
(1,) # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)
2.8.2. Längd, indexering och slicing¶
Samma som för listor och strängar – len(), indexering, slicing, in och + / * fungerar alla på samma sätt:
>>> 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. Oföränderlighet¶
Tupler har inte append, pop, sort eller någon annan metod som verkar på plats. Indexerad tilldelning utlöser 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
För att ”ändra” en tupel bygger du en ny med de ändrade värdena.
2.8.4. Uppackning¶
En tupels främsta superkraft är uppackning: att tilldela varje element till en separat variabel i en enda sats.
Uppackning binder varje element i en tupel till en namngiven variabel i en enda tilldelning.¶
>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4
Högersidan kan vara valfri itererbar – en lista, en sträng, returvärdet från en funktion:
>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')
Ett inledande * samlar ”resten” av en uppackning i en lista:
>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]
2.8.5. Flera returvärden¶
En funktion kan returnera en tupel för att leverera flera värden på en gång; anroparen packar upp dem på vägen in:
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
Parenteserna kring return är valfria – ett naket return a, b är också en tupel.
2.8.6. Tupel kontra lista¶
En praktisk vägledning för vilken du ska ta till:
Tupel för data med fast form, ofta heterogena:
(x, y)-punkter,(r, g, b)-färger, flera returvärden, funktionsargument packade för senare bruk.Lista för data med variabel längd, ofta homogena: en lista med mätningar, en kö med element att behandla, allt du förväntar dig att lägga till i.
Tupler är också hashbara (så länge varje element inuti är hashbart), så de kan användas som nycklar i en dict.