Göm menyn

4. Satser och uttryck

En viktig del av att lära sig programmering handlar om att lära sig läsa och förstå kod. Och ett viktigt hjälpmedel för att lära sig läsa är att förstå grammatiken alltså reglerna för hur språket är uppbyggt. Det är inte fullt så skrämmande som det låter. När det gäller programspråk är grammatiken mycket enklare än för naturliga språk.

Ett program i Python består i grund och botten av en följd av satser. Dessa kan i sin tur bestå av olika delar, ofta olika uttryck. Satser och uttryck är två av de viktigaste beståndsdelarna i alla program och därför ska vi fokusera lite extra på dem i det här kapitler.

1. Ett exempel

Newton-Raphsons metod är en algoritm som approximerar kvadratroten av ett tal. Här är ett litet kodexempel som implementerar en variant av den här algoritmen:

def find_root():
    """ Prints the approximation of the square root of a given number """
    print("This program tries to find the square root of a number ")
    x = int(input("Enter a number: "))
    guess = x / 2
    for i in range(5):
        guess = (guess + x / guess) / 2
        print(guess)

Vi ska längre ner använda oss av detta exempelprogram för att visa de olika delarna som Python-program består av. Här följer en översiktlig förklaring till vad programmet gör:

  • Programmet består av en enda funktion find_root.
  • Den andra raden är en så kallad kommentar som är till för oss som läser koden, men den påverkar inte programmets körning.
  • Programmet inleds på den tredje raden med att skriva ut en förklaring till användaren.
  • Programmet läser in en rad från användaren, försöker tolka vad som matades in och sparar detta i variabeln x. En variabel låter programmet associera ett namn, x i det här fallet, till ett värde, i det här fallet det användaren matat in.
  • Programmet gissar sedan att roten ur x är x/2 och sparar gissningen i variablen guess.
  • Därefter upprepas raderna i for-loopen (alltså koden under for i in range(5):) fem gånger. Detta är ett exempel på repetition.
  • För varje varv i upprepningen så räknar den ut en bättre gissning, baserad på den gamla gissningen, updaterar variabeln guess samt skriver ut den i terminalen.

Underordnande rader måste skjutas in en bit på raden. De måste indenteras. Detta är för att Python ska förstå att dessa rader hör till find_root.

Om vi sparar den här koden i en fil och kör den, så kommer förstås ingenting att hända. Vi behöver också ha ett anrop till funktionen find_root.

2. Satser - ryggraden i ett imperativt program

Ett Python-program består av ett antal satser (eng. statements) som utförs i tur och ordning. Satser gör något. De har en effekt.

Det finns enkla satser som i princip bara gör en sak. Det finns också sammansatta satser som kan innehålla en eller flera andra satser.

Vi ska titta på de fem viktigaste satserna i Python, där vi redan har sett exempel på de fyra första.

Tilldelning

Tilldelning (eng. assignment) ser schematiskt ut så här:

namn = uttryck

Det som händer är att uttrycket som står till höger beräknas, det vill säga att värdet på högerledet bestäms, och resultatet sparas i den namngivna variablen. I vårt exempel find_root görs tilldelning på flera ställen, bland annat på rad 4. Där tilldelar vi variabeln guess resultatet av beräkningen x/2.

Rent filosofiskt kan vi säga att tilldelning introducerar en tidslinje i programmet. Innan tilldelning hade varibeln ett annat värde, eller den kanske inte ens fanns. Efter tilldelningen har variabeln ett nytt värde.

Funktionsanrop

Funktionsanrop ser schematiskt ut så här:

funktionsnamn(argument1, argument2, argument3, ...)

En funktion kan ta inget, ett eller flera argument. Det beror på hur den är definierad. Argument används för att överföra information från den som anropar en funktion till funktionen.

Det som händer är att argumenten (som är uttryck) beräknas och resultatvärdena skickas till funktionen, alltså underprogrammet, som behandlar indatan.

Funktionsanrop kan även användas i sammansatta uttryck då en funktion alltid returnerar ett värde även om den används som en sats. Har funktionen ingen explicit retur-sats så kommer ändå specialvärdet None returneras.

Till exempel så har vi funktionsanrop på rad 3 i find_root, där vi anropar funktionerna int och input. Här sätts variabeln x till resultatet från anropet till funktionen int som i sin tur tar resultatet från anropet till funktionen input.

Iteration med for

Iteration, det vill säga upprepning av en grupp satser, ser ut på följande sätt:

for namn in område:
    ...
    ...
    ...

