Python-tupler: Den komplette guiden

En tuppel er en fundamental datastruktur i Python, brukt for å lagre en ordnet sekvens av elementer. Den har likhetstrekk med lister, men opererer med en litt høyere hastighet.

Imidlertid vil visse begrensninger gjøre lister mer foretrukket i enkelte situasjoner. I denne artikkelen vil jeg gi deg en omfattende forståelse av tupler, slik at du kan begynne å bruke dem effektivt.

Hva kjennetegner en tuppel?

Som nevnt, er en tuppel en innebygd datatype i Python som brukes til å organisere data. Den deler likhetstrekk med Pythons lister ved å samle data i et ordnet, array-lignende format. Den avgjørende forskjellen ligger i at en tuppel er uforanderlig; når den først er skapt, kan ikke dens innhold endres.

Det er ikke mulig å legge til nye elementer eller fjerne eksisterende. Derfor er tupler ideelle for å lagre data som ikke skal endres. De kan også inneholde data av ulike typer. I det følgende skal vi se nærmere på de forskjellige metodene for å lage tupler i Python.

Hvordan skape tupler i Python?

Det finnes minst tre måter å generere tupler i Python. Her skal vi gå gjennom de tre vanligste metodene du mest sannsynlig vil støte på i praksis og når du leser andres kode.

For å utføre kodeeksemplene nedenfor, må du ha Python installert. Hvis du ikke har Python, finnes det en veiledning for installasjon her. Alternativt kan du kjøre koden i en online Python-kjører som Google Colab.

#1. Bruk av Tuplens Literal (parenteser)

Den vanligste måten å definere tupler i Python er ved å inkludere en sekvens av verdier innenfor parenteser. Verdiene skal være separert med komma. Det følgende eksemplet illustrerer denne teknikken:

# Oppretter en tuppel ved å plassere verdier mellom parenteser
verdier = (1, 2, 3)

# Viser tuppelen på skjermen
print(verdier)

# Viser datatypen til variabelen "verdier"
print(type(verdier))

Ved å kjøre denne koden, får vi følgende resultat:

Som output viser, har tuplen de verdiene vi initialiserte den med, og dens type er .

Når du genererer tupler i Python, er det ikke strengt tatt nødvendig med parenteser. Uttrykket `verdier = 1, 2, 3` er like gyldig som `verdier = (1, 2, 3)`. Det anbefales imidlertid å bruke parenteser for å øke lesbarheten av koden.

Å skape tupler med ett enkelt element i Python krever en ekstra detalj. Istedenfor å bare plassere ett element innenfor parenteser, må du legge til et komma etter elementet. Her er et eksempel:

# Uten etterfølgende komma blir ikke dette en tuppel
ikke_en_tuppel = (1)

# Med etterfølgende komma, skapes en tuppel
en_tuppel = (1,)

# Viser ikke_en_tuppel
print(ikke_en_tuppel)

# Viser datatypen til ikke_en_tuppel
print(type(ikke_en_tuppel))

# Viser en_tuppel
print(en_tuppel)

# Viser datatypen til en_tuppel
print(type(en_tuppel))

Ved å utføre koden ovenfor, ser vi at `ikke_en_tuppel` blir en `int` med verdien 1. Det er viktig å huske på dette når du lager tupler.

#2. Bruk av Konstruktørfunksjonen

Den andre måten å lage tupler i Python er ved hjelp av tuppelens konstruktørfunksjon. I denne metoden kaller du funksjonen og sender et itererbart objekt, som en liste, som argument. Dette vil så bli konvertert til en tuppel. Her er et eksempel:

# Lager en tuppel fra en liste med verdier
verdier = tuple([1, 2, 3])

# Viser verdiene
print(verdier)

# Viser datatypen til variabelen "verdier"
print(type(verdier))

Som vi ser, oppnår man det samme resultatet ved bruk av funksjonen som ved å bruke literal. Funksjonen gir deg derimot muligheten til å lage en tuppel basert på en dynamisk verdi, for eksempel en liste der verdiene først er kjent ved kjøretid. Med den første metoden må du kjenne verdiene som skal inngå i tuppelen mens du skriver koden.

#3. Opprettelse av en tom tuppel

Når du arbeider med tupler i koden din, kan det være nødvendig å opprette tomme tupler. Tomme tupler skapes som forventet. Du kan benytte enten tuppelkonstruktøren eller literal for å generere dem. Her ser du et eksempel på begge metodene:

