Göm menyn

Selektion

När ett program körs görs generellt ett flertal "val" som bestämmer vilken väg genom koden programmet ska ta. Varje sådant val kallas för en selektion. I Python ser vi främst selektion i form av if-satser som evaluerar (beräknar värdet av) ett villkor, och sedan gör olika saker beroende på om villkoret var sant eller falskt.

Upprepning: Vad är sant och falskt?

Vad är sant Vad är falskt
True False
Alla tal som inte är noll (ex. 1, -44.2) Alla tal som är noll (ex. 0, 0.0)
Alla icke-tomma strukturer (ex. [1, 2, 3], "hej") Alla tomma strukturer (ex. [], "", {})
... Det speciella objektet None
  • Konstanterna True och False är egentligen konstanter med värdet 1 och 0.
  • Jämförelseoperatorer (t.ex. < och >) liksom många inbyggda testfunktioner (t.ex. isinstance) returnerar True eller False.
  • Använd True eller False så långt som möjligt! När man använder icke-explicita sanningsvärden minskar oftast läsbarheten.

Hur kan villkorsuttryck utformas?

if villkorsuttryck:
    programkod som körs om villkoret är sant

Dokumentation

Villkorsuttryck:

  • Literal: tal, sträng eller annat dataobjekt som tolkas som sant eller falskt.
  • Funktions- eller metodanrop: t.ex. isinstance(seq, list) eller < > !=.
  • Operator som kombinerar två eller fler deluttryck: ofta en jämförelse, t.ex. a < b.
  • Boolesk operator som kombinerar ett eller fler deluttryck: t.ex. a < b and x == 7.

Booleska operatorer

  • Boolesk algebra handlar om hur man räknar med sanningsvärden.
  • De tre vanligaste operatorerna är not, and och or. Definitionen av dessa kan ses nedan.
a b not a a and b a or b
False False True False False
False True True False True
True False False False True
True True False True True

Dokumentation

Hur beräknas operationer i Python?

  • not a: Uttrycket a beräknas. Om detta är sant returneras False, annars True.
  • a and b: Uttrycket a beräknas. Om det är falskt returneras resultatet av a, annars beräknas b och dess resultat returneras
  • a or b: Uttrycket a beräknas. Om det är sant returneras resultatet av a, annars beräknas b och dess resultat returneras.
  • Både and och or använder sig av kortslutande beräkningar som enbart beräknar så mycket som behövs för att kunna säga något om hela resultatet.
# a ges värdet av s, eller "default" om s är tom
a = s or "default"

Hur prioriteras booleska operationer i Python?

Prioriteringsordningen för de booleska operationerna är:

  1. not
  2. and
  3. or

Vilket innebär att dessa två uttryck blir samma sak:

a or not b and c
(a or ((not b) and c))

Trots ordning kan det i många fall vara en bra idé att sätta ut parenteser även om de egentligen inte behövs, då det kan öka läsbarheten.

If som uttryck

Vi har tidigare sett att if-satser kan användas för att styra programexekveringen, det vill säga utföra olika instruktioner baserat på ett villkor. Men om man vill utföra enklare tester inne i ett uttryck kan man använda ett if-uttryck. Det fungerar som en enkel if-sats, men skrivs på en rad och fungerar som ett uttryck, det vill säga det returnerar ett värde.

Formatet för if-uttrycket är:

case1 if condition else case2

Exempel på användning:

sign = "positive" if a > 0 else "non-positive"

Observera att if-uttryck inte kan innehålla elif utan finns endast på formen som beskrevs ovan, else måste alltså finnas.

Hur bör man arrangera villkoren i en if-sats?

  • Använd inte en if-sats överhuvudtaget om du kan beräkna eller slå upp resultatet.
  • Arrangera villkoren i en logisk ordning så att man lätt kan se att alla falls täcks upp (t.ex. nummerordning, bokstavsordning, från specifikt till allmänt).
    • Undvik villkor som överlappar varandra.
    • För tester i rekursiva funktioner, börja alltid med basfallet.
  • I sällsynta fall kan man arrangera villkoren så att det mest troliga fallet är först, för att optimera koden.
  • Undvik komplicerade nästlade if-satser i flera nivåer, om det inte gör koden tydligare

Exempel

Den första versionen av quarter är överskådlig, men det är onödigt många villkorsatser. Den andra är bättre på så sätt att den är mer koncis.

def quarter(month):
    """ Returns the quarter of the given month """
    if 1 <= month <= 3:
        return 1
    elif 4 <= month <= 6:
        return 2
    elif 7 <= month <= 9:
        return 3
    elif 10 <= month <= 12:
        return 4

def quarter(month):
    """ Returns the quarter of the given month """
    return (month - 1) // 3 + 1

Den första versionen av month nedan är överskådlig, men det är onödigt många villkorssatser. Den andra är bättre då den är mer koncis. Den är också lättare att verifiera korrekt, eftersom man inte behöver kontrollera att alla index (n-värden) är korrekt utan bara ordningen i listan över månadsnamn.

def month(n):
    """ Returns the name of the given month """
    if n == 1:
        return "January"
    elif n == 2:
        return "February"
    elif n == 3:
        return "March"
    elif n == 4:
        return "April"
    elif n == 5:
        return "May"
    elif n == 6:
        return "June"
    elif n == 7:
        return "July"
    elif n == 8:
        return "August"
    elif n == 9:
        return "September"
    elif n == 10:
        return "October"
    elif n == 11:
        return "November"
    elif n == 12:
        return "December"

def month(n):
    """ Returns the name of the given month """
    names = ["January", "February", "March", "April",
            "May", "June", "July", "August", "September",
            "October", "November", "December"]
    return names[n - 1]

Tillhörande quiz

Finnes här


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