Osa 2

Programmeringsterminologi

Under den första modulen fokuserade vi inte så mycket på terminologi. Nu är det dags att ta en titt på några centrala begrepp inom programmering.

Sats

En sats (statement) är en del av ett program som utför något. En sats syftar ofta, men inte alltid, på en enstaka instruktion.

Till exempel print("Hej") är en sats som skriver ut en rad text. På samma sätt är tal = 2 en sats som lagrar ett värde i en variabel.

En sats kan också vara mera invecklad. Den kan till exempel bestå av flera instruktioner. Följande sats består av tre rader:

if namn == "Anna":
    print("Hejsan!")
    tal = 2

I detta exempel finns två satser (print-sats och tilldelningssats) inom en if-sats.

Block

Ett block är en sekvens av satser som kommer efter varandra och finns på samma nivå i programmets struktur. Till exempel if-satsens block innehåller de satser som körs då villkoret är sant.

if alder > 17:
    # if-satsens block inleds
    print("Du är myndig!")
    alder = alder + 1
    print("Du är nu ett år äldre...")
    # blocket avslutas

print("Det här är i ett annat block.")

I Python markeras block som vi sett tidigare med hjälp av indentering. Vi lägger alltså in mellanrum i början av raden för alla satser som hör till ett givet block.

Obs! Huvudprogrammet i Python ska aldrig indenteras, utan ska alltid finnas så långt till vänster som möjligt i filen:

# det här programmet fungerar inte eftersom huvudkoden är indenterad
  print("Hej allihopa")
  print("Det här är ett dåligt program")

Uttryck

Ett uttryck (expression) kan utvärderas och ger då ett resultat med en viss datatyp. När programmet körs, får uttrycket ett värde som kan användas i programmet.

Här följer några exempel på uttryck:

UttryckVärdeDatatypDatatyp i Python
2 + 4 + 39heltalint
"abc" + "de""abcde"strängstr
11 / 25.5flyttalfloat
2 * 5 > 9Truesanningsvärdebool

Eftersom alla uttryck har en datatyp, kan man tilldela uttryck till en variabel:

# variabeln x får värdet av uttrycket 1 + 2
x = 1 + 2

Enkla uttryck kan kombineras till mer komplicerade uttryck. Så här kan man till exempel utföra räkneoperationer:

# variabeln y får värdet av uttrycket "3 gånger x plus x upphöjt till två"
y = 3 * x + x**2

Funktion

En funktion utför en given uppgift i ett program. Vi har redan sett och använt flera funktioner, t.ex. print, input, int, float och så vidare. De är fördefinierade, vilket innebär att den kod som ska köras då vi använder print-funktionen finns färdigt i Python. Vi kan också skapa egna funktioner, vilket vi kommer att se senare.

Funktioner kan också ta emot en eller flera parametrar, alltså data som funktionen utnyttjar för att utföra sin uppgift. Parametern till print anger till exempel vad som ska skrivas ut.

En funktion körs då den anropas – det vill säga då funktionen och dess möjliga parametrar nämns i koden. Följande sats anropar print-funktionen med parametern "det här är en parameter":

print("det här är en parameter")

Funktionen input används för att ta emot data från användaren, och i den anger parametern det meddelande som ska visas till användaren:

namn = input("Berätta ditt namn: ")

I det här fallet returnerar funktionen också ett värde. När funktionen har körts ersätts den del i koden där funktionen anropades med det värde som funktionen returnerar – det är nu ett uttryck med ett värde. input-funktionen returnerar en sträng som innehåller den text som användaren gett programmet. För att kunna använda det värde som en funktion returnerar behöver vi lagra det i en variabel.

Datatyp

Datatyp syftar till de egenskaper ett värde har i ett program. I följande kodexempel är datatyperna sträng (str) för variabeln namn och heltal (int) för variabeln resultat:

namn = "Anna"
resultat = 100

