Lektion 1 · Cirka 45 min genomgång

Villkor
Conditionals

Ett villkor är en fråga som blir True eller False. Svaret avgör vilken kodgren — en av programmets möjliga vägar — som körs.

Kontrollflöde är ordningen och vägen genom programmet. Här får en första if-sats välja väg; varje del förklaras strax.

myndig.pyPython
alder = 20
if alder >= 18:
    print("Du är myndig.")
ResultatDu är myndig.

Före genomgången

Se filmen och repetera datatyper

Harvards lecture 1 är cirka 56 minuter. Se den före lektionen och använd sidan som svensk genomgång, repetition och uppslagsverk. Vi bygger vidare på variabler, input, int, strängmetoder och egna funktioner från lektion 0.

2

Skapa en mapp

Skapa lektion_01 i kursmappen och öppna den i VS Code.

3

Arbeta utan AI

Skriv villkoren själv. Träna särskilt kolon, indrag och i vilken ordning grenarna prövas.

Den centrala modellen

Ett villkor är inte en gissning utan ett uttryck som Python räknar ut till exakt ett av två booleska värden: True eller False. Det värdet styr vilken kodgren som körs.

Dagens karta

Sex steg från fråga till beslut

Varje nytt begrepp introduceras innan det används i ett större exempel.

värdendet vi vetuttryckfråganboolTrue eller Falsegrenkoden som körs
01

Sant eller falskt

Booleska uttryck ger ett bool-värde

Ett uttryck är kod som Python räknar ut till ett värde. Ett booleskt uttryck ger datatypen bool, vars två möjliga värden skrivs True och False med stor begynnelsebokstav.

Jämförelser formulerar frågor

En jämförelseoperator jämför två värden. Uttrycket alder >= 18 frågar ”är värdet i alder större än eller lika med 18?”. Python svarar med ett bool-värde.

= och == betyder olika saker

Ett likhetstecken = är tilldelning: ett namn får ett värde. Två likhetstecken == är en jämförelse: Python undersöker om två värden är lika.

Villkor
Ett booleskt uttryck som används för att styra programmet.
bool
Datatypen med värdena True och False.
Operator
Tecken som anger en operation, till exempel >=.
Utvärdera
Att Python räknar ut vilket värde ett uttryck får.
jamfor.pyPython
alder = 17
print(alder >= 18)
print(alder != 18)
ResultatFalse
True
<mindre än
>större än
<=mindre än eller lika med
>=större än eller lika med
==lika med
!=inte lika med
02

Den första förgreningen

if kör kod när villkoret är sant

if betyder ”om”. Python utvärderar villkoret efter nyckelordet och kör det indragna kodblocket endast om resultatet är True.

temperatur.pyPython
temperatur = 27

if temperatur > 25:
    print("Ta med vatten.")

print("Programmet är klart.")
ResultatTa med vatten.

Fyra delar att läsa

  1. 1
    if inleder villkorssatsen.
  2. 2
    temperatur > 25 är det booleska uttrycket.
  3. 3
    Kolonet : markerar att ett indraget kodblock följer.
  4. 4
    Fyra blanksteg är standardindrag i Python och visar vilka rader som hör till grenen.

En eller flera rader med samma indrag bildar ett kodblock. Den sista print-raden saknar indrag och ligger därför utanför villkoret; den körs oavsett om villkoret är sant eller falskt.

Indrag är programstruktur

I Python är indrag inte dekorativ formatering. Fel indrag kan ge IndentationError eller göra att en rad hamnar i fel gren. Låt VS Code infoga blankstegen efter kolonet och blanda inte tabbar och blanksteg.

03

Flera möjliga vägar

elif och else skapar en kedja

elif betyder ”annars om” och har ett eget villkor. else betyder ”annars” och har inget villkor: den fångar alla fall som inte redan har valts.

Första sanna grenen vinner

Python prövar kedjan uppifrån och ned. När ett villkor blir True körs dess block och resten av samma ifelifelse-kedja hoppas över. Grenarna är därför ömsesidigt uteslutande: exakt en av dem körs när kedjan avslutas med else.

Ordningen är en del av logiken. Börja med det mest specifika eller högsta gränsvärdet. Om poang >= 60 stod först skulle även 95 välja grenen för E.

Kedjans kontrakt

Tar emot: ett eller flera villkor. Gör: testar dem uppifrån. Resultat: kör den första sanna grenen, eller else om ingen tidigare gren passar.

betyg.pyPython
poang = 85

