Python del 4 - Variabeltyper

Men vad är nu detta!? I en strikt objektorienterad miljö finns inga variabeltyper! Det är ju därför man inte skriver C/C++: för att man inte orkar bestämma om man vill ha en long int eller en unsigned double. Jo, det stämmer, och det är inte den typen av variabeltyper vi pratar om. Det vi pratar om är olika typer av arrays och listor.

Vi börjar med just listor. Ni har faktiskt redan sett hur listor ser ut, men jag berättade inte att det var listor då. Kommer ni ihåg range()-funktionen? Outputet från den var en rad med värden med fyrkantsklammrar runt omkring. Det är en lista. För att skapa en lista skriver man

  1. >>> a=["värde1", "värde2"] #Osv
  2.  

Innehållet i en lista kan vara vad som helst. För att komma åt ett specifikt element i din lista skriver du
  1. >>> a[1]
  2. 'värde2'

Man kommer åt listor på Precis samma sätt som man kommer åt bokstäver i en sträng. Slices fungerar även här, och min fina asciiartbild gäller även här. Till skilnad från strängar så stödjs dock slice assignment. Man kan alltså ge ett värde till ett specificerat element (förutsatt att det finns från början).

Man kan göra följande saker med listor (vi använder fortfarande den förra listan:
  1. >>> a.append("snorkråka") #Lägger till snorkråka på slutet
  2. >>> a
  3. ['värde1', 'värde2', 'snorkåka']
  4. >>> b=[1,2,3] #Vi skapar en till lista för att...
  5. >>> a.extend(b) #Lägga till alla element i lista b
  6. >>> a
  7. ['värde1', 'värde2', 'snorkåka', 1, 2, 3]
  8. >>> a.insert(2, "Pungmes") #Lägg till pungmes efter "värde två" (tänk på min asciiart-bild om hur siffrorna sitter mellan talen. Exakt på samma sätt hamnar det här)
  9. >>> a
  10. ['värde1', 'värde2', 'Pungmes', 'snorkåka', 1, 2, 3]
  11. >>> a.remove(2) #Tar bort värdet två första gången det förekommer, alltså Inte element nr två.
  12. >>> a
  13. ['värde1', 'värde2', 'Pungmes', 'snorkåka', 1, 3]
  14. >>> a.pop(1) #Returnerar "värde2" eftersom det är det som står som element nr 1. Tar också bort det från listan
  15. 'värde2'
  16. >>> a.pop() #Returnerar och tar bort det sista värdet från listan
  17. 3
  18. >>> a
  19. ['värde1', 'Pungmes', 'snorkåka', 1]
  20. >>> a.index(1) #Returnerar den lägsta platsen i listan där värdet är 1. Skapar ett felmeddelande om det inte finns
  21. 3
  22. >>> a.count("värde1") #Räknar antalet gånger som "värde1" förekommer
  23. 1
  24. >>> a.sort() #Sorterar listan. Hur den sorterar kommer lite senare.
  25. >>> a.reverse() #Vänder listan
  26. >>> a
  27. ['värde1', 'snorkåka', 'Pungmes', 1]


Så... Hur sorterar python när man använder sort()? sort() sorterar i storleksordning med det minsta först. Först låtsas vi att vi bara har två nummer: 3 och 14. För att sortera dem kan man använda komparatorer (större än, mindre än osv. Jmfr compare) för att kontrollera vilket som är minst (3), och lägga det först ([3, 14]). Det finns alltså ett samband mellan komparatorer och sort().
Om vi jämför en bokstav och en siffra, vad anses minst? Siffror. Alltid. När det gäller jämförelser mellan bokstäver så är en bokstav som kommer senare i alfabetet större än en som kommer tidigare. Alla stora bokstäver är mindre än alla små bokstäver. Har vi en sträng med flera bokstäver så jämförs den första i varje sträng först. ,,r de lika så jämförs nästa osv. Tar den en - men inte båda - av strängarna slut innan en skilnad har hittats så är den kortaste minst.
En lista är större än en siffra, men mindre än en bokstav. Precis som med strängar så gås listan igenom element för element (rekursivt om det behövs) tills en olikhet hittas. Hur bestäms ordningen då? Utvecklarna använde något så fantasifullt som bokstavsordning på typen. Eftersom s som i sträng kommer efter l som i list i alfabetet så hamnar strängarna efter listorna.

Förutom listor finns även en datatyp som heter tuples. Tupels är ganska onödiga egentligen, eftersom de har samma funktion som listor, men de erbjuder ett smart och intuitivt sätt att packa ihop och upp data.
En tuple fungerar precis som en lista. Man använder en tuple på precis samma sätt som en lista, det är bara definitionen som skiljer sig en liten smula. Dock så kan man inte använda de där snajsiga funktionerna som jag visade i senaste kodrutan. Jag demonstrerar:
  1. >>> b = "d", "e", "f" #Skapar en tuple. Ihoppackning av ett gäng värden
  2. >>> b
  3. ('d', 'e', 'f')
  4. >>> b[:2] #Precis som med listor så stödjs slice assignment. Vi kan inte använda parenteser för att komma åt elementen, för då hade det blivit ett funktionsanrop
  5. ('d', 'e')
  6. >>> g, h, i = b #Uppackning av värden
  7. >>> g
  8. "d"
  9. >>> c = "a", #Skapar en tuple med bara ett element

Varför har jag ett komma när jag skapar en en-elementstuple? Hade man inte varit tvungen att ha det hade tolken inte sett skillnad på om jag vill göra en helt vanlig tilldelning av ett värde eller om jag hade velat ha en tuple. Nu måste man ha ett komma på slutet för att visa att man vill ha en tuple.

Nu går vi raskt vidare från tuples till något mycket mera intressant. Dictionarys. En dictionary kan man gissa ganska bra hur den fungerar bara genom att höra namnet. Dictionary. Ordbok... I en ordbok står ett ord, samt en beskrivning till det. Och visst kan man använda dictionarys till just det, men man kan också använda det som andra typer av databaser. Tänk t ex på en telefonkatalog. Där har vi samma struktur. Ett uppslagsord, samt en beskrivning. BlinkenBots (våran IRC-bot. Har du inte hälsat på honom än, gör det) kommandon ligger lagrade i en dictionary. Den innehåller dock ett gäng listor.

Jag tänkte ta och visa hur dictionarys funkar genom att skapa en egen primitiv variant av dictionarys med hjälp av listor. Ni får nu också se ett praktiskt exempel på användning av något.
  1. >>> a= [[],[]] #Skapar en lista med två listor i. Den första ska komma att innehålla alla ord i ordboken, och den andra ska fyllas upp med förklaringarna.
  2. >>> def dictionary(key, value):
  3. ... """Tar emot en nyckel (ordet i en ordlista) och ett värde (beskrivningen) och lägger till dessa till listan lists"""
  4. ... a[0].append(key) #Lägger till key i listan som ligger på plats 0 i den yttersta listan
  5. ... a[1].append(value) #Bör inte vara svårt att lista ut vad det gör
  6. >>> dictionary("Adolph", "Gnu")
  7. >>> lists #,,n så länge så ser det brutalt onödigt ut. Men vänta lite...
  8. [['Adolph'], ['Gnu']]
  9. >>> dictionary("Allan", "Apa")
  10. >>> lists #Nu ser det kanske lite smartare ut
  11. [['Adolph', 'Allan'], ['Gnu', 'Apa']]

Nu ska vi se hur man kommer åt allting. Jag har faktiskt en funktion över för det också.
  1. >>> def dict_access(key):
  2. ... """En funktion som skriver det value som motsvarar keyn som den får (svengelska för att inte blanda ihop begreppen)"""
  3. ... i = a[0].index(key) #Tittar i den första av de två inre listorna efter ett värde som överensstämmer med key och sparar resultatet i i
  4. ... print a[1][i] #Skriver ut det value som ligger på samma plats som key
  5. >>> dict_access("Allan")
  6. Apa

Wow! Det funkade!

Om man använder en riktig dictionary, hur gör man då?
[source]>>> a = {"Adolph": "Gnu", "Allan": "Apa"} #Helt klart mindre jobb att skapa...
>>> a["Adolph"] #Att komma åt...
'Gnu'
>>> a["Andreas"] = "Ekorre" #Samt att lägga till.
>>> a #Skrivs ut i slumpad ordning
{'Andreas': 'Ekorre', 'Adolph': 'Gnu', 'Allan': 'Apa'}
>>> a.has_key("Adolph")
True
[/source]
Om vi nu skulle känna för att skapa dictionarys på ungefär samma sätt som vi gjorde med min hemmagjorda klon så går det också med funktionen dict()
  1. >>> dict([("a", 1), ("b", 2)])
  2. {'a': 1, 'b': 2}

Du anropar funktionen dict() och skickar med en lista som argument. Varje element i listan är en tuple bestående av en nyckel och ett värde.

Då var vi klara med ännu en del. Yippie!

Källa: http://blinkenlights.se/