# Bruker tuppel-literal
tom_tuppel_1 = ()

# Bruker konstruktøren
tom_tuppel_2 = tuple()

Tomme tupler er nyttige for å representere et tomt sett av resultater. Tenk deg følgende funksjon:

def lag_rekke(start, slutt):
    return tuple(range(start, slutt))

Denne funksjonen skaper en tuppel med verdier fra startverdien opp til sluttverdien du sender inn. For å iterere over funksjonens resultater, ville du bruke noe som dette:

mine_verdier = lag_rekke(0, 5)

for verdi in mine_verdier:
    pass

Dersom du sendte 5 og 5 til `lag_rekke`-funksjonen, ville resultatet blitt en tom tuppel. Om du prøvde å iterere over den, ville det gitt null iterasjoner og koden ville fortsatte som normalt.

Om tomme tupler ikke eksisterte og du i stedet fikk verdien `None`, ville det resultert i en feil dersom man prøvde å iterere over den. For å forhindre at programmet krasjer, må du implementere en test for situasjonen der `lag_rekke`-funksjonen returnerer `None` eller en annen verdi som representerer en tom tuppel.

Dette kan fort føre til rotete kode. Ideelt sett ønsker man å unngå spesielle tilfeller så mye som mulig. Det betyr at returverdien fra alle funksjoner bør ha et identisk grensesnitt slik at koden din kan fungere i det generelle tilfellet så mye som mulig. I dette tilfellet betyr det å returnere en tuppel til enhver tid, også når den er tom.

Hvordan får man tilgang til elementer?

Det finnes to måter å få tilgang til en tuppels elementer i Python. Den første metoden er ved indeks, og den andre er ved destrukturering av elementene. La oss først undersøke hvordan man får tilgang til elementer etter indeks.

Tilgang til elementer ved hjelp av indeks

Å hente elementer via indeks er likt metoden brukt for å aksessere elementer i lister. Dette gjøres ved å bruke hakeparenteser. Tupler bruker et nullbasert indekssystem som betyr at det første elementet har indeks 0, det neste har indeks 1, og så videre.

Eksemplet nedenfor viser hvordan man kan hente elementer via indeks:

# Oppretter en tuppel
verdier = (1, 2, 3, 4)

# Aksesserer det første elementet
første_element = verdier[0]

# Aksesserer det fjerde elementet (indeks 3)
fjerde_element = verdier[3]

Du kan også benytte negativ indeksering. Elementet med indeks -1 er det siste elementet, og elementet med indeks -2 er det nest siste elementet.

# Oppretter en tuppel
verdier = (1, 2, 3, 4)

# Aksesserer det siste elementet
siste_element = verdier[-1]

# Aksesserer det nest siste elementet
nest_siste_element = verdier[-2] 

I tillegg kan du også aksessere delmengder av elementer fra en tuppel ved å gjøre et utsnitt av den. Dette er likt måten man utsnitt lister på. Notasjonen er som følger: `[::]`. Følgende eksempel viser utsnitt:

# Oppretter en tuppel
verdier = (1, 2, 3, 4, 5, 6, 7)

# Henter de tre første elementene
verdier[1: 3]

# Henter hvert andre element
verdier[::2]

Iterering over elementer

En tuppel er et itererbart objekt i Python. Derfor kan du iterere over elementene ved å bruke en for-løkke, som vist i eksemplet nedenfor:

verdier = (1, 2, 3, 4)

for verdi in verdier:
    print(verdi)

Denne metoden for å få tilgang til elementer er ideell når du vil ha tilgang til alle elementene i tuppelen.

Tilgang til elementer ved destrukturering

For å forklare destrukturering, la oss tenke oss et scenario der vi ønsker å hente ut de forskjellige elementene i en tuppel.

# Oppretter en tuppel for å lagre en brukers informasjon
person_info = (1, 'John Doe', '[email protected]')

# Aksesserer de forskjellige elementene for bruk i koden
id = person_info[1]
navn = person_info[2]
epost = person_info[3]

Python tilbyr oss en mer praktisk måte å aksessere verdiene på, som illustrert nedenfor:

# Oppretter en tuppel for å lagre en brukers informasjon
person_info = (1, 'John Doe', '[email protected]')