if poang >= 90:
    betyg = "A"
elif poang >= 80:
    betyg = "B"
elif poang >= 70:
    betyg = "C"
elif poang >= 60:
    betyg = "E"
else:
    betyg = "F"

print(betyg)
ResultatB
Två fristående if

Båda kan köras

tva_if.pyPython
if x > 0:
    print("positivt")
if x % 2 == 0:
    print("jämnt")

Frågorna är oberoende. Talet 4 är både positivt och jämnt, så båda blocken körs.

En sammanhängande kedja

Bara en gren körs

kedja.pyPython
if x > 0:
    print("positivt")
elif x < 0:
    print("negativt")
else:
    print("noll")

Alternativen beskriver samma fråga och utesluter varandra.

04

Kombinera villkor

and, or och not

De logiska operatorerna arbetar med booleska värden. and kräver att båda delarna är sanna, or att minst en del är sann och not vänder på ett bool-värde.

ABA and BA or B
FalseFalseFalseFalse
FalseTrueFalseTrue
TrueFalseFalseTrue
TrueTrueTrueTrue
intervall.pyPython
temperatur = 24

if temperatur >= 20 and temperatur <= 30:
    print("Behaglig temperatur")

# Samma intervall, tydligare i Python:
if 20 <= temperatur <= 30:
    print("Behaglig temperatur")
ResultatBehaglig temperatur

Intervall och gränser

Python tillåter kedjade jämförelser. 20 <= temperatur <= 30 betyder att båda gränserna ingår. Operatorn <= gör intervallet inklusivt; med < skulle ändpunkten inte ingå.

not är användbart när ett negativt tillstånd är tydligast: if not inloggad:. Om inloggad är False blir hela uttrycket True.

Kortslutning

Python utvärderar logiska uttryck från vänster. I A and B behöver B inte kontrolleras om A redan är falskt. I A or B behöver B inte kontrolleras om A redan är sant. Detta kallas kortslutning.

Strängmetoder kan vara villkor

strip() tar bort blanktecken i början och slutet och lämnar en ny sträng. lower() lämnar en ny sträng med gemener. Metoderna startswith(prefix) och endswith(suffix) undersöker början respektive slutet och lämnar ett bool-värde.

När metoder kedjas arbetar varje metod med föregående returvärde. svar.strip().lower() normaliserar därför både omgivande blanksteg och skiftläge innan jämförelsen görs.

halsning.pyPython
halsning = input("Hälsning: ").strip().lower()

if halsning.startswith("hello"):
    print("$0")
Resultat$0
05

Resten blir ett test

Modulo och booleska funktioner

Modulooperatorn % lämnar resten efter division. För heltal kan resten användas för att formulera ett villkor, exempelvis om ett tal är jämnt.

Jämnt betyder rest noll

8 % 2 ger 0, eftersom 8 kan delas i hela tvågrupper. 9 % 2 ger 1. Ett jämnt heltal uppfyller därför villkoret tal % 2 == 0; annars är talet udda.

En funktion som besvarar en ja/nej-fråga genom att returnera True eller False kan kallas en boolesk funktion. Namnet börjar ofta med is_ eller has_.

Returnera uttrycket direkt

Jämförelsen är redan ett bool-värde. Funktionen behöver därför inte skapa True och False med en extra if-kedja.

jamnt.pyPython
def is_even(tal):
    return tal % 2 == 0

tal = 8
if is_even(tal):
    print(f"{tal} är jämnt")
else:
    print(f"{tal} är udda")
Resultat8 är jämnt
Skriv tydliga booleska villkor

Python kan även tolka vissa andra värden som sanna eller falska — exempelvis är noll och tomma strängar falsy, medan många andra värden är truthy. I början är en uttrycklig jämförelse ofta lättare att läsa när avsikten annars är oklar. Använd if namn: när du medvetet menar ”strängen är inte tom”, inte som en genväg du inte kan förklara.

06

Ett värde, flera mönster

match passar för tydliga alternativ

match jämför ett värde med olika case-mönster. Den första matchande grenen körs. Operatorn | samlar flera alternativ och case _ är en reservgren som matchar allt annat.

hus.pyPython
namn = input("Namn: ").strip()

match namn:
    case "Harry" | "Hermione" | "Ron":
        print("Gryffindor")
    case "Draco":
        print("Slytherin")
    case _:
        print("Okänt hus")
ResultatGryffindor

När passar match?

