Hva er et tuppel nyttig for?

stemmer
38

Jeg lærer Python for en klasse nå, og vi bare dekket tupler som en av de datatypene. Jeg leste Wikipedia på det, men jeg kunne ikke finne ut hvor en slik datatype vil være nyttig i praksis. Kan jeg få noen eksempler, kanskje i Python, hvor en uforanderlig sett med tall ville være nødvendig? Hvordan er dette forskjellig fra en liste?

Publisert på 03/09/2008 klokken 16:13
kilden bruker
På andre språk...                            


10 svar

stemmer
47

  • Tupler brukes når du ønsker å returnere flere resultater fra en funksjon.
  • Siden de er uforanderlige, kan de brukes som nøkler for en ordbok (lister kan ikke).
Svarte 03/09/2008 kl. 16:18
kilden bruker

stemmer
18

Tupler gjøre gode ordbok tastene når du trenger å kombinere mer enn en bit av data inn i din nøkkel og ikke lyst til å lage en klasse for det.

a = {}
a[(1,2,"bob")] = "hello!"
a[("Hello","en-US")] = "Hi There!"

Jeg har brukt denne funksjonen først og fremst å skape en ordbok med nøkler som er koordinatene til punktene av en maske. Men i mitt tilfelle, nøyaktig sammenligning av de flyter involverte fungerte fint som kanskje ikke alltid være tilfelle for ditt formål [i så fall ville jeg nok konvertere innkommende flyter til noen form for fast punkt heltall]

Svarte 03/09/2008 kl. 16:20
kilden bruker

stemmer
8

Jeg liker denne forklaringen .

I utgangspunktet bør du bruke tuples når det er en konstant struktur (den første posisjonen alltid holder en type valuta og andre en annen, og så videre), og listene skal brukes for lister over homogene verdier.

Selvfølgelig er det alltid unntak, men dette er en god generell retningslinje.

Svarte 07/09/2008 kl. 13:12
kilden bruker

stemmer
2

Den beste måten å tenke på det er:

  • En tuppel er en rekord som har felt har ikke navn.
  • Du bruker en tuppel i stedet for en rekord når du ikke gidder å angi feltnavnene.

Så i stedet for å skrive ting som:

person = {"name": "Sam", "age": 42}
name, age = person["name"], person["age"]

Eller enda mer utførlig:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person("Sam", 42)
name, age = person.name, person.age

Du kan bare skrive:

person = ("Sam", 42)
name, age = person

Dette er nyttig når du ønsker å passere rundt en rekord som har bare et par felt, eller en rekord som bare brukes i noen få steder. I så fall angi en helt ny rekord type med feltnavn (i Python, ville du bruke et objekt eller en ordbok, som ovenfor) kan være for detaljert.