Med hjälp av funktionen type kan man ta reda på vilken datatyp en variabel, värde eller ett uttryck har:

print(type("Anna"))
print(type(100))
Exempelutskrift

<class 'str'> <class 'int'>

Syntax

På samma sätt som vanliga språk har regler för hur man kan formulera meningar, har även programmeringsspråk en syntax – det vill säga ett regelverk för hur koden ska skrivas. Den skiljer sig för varje programmeringsspråk.

Pythons syntax bestämmer bland annat att första raden i en if-sats ska sluta med ett kolon och att därefter följande block ska indenteras:

if namn == "Anna":
    print("Hejsan!")

Följer man inte dessa regler, kommer ett fel att uppstå:

if namn == "Anna"
    print("Hejsan!")
Exempelutskrift
  File "test.py", line 1
    if namn == "Anna"
                    ^
SyntaxError: invalid syntax

Att debugga

När syntaxen i ett program är korrekt men programmet inte ändå fungerar på önskat sätt, finns det troligen ett fel i programmet. Programfel kallas ofta buggar.

Buggar dyker upp i olika slags situationer. Vissa kan orsaka felmeddelanden medan programmet körs. Ta det här programmet som exempel:

x = 10
y = 0
resultat = x / y

print(f"{x} dividerat med {y} är {resultat}")

Nu får vi felet:

Exempelutskrift
ZeroDivisionError: integer division or modulo by zero on line 3

Det här felet har med matematik att göra – det går inte att dividera med noll, och det här stoppar programmet medan det körs.

Fel som uppstår medan programmet körs är relativt lätta att korrigera. Felmeddelandet berättar på vilken rad i koden det uppstod problem. Det är förstås möjligt att felet ligger på något annat ställe i koden än just den här specifika raden.

Ibland kan det finnas fel i programmet, trots att körningen går utan problem. De här buggarna är mycket svårare att märka och korrigera. Ofta handlar det om att man märker att programmet ger fel eller oväntade resultat i vissa situationer. I programmeringsuppgifterna under den här kursen finns det olika tester som ska hjälpa med att hitta sådana här fel. Före en bugg kan korrigeras måste man ta reda på var felet uppstår.

Programmerare använder ofta termen debugga – att söka efter orsaker till fel som uppstår i koden. Att lära sig debugga är ett ytterst viktigt verktyg i en programmerares verktygslåda. I yrkeslivet använder programmerare ofta mera tid till att debugga än för att skriva ny kod.

Ett enkelt – men ändå mycket användbart – sätt att debugga sitt program är att lägga till print-satser i koden. Att verifiera vad som sker i koden med hjälp av print-instruktioner ger en bekräftelse att programmet gör det som du vill.

Det här är ett exempel på ett försök att lösa en av föregående modulens uppgifter:

timlon = float(input("Timlön: "))
timmar = int(input("Arbetstimmar: "))
dag = input("Veckodag: ")

lon = timlon * timmar
if dag == "söndagg":
    lon * 2

print(f"Lön {lon} euro")

Det här programmet fungerar inte helt korrekt. När testen körs får vi följande resultat:

Exempelutskrift
FAIL: PalkkaTest: test_sunnuntai_1

Med indata 23.0, 12, söndag är rätt lön 552.0 men detta finns inte i utskriften Lön 276.0 euro

När vi debuggar den här kursens uppgifter är det första steget ofta att testa hur programmet fungerar när man ger det den data som orsakade ett fel i testet. Nu kan vi se att programmet faktiskt ger ett inkorrekt resultat:

Exempelutskrift

Lön 276.0 euro

Att debugga innebär vanligtvis att vi kör programmet flera gånger. Det kan vara bra att tillfälligt hårdkoda det problematiska värdet istället för att alltid fråga efter värdet från användaren. Så här kunde det se ut i vårt exempel:

# timlon = float(input("Timlön: "))
# timmar = int(input("Arbetstimmar: "))
# dag = input("Veckodag: ")
timlon = 23.0
timmar = 12
dag = "söndag"

lon = timlon * timmar
if dag == "söndagg":
    lon * 2

print(f"Lön {lon} euro")

Nästa steg kan vara att lägga till print-satser för att debugga. Problemet i den här koden uppstår i den delen där söndagar behandlas. Låt oss lägga till ett par print-satser: en före lönen ska fördubblas och en efter det:

# ...

lon = timlon * timmar
if dag == "söndagg":
    print("lön i början:", lon)
    lon * 2
    print("lön efter fördubbling:", lon)

print(f"Lön {lon} euro")

När vi kör koden märker vi att programmet inte alls skriver ut något på basis av de print-satser vi lagt till i koden. Det verkar som att innehållet i if-blocket aldrig körs. Det finns visst ett problem med if-satsen. Låt oss skriva ut Boolean-uttryckets värde:

# ...

lon = timlon * timmar
print("villkor:", dag=="söndagg")
if dag == "söndagg":
    print("lön i början:", lon)
    lon * 2
    print("lön efter fördubbling:", lon)

print(f"Lön {lon} euro")

Värdet är False, alltså kommer if-blockets kod aldrig att köras:

Exempelutskrift

villkor: False Lön 276.0 euro

Problemet ligger alltså i if-satsens villkor. Som du kanske redan märkt vid det här laget är det oerhört viktigt att vara exakt när vi programmerar: små bokstäver tolkas som olika bokstäver än stora och varje tecken spelar roll. I det här exemplet har vi tydligen stavat söndag fel: "söndagg" i Boolean-uttrycket är skrivet med två g medan användaren skrivit rätt. Vi korrigerar felet – både i if-satsen och print-instruktionen:

# ...

lon = timlon * timmar
print("villkor:", dag=="söndag")
if dag == "söndag":
    print("lön i början:", lon)
    lon * 2
    print("lön efter fördubbling:", lon)

print(f"Lön {lon} euro")

Nu får vi följande utskrift när programmet körs:

Exempelutskrift

villkor: True lön i början: 276.0 lön efter fördubbling: 276.0 Lön 276.0 euro

Det verkar som att värdet lagrat i lon är korrekt i början: timlon = 20.0 och timmar = 12, 20,0 * 6 = 120,0. Instruktionen som ska multiplicera det här med två fungerar dock inte. Det måste alltså vara ett problem med den instruktionen:

lon * 2

Instruktionen multiplicerar nog värdet, men resultatet lagras ingenstans. Vi ändrar på det:

lon *= 2

När vi nu kör programmet, märker vi att resultatet är korrekt:

Exempelutskrift

villkor: True lön i början: 276.0 lön efter fördubbling: 552.0 Lön 552.0 euro

När programmet fungerar som det ska, är det viktigt att ta bort alla exyta print-satser och annan kod som använts för att debugga.

Det här var ett ganska enkelt exempel och i fall som det här kan man eventuellt hitta buggar genom att noggrant läsa igenom koden. Att använda print-satser för att debugga är ändå ofta ett snabbt sätt att få en ledtråd gällande var problemet kan ligga. print-satser kan också användas för att ta reda på vilka delar av koden som fungerar korrekt. Då kan man fokusera på övriga ställen i koden där felen med större sannolikhet gömmer sig.

print-satser är bara ett sätt att debugga program. Vi återkommer till det här ämnet senare under kursen. Nu ska du bli van vid att debugga, med hjälp av print-instruktioner, för att hitta problematiska delar i din kod. Proffs klarar sig inte utan print-satser i debuggningssyfte – det är alltså en viktig resurs redan som nybörjare.

Loading...
:
Loading...

Log in to view the quiz

Du har nått slutet av den här delen! Fortsätt till nästa del:

Se dina poäng genom att klicka på cirkeln nere till höger av sidan.