id, navn, epost = person_info

Dette kalles destrukturering. Den første variabelen, `id` i dette tilfellet, vil bli tildelt den første verdien i tuppelen, den andre variabelen det andre elementet, og så videre. Eksemplet ovenfor er det samme som dette:

id, navn, epost = (1, 'John Doe', '[email protected]')

I dette tilfellet, i stedet for å lagre tuppelen i en variabel, destrukturerer vi den umiddelbart. Når du kombinerer dette med kunnskapen om at det ikke er nødvendig med parenteser for å lage tupler, kan koden skrives slik:

id, navn, epost = 1, 'John Doe', '[email protected]'

Etter dette vil du ha variablene `id`, `navn` og `epost` som holder verdiene 1, «John Doe», og «[email protected]«. Dette er en praktisk og konsis måte å lage variabler i Python, noe du vil se ofte i produksjonskode. Det er nyttig å vite at kjernen i denne elegante syntaksen er konseptet med tupler.

Forskjeller mellom tupler og lister

Selv om tupler og lister har likheter, er det vesentlige forskjeller som gjør dem mer egnet for spesifikke bruksområder. Å forstå disse forskjellene vil hjelpe deg å velge den beste datatypen og skrive mer effektiv kode.

Aspekt Tuppel Liste
Minneplassering Lagret i sammenhengende minne Lagret i forskjellige minneområder
Foranderlighet Uforanderlig (kan ikke endres) Foranderlig (kan endres)
Hastighet Raskere tilgang Langsommere tilgang
Datatype Ofte brukt til å lagre ulike datatyper Ofte brukt til å lagre data av samme type
Bruksområde Vanligvis for å lagre samlinger av merker Vanligvis for å lagre samlinger av lignende verdier

Fordeler med tupler

#1. De er raskere

På grunn av måten tuppelens verdier lagres i sammenhengende minne, er tilgangen til verdiene raskere sammenlignet med lister. Ettersom de er uforanderlige etter opprettelse, er ikke tupler alltid den beste datastrukturen for lagring av verdier.

Deres ideelle bruk er for å lagre store datamengder i minne som ikke endres, men som blir aksessert flere ganger under kjøring. I dette tilfellet vil programmet dra stor nytte av ytelsesforbedringen som tupler gir.

#2. Returnerer flere verdier

Du kan bruke tupler til å returnere flere verdier fra en funksjon og destrukturere resultatet. For eksempel:

from random import randint

def lag_to_tall():
    første_tall = randint(0, 9)
    andre_tall = randint(0, 9)

    return første_tall, andre_tall

første_tall, andre_tall = lag_to_tall()

I dette eksemplet har vi en funksjon som genererer to tilfeldige tall og returnerer dem i en tuppel. Uttrykket `return første_tall, andre_tall` er det samme som å skrive `return (første_tall, andre_tall)`. Dette er fordi parenteser er valgfrie når du oppretter tupler. For å aksessere resultatet, destrukturerer vi det.

#3. Verdiene er skrivebeskyttet

Tupler er uforanderlige etter opprettelse. Derfor er de ideelle for å lagre data i minnet som ikke skal endres under programkjøring. De sikrer at du ikke ved et uhell overskriver dataene andre steder i koden.

#4. Lagre flere datatyper

Tupler lar deg lagre verdier av flere datatyper. Dette gjør det mulig å lage enheter med data, som å lagre detaljer om en bruker i en tuppel. Du kan også lagre mer komplekse elementer som funksjoner, ordbøker, andre tupler og til og med lister.

Vanlige Tupler-metoder

#1. count()

Tuppel-objektet har en `count`-metode som teller antall forekomster av et element. For eksempel:

# Oppretter en tuppel med flere tall
verdier = (1, 2, 3, 4, 5, 4, 4, 6)

# Teller antall forekomster av tallet 4
antall_firere = verdier.count(4)

# Viser antall firere
print(antall_firere)

Fra dette eksemplet ser vi at tallet 4 forekommer nøyaktig tre ganger i tuppelen.

#2. index()

`index`-metoden kan brukes til å finne indeksen til den første forekomsten av en verdi i en tuppel. Hvis verdien ikke eksisterer, vil et `ValueError`-unntak bli kastet. Her er en kode som viser hvordan `index`-metoden fungerer:

