2.8. Tuples¶
Een tuple is een onveranderlijke, geordende reeks waarden. Eenmaal aangemaakt kunnen de items erin niet meer worden toegevoegd, verwijderd of gewijzigd.
2.8.1. Tuples maken¶
Gebruik haakjes (of gewoon komma’s) om een tuple te maken:
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. De valkuil van één element¶
Haakjes rond een waarde zijn slechts haakjes; wat een tuple werkelijk maakt is de komma. Een tuple van één element heeft een afsluitende komma nodig:
>>> (1)
1 # just an int in parens
>>> (1,)
(1,) # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)
2.8.2. Lengte, indexeren en slicen¶
Hetzelfde als bij lijsten en strings – len(), indexeren, slicen, in en + / * werken allemaal op dezelfde manier:
>>> 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. Onveranderlijkheid¶
Tuples hebben geen append, pop, sort of enige andere methode die ter plekke wijzigt. Toewijzing via een index veroorzaakt een 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
Om een tuple te “wijzigen”, bouw je een nieuwe met de gewijzigde waarden.
2.8.4. Uitpakken¶
De belangrijkste superkracht van een tuple is uitpakken: elk item in één instructie aan een aparte variabele toewijzen.
Uitpakken bindt elk element van een tuple aan een benoemde variabele in één toewijzing.¶
>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4
De rechterkant kan elke iterabele zijn – een lijst, een string, de retourwaarde van een functie:
>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')
Een voorafgaande * verzamelt “de rest” van een uitpakking in een lijst:
>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]
2.8.5. Meerdere retourwaarden¶
Een functie kan een tuple retourneren om meerdere waarden tegelijk te leveren; de aanroeper pakt ze bij ontvangst uit:
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
De haakjes bij de return zijn optioneel – een kale return a, b is ook een tuple.
2.8.6. Tuple versus list¶
Een praktische richtlijn voor welke je moet kiezen:
Tuple voor gegevens met een vaste vorm, vaak heterogeen:
(x, y)-punten,(r, g, b)-kleuren, meerdere retourwaarden, functieargumenten verpakt voor later gebruik.List voor gegevens met variabele lengte, vaak homogeen: een lijst metingen, een wachtrij met te verwerken items, alles waaraan je verwacht toe te voegen.
Tuples zijn ook hashbaar (zolang elk element erin hashbaar is), dus ze kunnen worden gebruikt als sleutels in een dict.