Använd match när ett och samma värde ska jämföras med flera tydliga alternativ eller mönster. Använd oftast if/elif för intervall, olika variabler eller mer sammansatta booleska uttryck.

Tecknet | betyder ”något av dessa mönster” inne i en case-rad. Det är inte samma syntax som den logiska operatorn or. Understrecket i case _ är en wildcard, en reserv som fångar alla återstående värden.

Fördjupning: guard

En guard lägger ett extra villkor på ett mönster: case tal if tal > 0:. För nybörjarkod är en vanlig if-kedja ofta tydligare när det främst är villkoret, inte mönstret, som är viktigt.

Flyttal

Exakt likhet kan överraska

flyttal.pyPython
import math

summa = 0.1 + 0.2
print(summa == 0.3)
print(math.isclose(summa, 0.3))
ResultatFalse
True

Många decimaltal kan inte representeras exakt binärt. math.isclose(a, b) testar om två flyttal är tillräckligt nära varandra.

Programstart

Huvudvakten

main.pyPython
def main():
    print("Programmet körs")

if __name__ == "__main__":
    main()

Python sätter specialvariabeln __name__ till "__main__" när filen körs direkt. Villkoret anropar då main, men inte när filen importeras av en annan fil.

Efter genomgången

Fem övningar i stigande komplexitet

Läs Harvards aktuella specifikation. Planera beslutsgrenarna och testa gränsfall; fullständiga lösningar visas inte här.

01 · Normalisering

Deep Thought

Normalisera text och använd or eller en tydlig uppsättning accepterade svar.

Öppna uppgiften ↗Testa 42, forty-two och forty two med varierat skiftläge och omgivande blanksteg.
02 · Ordning

Home Federal Savings Bank

Använd strip, lower och startswith. Pröva det mest specifika fallet först.

Öppna uppgiften ↗”hello” är också ett ord som börjar på h — därför avgör ordningen resultatet.
03 · Reservgren

File Extensions

Undersök filändelsen utan hänsyn till skiftläge och använd en tydlig standard för okända typer.

Öppna uppgiften ↗Testa .jpg, .jpeg, .pdf, blandade versaler och en okänd ändelse.
04 · Operatorval

Math Interpreter

split() utan argument delar vid blanktecken och lämnar en lista. Packa upp tre delar och välj rätt beräkning.

Öppna uppgiften ↗Utdata ska visas som ett flyttal med en decimal; tänk särskilt på division.
05 · Funktion + intervall

Meal Time

Skriv convert, använd inklusiva intervall och koppla ihop funktionen med huvudprogrammet.

Öppna uppgiften ↗Testa start, mitt och slut för varje måltidsintervall samt tider strax utanför.

Testa varje beslutspunkt

  1. 1Normalisera

    Bestäm hur blanksteg och skiftläge ska hanteras.

  2. 2Lista grenar

    Skriv pseudokod för varje möjligt resultat.

  3. 3Ordna

    Placera specifika fall före bredare fall.

  4. 4Testa gränser

    Prova precis under, på och över varje gräns.

  5. 5Förklara

    Säg varför just den grenen valdes.

Lokalt material och aktuell specifikation

Kursmappens äldre exempel är användbara för resonemang, men Harvards aktuella uppgiftssida anger vad programmet ska göra. Använd därför alltid länken till respektive uppgift som kravspecifikation.

Kontrollera förståelsen

Kan du förklara besluten?

Gå tillbaka till motsvarande avsnitt om du inte kan svara utan att köra programmet.

Jag kan skilja = från ==

= tilldelar ett värde. == jämför två värden och ger True eller False.

Jag vet vad kolon och indrag gör

Kolonet inleder ett block; rader med samma indrag hör till samma gren.

Jag kan välja mellan två if och en elif-kedja

Fristående if prövas oberoende. En kedja väljer den första sanna grenen.

Jag kan förklara and, or och not

and kräver båda, or minst en och not inverterar bool-värdet.

Jag kan skriva ett inklusivt intervall

start <= x <= slut inkluderar båda gränserna.

Jag kan använda modulo för jämna tal

tal % 2 == 0 är sant när division med 2 ger rest noll.

Jag vet när match passar

match passar ett värde mot tydliga alternativ; komplexa villkor uttrycks ofta tydligare med if.

Jag kan testa en villkorskedja

Jag provar varje gren och gränsfall precis under, på och över en gräns.

Fördjupning och original

Resurser

Genomgången kombinerar kursens notebook, övningar och presentation med Harvards aktuella lecture 1. Harvards sidor är på engelska.