Göm menyn

Datatyper

Vad är en datatyp?

En datatyp är en väldefinierad sorts information som ett datorprogram kan använda. Datatypen talar om vilka dataobjekt som ingår i typen (vilken domän som typen har) samt vilka operationer som är tillåtna. Datatypen beskriver alltså hur objekten ser ut och vad man kan göra med dem. De flesta programspråk har ett antal inbyggda datatyper (som ofta är ganska lika) samt möjligheter för programmeraren att definiera egna typer.

Några datatyper i Python

Enkla datatyper

Datatyp Domän Exempel på objekt
int Heltal 42
float Flyttal 3.14

Sammansatta datatyper

Datatyp Domän Exempel på objekt
str Strängar 'simon'
list Listor [1, 2, 3, 4, 5]

Hur kan man få reda på vilken datatyp en literal eller identifierare har?

>>> type(2.78)
<class 'float'>
>>> x = 5
>>> type(x) == int
True
>>> isinstance([1,2,3],list)
True

Dynamisk typning - variabler deklareras inte

I en del andra programspråk behöver man deklarera en variabel för att tala om att ett visst namn faktiskt är namnet på en variabel, och inte något annat (t.ex. ett funktionsnamn) eller kanske bara en felstavning. Ett exempel från JavaScript:

var x;
x = 10;

var min_variabel = 20;
min_varaibel = 10;  // Fel upptäcks: Har inte deklarerat min_varaibel

Om man måste deklarera en variabel är det också vanligt att man ska tala om vilken datatyp den har. Så är det t.ex. i C:

int c = 10;
float d = 3.14;
c = d;  // Fel upptäcks: Kan inte stoppa in ett flyttal i en int-variabel

Men i Python har en variabel ingen fixerad datatyp. Det finns inte "heltalsvariabler" och "flyttalsvariabler", utan bara "vad-som-helst-variabler" som kan ha värden från vilken datatyp som helst.

Detta innebär att Python har dynamisk typning:

  • Variabelns nuvarande värde har en typ (om x==10 innehåller x just nu ett heltal, och om x==3.14 innehåller x just nu ett flyttal).

  • Man kan dynamiskt ändra värdet på en variabel till ett nytt värde av en annan datatyp (som i exemplet nedan). Under sin livstid kan alltså en variabel ha innehållit värden från många olika datatyper.

>>> a = 42  # Nu innehåller a ett heltal
>>> print(a)
42
>>> b = "spam"
>>> a = b  # Nu innehåller a en sträng
>>> print(a)
spam

I kursen i Java och objektorientering kommer vi att gå in djupare på den här skillnaden och dess konsekvenser.

Metoder

Metoder är specialiserade funktioner som hör till en viss datatyp. Man kan inte köra dem utan att ha ett objekt av rätt typ. Det ser ut på följande sätt:

dataobjekt.metod(argument)
>>> "Korvbröd".upper()
'KORVBRÖD'

En av tankarna bakom detta är att t.ex. upper() inte är en fristående funktion som råkar arbeta med strängar. Istället är det själva strängen som har egen funktionalitet: Det är strängen som kan skapa en kopia på sig själv där alla små bokstäver ersatts med stora bokstäver. En konsekvens är att man inte skickar in strängen som en vanlig funktionsparameter, utan att den istället står först för att indikera att det är strängen som "utför jobbet".

Vi kommer inte att lära oss att skriva egna metoder i den här kursen, men vi kan använda de inbyggda metoderna för t.ex. strängar.

Objekt

Ett sätt att organisera datastrukturer och dess funktioner är att bilda objekt. Ett objekt består av både data och de metoder som kan utföras på dessa data.

Python stödjer objektorientering -- alla värden är faktiskt objekt, även enklare värden såsom heltal:

>>> n=123
>>> n.bit_length()
7
>>> n=12
>>> n.__add__(34)
46

Men Python tvingar oss inte att lägga all programkod inuti objekt eller s.k. klasser, så som vissa andra språk som Java gör. Vi kommer därför inte att gå in djupare på objektorientering, bortsett från att vi kommer att använda en del av de objekt och metoder som redan finns i Python.

Dokumentation

Hjälp

För att se en lista med tillgängliga metoder för ett objekt kan du skriva help(object) i interpretatorn. De metoder som börjar och slutar med __ är metoder som överskrider vanliga operationer. Tryck q för att komma tillbaks till interpretatorn.

Dokumentation

Dokumentationsexempel

Under help(list) hittar vi denna förklaring på metoden index

|  index(...)
|      L.index(value, [start, [stop]]) -> integer -- return first index of value.
|      Raises ValueError if the value is not present.

L står för objektet metoden körs på, argument inom hakparenteser är frivilliga argument. Efter pilen visas datatypen som returvärdet har, sedan följer en kort förklaring av metoden.


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2021-12-03