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.

Een tuple van drie elementen (1, 2, 3) dat wordt uitgepakt in drie benoemde variabelen x, y, z.

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.