# Oppretter en tuppel med flere tall
verdier = (1, 2, 3, 4, 5, 4, 4, 6)

# Søker etter indeksen til tallet 4
indeks_av_fire = verdier.index(4)
print("Indeks av fire:", indeks_av_fire)

# Søker etter indeksen til tallet 9
indeks_av_ni = verdier.index(9)
print("Indeks av ni:", indeks_av_ni)

Og ved å kjøre koden ovenfor, ser vi følgende output:

I dette tilfellet er indeksen til 4 lik 3, og koden kjørte uten problemer. Men da det gjaldt å finne indeksen til tallet 9, oppstod et unntak. Det er viktig å håndtere slike unntak når du skriver Python-programmer som bruker `index`-metoden.

#3. len()

Som alle itererbare objekter i Python, har tupler en `length`-egenskap som du kan aksessere ved å sende inn tuppelen som et argument til `len()`-funksjonen.

# Oppretter en tuppel
verdier = (1, 2, 3, 4)

# Henter lengden
lengde = len(verdier)

# Viser resultatet
print(lengde)

Dette er resultatet av å kjøre koden over.

#4. min() og maks()

`min` og `maks`-metodene fungerer ved å gå gjennom hvert element i en itererbar verdi og sammenligne om det er større eller mindre enn det forrige. `maks` vil til slutt returnere det største elementet i iteratoren mens `min` returnerer det minste.

Med tall er operasjonen åpenbar. Med strenger vil Python bruke alfabetisk rekkefølge. Det minste ordet, returnert med `min`, er det første ordet om strengene var skrevet i alfabetisk rekkefølge, mens det største ordet, returnert med `maks`, er det siste ordet. Hvis den itererbare verdien inneholder en blanding av forskjellige datatyper, vil begge operasjonene feile, fordi Python ikke vet hvordan de skal sammenligne forskjellige datatyper.

Her er et kodeeksempel:

# Oppretter en tuppel med verdier
verdier = (1, 2, 3, 4, 5)

# Henter den største verdien
største = max(verdier)

# Henter den minste verdien
minste = min(verdier)

# Viser resultatet
print(største)
print(minste)

#5. sorted()

Den `sorted()`-funksjonen i Python tar en itererbar verdi og returnerer en sortert liste over elementene. Du kan kalle `sorted()`, sende inn en tuppel som argument, og få elementene i tuppelen sortert som en liste. For å konvertere den sorterte listen tilbake til en tuppel, kan du bruke konstruktørfunksjonen. Her er et eksempel:

# Oppretter en tuppel med verdier i tilfeldig rekkefølge
verdier = (1, 5, 3, 3, 2, 4)

# Bruker sorted() for å sortere verdiene til en liste
sortert_liste = sorted(verdier)

# Konverterer listen til en tuppel
sortert_tuppel = tuple(sortert_liste)

# Viser resultatet
print(sortert_tuppel)

#6. Legge til og multiplisere tupler

Addisjonsoperasjonen på to tupler slår dem enkelt sammen. Multiplikasjonsoperasjonen repeterer elementene i en tuppel like mange ganger som verdien du multipliserte med. Her er et eksempel som viser begge operasjonene.

# Oppretter en tuppel med noen verdier
verdier = (1, 2, 3, 4, 5)

# Oppretter en ny tuppel med addisjon
lagt_til = verdier + verdier

# Oppretter en ny tuppel med multiplikasjon
multiplisert = verdier * 2

print("verdier + verdier =", lagt_til)
print("verdier * 2 =", multiplisert)

Avsluttende tanker

I denne artikkelen lærte du at:

  • Tupler er liste-lignende objekter som brukes for å lagre sekvenser av verdier.
  • I motsetning til lister, er de uforanderlige.
  • De er raskere og mer effektive enn lister.
  • De kan konstrueres ved å bruke parenteser og skille verdier med komma.
  • De kan også konstrueres ved hjelp av tuppelens konstruktørfunksjon.
  • Du kan aksessere individuelle verdier ved å bruke et nullbasert indekssystem.
  • Du kan også destrukturere verdier fra tuppelen.
  • Du kan også iterere over verdier ved hjelp av en for-løkke.
  • Du har også lært de forskjellige metodene du kan bruke med tupler.

Dersom du er interessert i mer Python-innhold, kan du sjekke ut artikler om Python List Methods og Python Dictionary Methods.