Det som händer är att gruppen av satser inuti for-satsen, även kallat undersatser, körs så många gånger som området specificerar. Området kan t.ex. vara en lista med värden som variabeln namn ska ta. För varje så kallad iteration, alltså varje varv, så updateras namn till ett nytt värde från listan.

I exemplet ovan finns en for-sats på rad 5. Funktionsanropet range(5) returnerar en så kallad generator som motsvarar en lista bestående av sekvensen 0, 1, 2, 3, 4, alltså totalt fem tal. Det innebär att for-satsen kommer köra fem iterationer eller varv och för varje varv kommer den öka variabeln i med 1. Variabeln börjar med värdet 0. Det betyder att i första iterationen är i=0, i andra är i=1, och i den femte och sista iterationen är i=4.

Ibland vill man använda värdet på iterationsvarabeln till något, men i vårt exempel är vi bara intresserade av att upprepa något fem gånger, så i används inte inne i for-loopen.

Funktionsdefinition

En funktionsdefinition sätter ett namn på en grupp av satser så att de enkelt kan anropas senare. En funktionsdefinition ser ut på följande sätt:

def funktionsnamn(parameter1, parameter2, ...):
    ...
    ...
    ...

I exemplet ovan har vi exakt en funktionsdefinition, find_root, som inte har några parameterar. En parameter kan ses som en variabel som funktionen kan använda och som får sitt värde av ett argument i funktionsanropet.

Selektion

Selektion eller villkorssatser är satser som kör en grupp satser beroende på det givna villkoret. De kallas också för if-satser.

En if-sats inleds med if, följt av noll eller flera elif och avslutas med noll eller en else.

Villkorssatser i Python kan se ut på följande sätt:

# Ett alternativ
if a > 0:
    print("positivt")

# Två alternativ
if a >= 0:
    print("icke-negativt")
else:
    print("negativt")

# Tre eller fler alternativ
if 0 <= a < 10:
    print("ental")
elif a < 0:
    print("negativt")
else:
    print("tio eller mer")

3. Uttryck - värdefulla saker

Uttryck (eng. expressions) är delar av satser som kan beräknas till ett värde, t.ex. ett tal eller en bit text.

Det finns enkla uttryck som i princip bara är en enda odelbar sak, och sammansatta uttryck som går att plocka isär i sina beståndsdelar.

Identifierare

När Python ser en identifierare (alltså ett namn på en variabel eller funktion) så som x eller find_root så kommer den att försöka slå upp värdet i sin interna symboltabell. Uttryckets värde blir sedan det värde som Python funnit i tabellen. Om identifieraren inte finns i tabellen skriver programmet ut ett felmeddelande och avbryts.

Literaler

Literaler eller konstanter är fasta värden och till skillnad från identifierare så kan deras värde aldrig ändras. I vårt program har vi literaler på flera ställen, bland annat så är strängen "Enter a number: " en literal, lika så är talen 2 och 5 literaler.

Sammansatta uttryck med operatorer

Ett sätt att skapa sammansatta uttryck är att använda en operator. Det kan schematiskt se ut så här:

deluttryck_a operator deluttryck_b

Värdet av ett sammansatt uttryck bestäms av att operatorn tar emot argumenten, det vill säga deluttrycken, och utför någon beräkning eller operation på dem.

I exemplet ovan är t.ex. (guess + x / guess) / 2 ett sammansatt uttryck med operatorerna + och /. Parenteserna talar om för Python i vilken ordning operationerna ska utföras.

Funktionsanrop

Även funktionsanrop är sammansatta uttryck. I exemplet så har vi range(5) och int(input("Enter a number: ")) som uttryck då de båda returnerar ett värde.

Sammanfattning

  • Ett Python-program består av en följd av satser. Satser gör något.
  • Det finns enkla satser, som tilldelning och funktionsanrop.
  • Det finns sammansatta satser, som iteration med for, selektion med if och funktionsdefinitioner.
  • Uttryck kan beräknas till ett värde och ingår som en del i många satser.
  • Det finns enkla uttryck, som identifierare eller literaler.
  • Det finns sammansatta uttryck, t.ex. uttryck med operatorer eller funktionsanrop.

I några av de kommande kapitlen kommer vi fördjupa oss lite mer i några av dessa satser, samt vad som händer vid funktionsanrop.

Extramaterial

Quiz om satser och uttryck

Python-dokumentationen för enkla satser

Python-dokumentationen för sammasatta satser

Python-dokumentationen för uttryck


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2025-04-16