Tupler stammer fra verden av funksjonell programmering (Haskell, Objective Caml, Elm, F #, etc.), hvor de blir ofte brukt til dette formålet. I motsetning til Python er mest funksjonelle programmeringsspråk statisk skrevet (en variabel kan kun ha en type verdi, og at typen er bestemt ved kompilering). Statisk typing gjør rollen tupler mer åpenbar. For eksempel i Elm språk:

type Person = (String, Int)

person : Person
person = ("Sam", 42)

Dette understreker det faktum at en bestemt type tuppel er alltid lov til å ha et fast antall felt i en fast rekkefølge, og hver av disse feltene er alltid ment å være av samme type. I dette eksempel vil en person er alltid en tuppel av to felt, er en en snor, og den andre er et heltall.

Ovennevnte er i sterk kontrast til lister , som er ment å være variabel lengde (antall elementer er normalt forskjellig i hver liste, og du skriver funksjoner for å legge til og fjerne elementer) og hvert element i listen er vanligvis av samme type . For eksempel, ville du ha en liste over personer og en annen liste over adresser - du vil ikke blande folk og adresser på den samme listen. Mens blanding av forskjellige typer av data i den samme tuppel er hele poenget med tupler. Felt i en tuppel er vanligvis av forskjellige typer (men ikke alltid - for eksempel kan du ha en (Float, Float, Float)tuppel å representere x, y, z koordinater).

Tupler og listene er ofte nestet. Det er vanlig å ha en liste med tupler. Du kunne ha en liste over Person tupler like godt som en liste over Person stedene. Du kan også ha en tuppel felt der verdien er en liste. For eksempel, hvis du har en adressebok der en person kan ha flere adresser, kan du ha en tuppel av type (Person, [String]). Den [String]typen er vanligvis brukes i funksjonelle programmeringsspråk for å betegne en liste over strenger. I Python, ville du ikke skrive ned typen, men du kan bruke tuples sånn på akkurat samme måte, å sette et Personobjekt i det første feltet i en tuppel og en liste over strenger i sitt andre felt.

I Python, oppstår forvirring fordi språket ikke håndheve noen av disse praksis som håndheves av kompilatoren i statisk skrevet funksjonelle språk. I disse språkene, kan du ikke blande ulike typer tupler. For eksempel kan du ikke returnere et (String, String)tuppel fra en funksjon som typen sier at den returnerer en (String, Integer)tuppel. Du kan heller ikke returnere en liste når typen sier at du har tenkt å returnere et tuppel, og vice versa. Lister brukes strengt for voksende samlinger av gjenstander, og tupler strengt for fast størrelse poster. Python ikke stoppe deg fra å bryte noen av disse reglene hvis du vil.

I Python er en liste noen ganger omgjort til et tuppel for bruk som en ordbok nøkkelen, fordi Python ordbok nøkler må være uforanderlig (dvs. konstant) verdier, mens Python listene er foranderlig (du kan legge til og fjerne elementer når som helst). Dette er en midlertidig løsning for en bestemt begrensning i Python, ikke en egenskap av tupler som en datavitenskap konsept.

Så i Python, listene er foranderlig og tupler er uforanderlig. Men dette er bare et designvalg, ikke en iboende egenskap av lister og tupler i informatikk. Du kunne like godt ha uforanderlige lister og foranderlig tupler.

I Python (med standard CPython implementering), tupler er også raskere enn objekter eller ordbøker for de fleste formål, slik at de blir noen ganger brukt av den grunn, selv når du navngir feltene ved hjelp av et objekt eller ordbok ville bli klarere.

Til slutt, for å gjøre det enda mer åpenbart at tupler er ment å være en annen slags rekord (ikke en annen form for liste), Python har også navngitt tupler :

from collections import namedtuple

Person = namedtuple("Person", "name age")

person = Person("Sam", 42)
name, age = person.name, person.age

Dette er ofte det beste valget - kortere enn definerer en ny klasse, men betydningen av feltene er mer opplagt enn ved bruk av vanlige tupler som har felt har ikke navn.

Uforanderlige lister er svært nyttig for mange formål , men temaet er altfor komplisert til å svare her. Hovedpoenget er at ting som ikke kan endres er lettere å resonnere om enn ting som kan endre. De fleste programvarefeil kommer fra ting endrer på uventede måter, så begrenser hvordan de kan endre er en god måte å eliminere feil. Hvis du er interessert, anbefaler jeg å lese en tutorial for et funksjonelt programmeringsspråk som Elm, Haskell eller Clojure (Elm er den vennligste). Designerne av disse språkene anses uforanderlighet så nyttig at alle lister er uforanderlig der. (I stedet for å endre en liste for å legge til og eller fjerne et element, du lage en ny liste med elementet lagt til eller fjernet . Immutability garanterer at den gamle kopi av listen aldri kan endres, slik at kompilatoren og runtime kan gjøre koden resultater ved å gjenbruke deler av den gamle listen i ny og søppel-samle venstre-over deler når de blir lenger er nødvendig.)

Svarte 25/09/2018 kl. 14:45
kilden bruker

stemmer
2

Tupler og lister har samme bruk generelt. Uforanderlige datatyper generelt har mange fordeler, for det meste om samtidighet problemer.

Så, når du har lister som ikke er flyktige i naturen, og du trenger for å garantere at ingen forbruker er å endre det, kan du bruke en tuppel.

Typiske eksempler er faste data i et program som selskapets divisjoner, kategorier, etc. Hvis dette dataendring, vanligvis en enkelt produsent rebuilts tuppel.

Svarte 03/09/2008 kl. 16:25
kilden bruker

stemmer
2

Jeg synes de er nyttig når du alltid forholde seg til to eller flere objekter som et sett.

Svarte 03/09/2008 kl. 16:19
kilden bruker

stemmer
1

En tuppel er en sekvens av verdier. Verdiene kan være en hvilken som helst type, og de er indeksert av heltall, slik at tuppeler ikke som lister. Den viktigste forskjellen er at tuples er uforanderlig.

En tuppel er et kommadelt liste over verdier:

t = 'p', 'q', 'r', 's', 't'

Det er god praksis å legge tupler i parentes:

t = ('p', 'q', 'r', 's', 't') 
Svarte 22/09/2016 kl. 11:54
kilden bruker

stemmer
1

En tuppel er nyttig for lagring av flere verdier .. Som du merke en tuppel er akkurat som en liste som er uforanderlig - f.eks når laget du kan ikke legge til / fjerne / bytte elementer.

En fordel med å være uforanderlige er at fordi tuppel er fast størrelse det gjør oppkjøringen tid til å utføre visse optimaliseringer. Dette er spesielt gunstig når en tupple anvendes i forbindelse med en returverdi eller en parameter til en funksjon.

Svarte 03/09/2008 kl. 16:23
kilden bruker

stemmer
1

En liste kan alltid erstatte en tuppel, med hensyn til funksjonalitet (unntatt, tilsynelatende, som taster i en dict). Imidlertid kan en tuppel gjøre ting går raskere. Det samme gjelder for, for eksempel, uforanderlige strenger i Java - når vil du aldri trenger å være i stand til å endre dine strenger? Aldri!

Jeg har nettopp lest en anstendig diskusjon om å begrense hva du kan gjøre for å ta bedre programmer, Hvorfor hvorfor funksjonell programmering Matters Matters

Svarte 03/09/2008 kl. 16:20
kilden bruker

stemmer
0

I tillegg til de stedene hvor de er syntaktisk kreves som strengen% drift og for flere returverdier, bruker jeg tupler som en form for lette klasser. Anta for eksempel at man har et objekt som passerer ut en ugjennomsiktig kapsel til en innringer fra en metode som deretter føres inn i en annen metode. En tuppel er en god måte å pakke flere verdier i det kapselen uten å måtte definere en separat klasse for å inneholde dem.

Jeg prøver å være fornuftig om denne bruken, skjønt. Dersom cookies brukes liberalt hele koden, er det bedre å lage en klasse fordi det bidrar til å dokumentere deres bruk. Når de bare brukes i ett sted (for eksempel ett par av metoder) så kan jeg benytte en tuppel. I alle fall, fordi det er Python du kan starte med en tuppel og endre den til en forekomst av en egendefinert klasse uten å endre noen kode på den som ringer.

Svarte 09/09/2008 kl. 03:56
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more