Du er ikke logget inn. Så lenge du ikke er logget inn går du glipp av muligheten for å holde styr på din egen progresjon.

Filtrering:

02.01 Hei på deg

Filnavn: hilsen.py

a) Skriv et program som ber brukeren om å skrive inn navnet sitt og lagrer svaret i en variabel kalt navn.

b) Skriv en prosedyre si_hei() som skriver ut "hei"

c) Kall prosedyren si_hei() tre ganger, og etterpå skriv ut brukerens navn

# a)
navn = input("Hva er navnet ditt? ")

# b) 
def si_hei():
    print("hei")

# c)
si_hei()
si_hei()
si_hei()
print(navn)

02.05: Kodeforståelse

Filnavn: sammenslaaing.py

Vil noen av disse kodesnuttene gi en feilmelding? Begrunn svaret.

Prøv å løse oppgavene uten å kjøre kodesnuttene først!

a)

a = 10
b = "hei!"
c = a + b
print(c)

b)

x = "10"
y = "hei!"
print(x + y)

c)

i = 10
j = "12"
print(i + j)

d) Forsøk å kjøre de tre kodesnuttene hver for seg, og sjekk om du hadde rett.

e) Bruk str() for å konvertere variabel a i oppgave a). Konverter variabel j fra oppgave c) til et heltall på samme måte med funksjonen int() og kjør programmet på nytt. Hva skrives ut nå?

a) Ja, vi får en TypeError fordi vi prøver å slå sammen en streng og et heltall.

b) Nei. Verdiene av x og y er begge strenger og utskriften blir "10hei" etter at de slås sammen.

c) Ja, vi får en TypeError fordi vi prøver å slå sammen en streng og et heltall. Selv om verdien til j inneholder bare sifre, er verdien en streng og kan dermed ikke slås sammen med et heltall.

e) Utskriften fra oppgave a) blir nå 10hei, mens utskriften fra oppgave c) blir 22.

02.08: Kroppstemperatur

Filnavn: kroppstemperatur.py

Hos friske mennesker varierer kroppstemperaturen vanligvis mellom 36.5 og 37.5 grader. Lag et program som avgjør om en persons kroppstemperatur ligger henholdsvis under, innenfor eller over normal kroppstemperatur og skriver ut en passende melding. Programmet skal lese kroppstemperaturen fra terminal.

Hint

Her må du lese inn et flyttall fra terminalen! Bruke den riktige funksjonen for å konvertere en streng til et flyttall.


inp = input("Oppgi kroppstemperatur:\n> ")
temp = float(inp)

if temp < 36.5 : 
    print("Du har lavere kroppstemperatur enn normalen")
elif temp > 37.5 :
    print("Du har høyere kroppstemperatur enn normalen")
else:
    print("Du har normal kroppstemperatur")

02.09: Min utskriftsprosedyre

Filnavn: min_prosedyre.py

a) Lag en prosedyre min_prosedyre som skriver ut "Hei student!" til terminalen.

b) Endre programmet slik at min_prosedyre også skriver ut "Velkommen til et nytt semester!" på en annen linje.

c) Lag en ny prosedyre linjeskift som skriver ut en tom linje.

d) Kall på min_prosedyre to ganger, men mellom kallene skal du også kalle på prosedyren linjeskift, slik at det blir et linjeskift mellom hilsene.

def min_prosedyre():
    # Oppgave a og b
    print("Hei student!")
    print("Velkommen til et nytt semester!")

def linjeskift():
    # Oppgave c
    print()

# Oppgave d
min_prosedyre()
linjeskift()
min_prosedyre()

02.11: Kodeflyt

Dette er en penn- og papiroppgave

Forklar i hvilken rekkefølge de forskjellige linjene utføres når vi kjører programmet ved å skrive tall foran linjene i programmet. Skriv linje-rekkefølgen i følgende tre scenarier:

a) Hvis brukeren taster inn 50
b) Hvis brukeren taster inn 80
c) Hvis brukeren taster inn 12

Prøv å løse oppgavene uten å kjøre kodesnuttene først!

pris = 50
tekst = input("Skriv inn alder: ")
alder = int(tekst)

if alder < 12 or alder > 67:
    print("Du må betale", pris*0.5, "kr")
else:
    print("Du må betale", pris, "kr")

print("ha en fin dag!")

PythonTutor

a)

1| pris = 50
2| tekst = input("Skriv inn alder: ")
3| alder = int(tekst)
 |
4| if alder < 12 or alder > 67:
 |     print("Du må betale", pris*0.5, "kr")
5| else:
6|     print("Du må betale", pris, "kr")
 |   
7| print("ha en fin dag!")

b)

1| pris = 50
2| tekst = input("Skriv inn alder: ")
3| alder = int(tekst)
 |
4| if alder < 12 or alder > 67:
5|     print("Du må betale", pris*0.5, "kr")
 | else:
 |     print("Du må betale", pris, "kr")
 |   
6| print("ha en fin dag!")

c) NB: alder er lik 12, ikke mindre enn 12

1| pris = 50
2| tekst = input("Skriv inn alder: ")
3| alder = int(tekst)
 |
4| if alder < 12 or alder > 67:
 |     print("Du må betale", pris*0.5, "kr")
5| else:
6|     print("Du må betale", pris, "kr")
 |   
7| print("ha en fin dag!")

02.12 Fakta om sauer

Filnavn: sau_fakta.py

I denne oppgaven skal du printe ut 5 fakta om sauer i en prosedyre. Dette skal skje på 5 forkjellige linjer.

a) Skriv prosedyren som skriver ut faktaene.

Forslag til sauefakta:

Sauer er dumme dyr.
Sauer er myke dyr.
Sauer kan lofte 12 ganger sin egen vekt.
Sauer lukter litt som geiter.
Sauen er din venn.

b) Hvordan kan vi nå skrive ut følgende linjer effektivt?

Sauer er dumme dyr.
Sauer er myke dyr.
Sauer kan lofte 12 ganger sin egen vekt.
Sauer lukter litt som geiter.
Sauen er din venn.
*** En gang til! ***
Sauer er dumme dyr.
Sauer er myke dyr.
Sauer kan lofte 12 ganger sin egen vekt.
Sauer lukter litt som geiter.
Sauen er din venn.
Hint

Bruk prosedyren fra a)


a)

def saueFakta():
    print("Sauer er dumme dyr.")
    print("Sauer er myke dyr.")
    print("Sauer kan lofte 12 ganger sin egen vekt.")
    print("Sauer lukter litt som geiter.")
    print("Sauen er din venn.")

b)

saueFakta():
print("*** En gang til! ***")
saueFakta():

02.13: Volum med feil

Filnavn: volum.py

Finn tre feil i programmet under.

Prøv å løse oppgavene uten å kjøre kodesnutt først (og så kan du prøve å kjøre/fikse koden)

1 | lengde = 3
2 | bredde = 5
3 | volum = lengde * bredde * høyde
4 | Print("Volumet er:" + volum)
  1. Linje 3: høyde er ikke definert.
  2. Linje 4: funksjonen er skrevet med en stor P, men må skrives print
  3. Linje 4: Vi brukte pluss i stedet for komma for å sammenkoble volumet med strengen. Vi kan bare bruke pluss hvis vi først kaste den til type streng: str(volum)

02.14 Kodeflyt igjen

Dette er en penn- og papiroppgave

Forklar i hvilken rekkefølge de forskjellige linjene utføres når vi kjører programmet, ved å skrive tall foran linjene i programmet.
Hvis en linje kjøres flere ganger (for eksempel ved flere kall på samme funksjon) kan du skrive flere tall ved siden av setningen.

def kvadrat():
    tall = input("Tall: ")
    tall = int(tall)

    print(tall, "*", tall, "=", tall * tall)

a = True 
b = False

if a:
    kvadrat()

if b:
    kvadrat()

print("En gang til:")
kvadrat()

Visualisering med Python Tutor

5,12| def kvadrat():
6,13|     tall = input("Tall: ")
7,14|     tall = int(tall)
    |     
8,15|     print(tall, "*", tall, "=", tall * tall)
    | 
   1| a = True 
   2| b = False
    | 
   3| if a:
   4|     kvadrat()
    | 
   9| if b:
    |     kvadrat()
    | 
  10| print("En gang til:")
  11| kvadrat()

NB: Merk at programmet egentlig leser inn def kvadrat() først slik at når prosedyren er kalt, vet programmet hvilket linje å hoppe tilbake til. Derfor ville det også vært riktig å skrive '1' ved den første linjen. Det viktigste med oppgaven er å vise at du har forstått hvordan og hvor koden flyter inn i prosedyren.

02.15: Feil i små programmer

Finn fire feil i programmet under.

Prøv å løse oppgavene uten å kjøre kodesnutt først (og så kan du prøve å kjøre/fikse koden)

1 | tall = input(Tast inn et siffer: )
2 | dobbelt = 2 * tall
3 | print("Det dobbelte er" dobbel)
  1. Linje 1: Vi mangler anførselstegn rundt tekststrengen vi gir input.
  2. Linje 2: Vi har ikke gjort om tekststrengen vi får av input til et tall og får tekststrengen to ganger.
  3. Linje 3: Vi har glemt komma etter tekststrengen vi gir til print.
  4. Linje 3: Vi har skrevet dobbel istedenfor dobbelt.

02.16: Skatt i Ruritania

Filnavn: skatt_Ruritania.py

I det fiktive landet Ruritania er skattereglene slik at hvis en person har inntekt < 10000, så betaler man 10% skatt på hele inntekten, og hvis inntekten >= 10000, så betaler man 10% skatt på de første 10000 kronene og 30% skatt på resten av inntekten. Lag et program som regner ut og skriver ut hvor mange kroner som skal betales i skatt gitt inntekten. Programmet skal lese inntekten (som antas å være et flyttall) fra terminal.

Kjør programmet ditt og sjekk at du får riktig resultat.

Tast inn din inntekt:
> 5000
Skatt: 500.0
Tast inn din inntekt:
> 20000
Skatt: 4000.0
inp = input("Tast inn din inntekt:\n> ")
inntekt = float(inp)

if inntekt < 10000 : 
    skatt = inntekt*0.1
else:
    skatt = 10000*0.1 + (inntekt - 10000)*0.3
print("Skatt:", skatt)

02.17 Kalkulator

Filnavn: kalkulator.py

a) Skriv en prosedyre kalkulator() som ber brukeren å taste inn et tall, en operasjon (f.eks. +, -, * og /), og et annet tall. Prosedyren skal skrive ut beregningen og resultatet. Her er et eksempel på hvordan en kjøring av programmet kan se ut:

Første tall: 4.5
Operasjon: +
Andre tall: 7
4.5 + 7.0 = 11.5

b) Utvid programmet slik at hvis brukeren taster inn en ulovlig operasjon, skrives det ut en advarsel.

def kalkulator():
    tall1 = float(input("Første tall: "))
    operasjon = input("Operasjon: ")
    tall2 = float(input("Andre tall: "))

    if operasjon == "+":
        print(tall1, "+", tall2, "=", tall1 + tall2)
    elif operasjon == "-":
        print(tall1, "-", tall2, "=", tall1 - tall2)
    elif operasjon == "*":
        print(tall1, "*", tall2, "=", tall1 * tall2)
    elif operasjon == "/":
        print(tall1, "/", tall2, "=", tall1 / tall2)
    else: # b
        print("advarsel: operasjon", operasjon, "eksisterer ikke")

kalkulator()

02.18: Handletur

Filnavn: handletur.py

Lag et programm som regner ut totalprisen for en bruker etter å ha vært på handletur. De varene det er mulig å kjøpe er brød, melk, ost og yoghurt.

Prisene er som følger:
Brød: 20 kr.
Melk: 15 kr.
Ost: 40 kr.
Yoghurt: 12 kr.

Eksempel på interaksjon med programmet:

Hei! Velkommen til IFI-butikken.
Hvor mange broed vil du ha?
> 2
Hvor mange melk vil du ha?
> 1
Hvor mange ost vil du ha?
> 1
Hvor mange yoghurt vil du ha?
> 3
Du skal betale: 131 kr.
pris_broed = 20
pris_melk = 15
pris_ost = 40
pris_yoghurt = 12

total_sum = 0

print("Hei! Velkommen til IFI-butikken.")
antall = input("Hvor mange broed vil du ha?\n> ")
total_sum = total_sum + int(antall) * pris_broed

antall = input("Hvor mange melk vil du ha?\n> ")
total_sum = total_sum + int(antall) * pris_melk

antall = input("Hvor mange ost vil du ha?\n> ")
total_sum = total_sum + int(antall) * pris_ost

antall = input("Hvor mange yoghurt vil du ha?\n> ")
total_sum = total_sum + int(antall) * pris_yoghurt

print("Du skal betale:", total_sum, "kr.")

02.20: Busstur

Filnavn: busstur.py

Du skal skrive et program som sjekker om det er plass på en buss på en bussrute med tre stopp. Det er plass til inntil 30 passasjerer i bussen. For hvert stopp skal bruker taste inn hvor mange passasjerer som venter på å gå på bussen. Dersom bussen er full, kan ingen gå på. Dersom flere ønsker å gå på enn det er gjenværende plasser på bussen, får kun noen nye passasjerer plass. Vi antar at alle passasjerer skal til endestasjonen, så vi behøver ikke ta høyde for at noen går av bussen underveis.

I tillegg skal det skrives ut hvor mange personer går ombord bussen på hvert stopp. Om bussen er full, skal det skrives ut en beskjed og antall personer som må gå til fots. Til slutt skal det skrives ut at bussen har kommet frem til endestasjonen med antall passasjerer.

Under finner du et eksempel på hvordan kjøringen kan se ut:

Stasjon 1! Hvor mange venter  bussen?
> 14
14 personer går ombord i bussen.

Stasjon 2! Hvor mange venter  bussen?
> 13
13 personer går ombord i bussen.

Stasjon 3! Hvor mange venter  bussen?
> 5
Bussen er full. 2   til fots.

Bussen er fremme med 30 personer ombord!
passasjerer = 0     # Antall passasjerer

inp_nye = input("Stasjon 1! Hvor mange venter på bussen?\n> ")
antall_nye = int(inp_nye)

if passasjerer + antall_nye >= 30:
    print("Bussen er full.", passasjerer + antall_nye - 30, "må gå til fots.")
    passasjerer = 30
else:
    passasjerer += antall_nye
    print(antall_nye, "personer går ombord i bussen.")

inp_nye = input("\nStasjon 2! Hvor mange venter på bussen?\n> ")
antall_nye = int(inp_nye)

if passasjerer + antall_nye >= 30:
    print("Bussen er full.", passasjerer + antall_nye - 30, "må gå til fots.")
    passasjerer = 30
else:
    passasjerer += antall_nye
    print(antall_nye, "personer går ombord i bussen.")

inp_nye = input("\nStasjon 3! Hvor mange venter på bussen?\n> ")
antall_nye = int(inp_nye)

if passasjerer + antall_nye >= 30:
    print("Bussen er full.", passasjerer + antall_nye - 30, "må gå til fots.")
    passasjerer = 30
else:
    passasjerer += antall_nye
    print(antall_nye, "personer går ombord i bussen.")

print("\nBussen er fremme med", passasjerer, "personer ombord!")

02.22: Kodeflyt med prosedyrer

Dette er en penn- og papiroppgave

Forklar i hvilken rekkefølge de forskjellige linjene utføres når vi kjører programmet, ved å skrive tall foran linjene i programmet.
Hvis en linje kjøres flere ganger (f.eks. ved flere kall på samme prosedyre) kan du skrive flere tall ved siden av linjen.

def prosedyre_a():
    navn = input("Navn: ")
    print("Hei,", navn)

def prosedyre_b():
    alder = int(input("Alder: "))
    print("Om ti år er din alder", alder)

def start():
    a = 5
    b = 5

    if a > b:
        b = 10
    elif b > a:
        prosedyre_a()
    else:
        prosedyre_b()

    print(a + b)

start()
prosedyre_a()

PythonTutor

14|def prosedyre_a():
15|    navn = input("Navn: ")
16|    print("Hei,", navn)
  |
 9|def prosedyre_b():
10|    alder = int(input("Alder: "))
11|    print("Om ti år er din alder", alder)
  |
 2|def start():
 3|    a = 5
 4|    b = 5
  |    
 5|    if a > b:
  |        b = 10
 6|    elif b > a:
  |        prosedyre_a()
 7|    else:
 8|        prosedyre_b()
  |    
12|    print(a + b)
  |
 1|start()
13|prosedyre_a()

NB: Merk at programmet egentlig leser inn definisjonene av prosedyrene først slik at når en prosedyre er kalt, vet programmet hvilket linje å hoppe tilbake til. Derfor ville det også vært riktig å skrive '1' ved def prosedyre_a():, '2' ved def prosedyre_b():, og '3' ved def start():. Det viktigste med oppgaven er å vise at du har forstått hvordan og hvor koden flyter inn i prosedyren.

02.23 Is eller pizza

Filnavn: pizza_eller_is.py

a) Lag en prosedyre spoer_is() som spør brukeren hvor mange kuler is de vil ha og skriver ut totalprisen. En kule koster 30 NOK.

b) Lag en annen prosedyre spoer_pizza() som spør om hva slags pizza brukeren vil ha. Hvis svaret er "ost", er prisen 80kr. Ellers koster pizzaen 100kr. Skriv så ut hva slags pizza brukeren bestillte og hvor mye pizzaen koster.

c) Lag en tredje prosedyre spoer_spise() som spør om hva brukeren ønsker spise. Hvis svaret er "is", kall spoer_is(), hvis svaret er "pizza", kall spoer_pizza(), og hvis svaret er noe annet skriv ut en melding som sier at vi ikke selger dette.

d) Kall spoer_spise() og se om alt fungerer.

a)

def spoer_is():
    antall_kuler = int(input("Hvor mange kuler ønsker du? "))
    pris = 30 * antall_kuler
    print("Din is koster", pris, "kr.")

b)

def spoer_pizza():
    pizza = input("Hva slags pizza ønsker du? ")
    if pizza == "ost":
        pris = 80
    else:
        pris = 100
    print("Din pizza med", pizza, "koster", pris, "kr.")

c)

def spoer_spise():
    ønsket_mat = input("Hva vil du spise? ")
    if ønsket_mat == "pizza":
        spoer_pizza()
    elif ønsket_mat == "is":
        spoer_is()
    else:
        print("Vi selger ikke", ønsket_mat)

d)

spoer_spise()

Hele programmet i pizza_eller_is.py:

def spoer_is():
    antall_kuler = int(input("Hvor mange kuler ønsker du? "))
    pris = 30 * antall_kuler
    print("Din is koster", pris, "kr.")

def spoer_pizza():
    pizza = input("Hva slags pizza ønsker du? ")
    if pizza == "ost":
        pris = 80
    else:
        pris = 100
    print("Din pizza med", pizza, "koster", pris, "kr.")

def spoer_spise():
    ønsket_mat = input("Hva vil du spise? ")
    if ønsket_mat == "pizza":
        spoer_pizza()
    elif ønsket_mat == "is":
        spoer_is()
    else:
        print("Vi selger ikke", ønsket_mat)

spoer_spise()

02.24: ASCII-art med feil

Filnavn: asciitegn.py

Kopier prosedyrene under til filen asciitegn.py.

# Du skal ikke å endre disse prosedyrene
def skriv_ascii_1():
    print("   |\---/|\n   | ,_, |")

def skriv_ascii_2():
    print(" -    |``__)/\n--.'(_, |   |\, |")

def skriv_ascii_3():
    print("(__..._(_,..,_..__.'/|\n  '   __\_)/'.....+")

def skriv_ascii_4():
    print("    \_`_/-..----.\n ___/ `   ' ,""+   \\")

def skriv_ascii_5():
    print("(__...'   __\    |`.___.';\n  (_,...'(_,.`__)/'.....+")

def skriv_ascii_6():
    print("(__.._\    .(_,.`__);\n  ../'..'   _  __\_)/+")

a) Finn åtte feil i prosedyren skriv_ascii().

 1 | def skriv_ascii:
 2 |     a = true
 3 |     b = int("3)
 4 |     c = 5 
 5 |     
 6 |     if a
 7 |         skriv_ascii_1()
 8 |     else:
 9 |         skriv_ascii_2()
10 |     
11 |     if b + 3 = c:
12 |         skriv_ascii_3()
13 |     elif c > b:
14 |         skriv_ascii_4("")
15 |         
16 |         fi not a == False:
17 |             skriv_asci_5()
18 |     else:
19 |         skriv_ascii_6()
20 | 
21 | skriv_ascii()

b) Kopier også skriv_ascii() til filen asciitegn.py. Fiks feilene du fant i a) og prøv å kjøre koden. Hva ser du?

a) Feil i skriv_ascii():
1. Linje 1: parentes mangler
2. Linje 2: true må være True
3. Linje 3: "3 må være "3"
4. Linje 6: : mangler
5. Linje 11: = må være ==
6. Linje 14: "" må fjernes
7. Linje 16: fi må være if
8. Linje 17: skriv_asci_5 er feilstavet, må være skriv_ascii_5

b) Fiks feilene:

def skriv_ascii(): # 1
    a = True # 2
    b = int("3") # 3
    c = 5 

    if a: # 4
        skriv_ascii_1()
    else:
        skriv_ascii_2()

    if b + 3 == c: # 5
        skriv_ascii_3()
    elif c > b:
        skriv_ascii_4() #6

        if not a == False: #7
            skriv_ascii_5() #8
    else:
        skriv_ascii_6()

skriv_ascii()

Utskrift: en katt!

   |\---/|
   | ,_, |
    \_`_/-..----.
 ___/ `   ' ,+   \
(__...'   __\    |`.___.';
  (_,...'(_,.`__)/'.....+

02.25: Feil som ikke gir feilmelding

Hva er feilen i følgende programkode som skal summere to tall?

x = 0
y = 0

x = int(input("Tast inn et heltall: "))
x = int(input("Tast inn et heltall til: "))

print("Summen av tallene er:", x+y)

Vi lagrer til variabelen x begge ganger vi leser inn fra brukeren og vi leser aldri inn en verdi til variabelen y! Derfor blir verdien til x det andre tallet og verdien til y blir 0. Dette kalles en logisk feil, og vil ikke gi noen feilmelding.

06.11: Globale variabler

Dette er en teorioppgave. Prøv først å løse oppgaven uten å kjøre koden.

Hva skjer når vi forsøker å kjøre følgende programmer? Skriv ned svaret ditt før du tester om du hadde rett, og tenk gjennom hva som skjer når koden kjøres.

a)

a = "En tekst!"
def prosedyre_en(parameter):
    parameter = parameter + "12"

print(a)
prosedyre_en(a)
print(a)

b = 10
print(b)

b)

def prosedyre_to():
    b = b + 10

prosedyre_to()
print(b)

c)

c = "hei"
print(c)

def funksjon_en(parameter):
    parameter = parameter + "verden"
    return parameter

print(funksjon_en(c))

Bonusspørsmål: Hva er verdien til c etter kjøringen?

d)
Svar på følgende spørsmål om globale variabler:
1. Hva betyr begrepet 'global variabel'?
2. Hvilken av de foregående øvelsene (a/b/c) bruker globale variabler?
3. Når bør du bruke globale variabler i IN1000? Forklar svaret ditt.

Tips: Om dette var vanskelig, prøv å kjøre kodesnuttene med PythonTutor for å visualisere hva som skjer.

a) Programmet skriver ut:

En tekst!
En tekst!
10
  1. Skriver ut aEn tekst!
  2. Kaller prosedyren_en(a) og legger på strengen "12" til den lokale variabelen parameter. Den globale variabelen a forbli uendret siden alle endringer skjer på variabler inne i prosedyren (lokalt) og lagres ikke utenfor prosedyren (globalt).
  3. Skriver ut a igjen → En tekst!
  4. Skrive ut b10
    Visualisering med PythonTutor

b)
Programmet kræsjer, fordi b ikke er definiert.
Visualisering med PythonTutor

c) Programmet skriver ut:

hei
heiverden
  1. Skriver ut verdien til variabelenc som er strengen hei
  2. Kaller på funksjon_en(c)
    1. Den lokale variabelen parameter får verdien "hei" fra variabelen c.
    2. Legger strengen "verden" på slutten av "hei.
    3. Returnerer den oppdaterte strengen
  3. Skriver returverdien ut → "heiverden"

Bonusspørsmål: "hei"
Funksjonen endrer ikke verdien til den globale variabelen c og returverdien blir ikke lagret noe sted etter endringen, men skrives den heller ut med en gang og så mister vi returverdien.
Visualisering med PythonTutor

d)

  1. En global variabel er en variabel med ubegrenset skop, dvs. som er definert utenfor rammene av en prosedyre eller funksjon.

global variable A variable whose scope is not restricted to a single function or method. (Python for Everyone, Glossary A-21)

  1. Øvelser a og c
  2. Aldri! Globale variabler kan være forvirrende og kan føre til ulykker. For eksempel hvis en lokal variabel (i funksjonen) har samme navn som en global variabel. Skriv heller programmet i en prosedyre hovedprogram() slik som ble vist i forelesningen for å unngå globale variabler.

06.12 Kodeflyt og skop

Beskriv kodeflyten for kodelinjene under, linje for linje. Pass på at du nevner de relevante globale og lokale variablene og hva som skrives ut.

 1 | a = 9
 2 | b = 5
 3 |
 4 | def foo(a):
 5 |     if a > 5:
 6 |         bar()
 7 |     else:
 8 |         baz(a)
 9 | 
10 | def bar():
11 |     if a >= 8:
12 |         print(a)
13 |     else:
14 |         print("***")
15 |  
16 |     return 5
17 |
18 | def baz(b):
19 |     c = b + bar()
20 |     print(c)
21 | 
22 | a = 8
23 | 
24 | foo(7)
25 | foo(4)

Visualisering med Python Tutor

  • Den globale variabelen a opprettes med verdien 9
  • Den globale variabelen b opprettes med verdien 5
  • Opt: foo() (linje 3), bar()(linje 9) og baz()(linje 16) defineres
  • Verdien til a endres til 8
  • Prosedyren foo() kalles med argument 7 (linje 24)

    • Parameteret a får verdien 7. merk at den er en lokal variabel som er annerledes en den globale variabelen a med verdi 8
    • a er større enn 5, så funksjonen bar() kalles uten argumenter (linje 5)
      • Den globale variabelen a sammenlignes med 8.
      • Siden a, 8 er større eller lik 8, så skrives ut 8, verdien til a. (linje 11)
      • Verdien 5 blir returnert, men men ingenting blir gjort med det. (linje 15)
  • Prosedyre foo() kalles igjen men med argument 4. (linje 23)

    • Parameteret a får verdien 4. merk igjen at den er en lokal variabel som er annerledes en den globale variabelen a med verdi 8
    • a er ikke større enn 5, så funksjonen baz() kalles med argument 4, verdien til a (linje 7)
      • Parameteret b får verdien 4
      • Prosedyren bar() kalles igjen uten argumenter, og verdien til den globale variabelen a skrives ut igjen (8).
        • verdi 5 returneres
      • Returverdien 5 blir lagt til den lokale variabelen b (4), så opprettes en lokal variabel c med verdien 9.
      • Verdien til den lokale variabelen c skrives ut (9)

Utskrift til terminalen:

8
8
9

06.13: Hva skrives ut

Dette er en teorioppgave.

Gitt følgene kodesnutter, hva skrives ut?

Prøv først å løse oppgaven uten å kjøre koden.

a)

a = 2

def endreA():
    a = 5

endreA()
print(a)

b)

a = 2

def endreA():
    a = 5

b = endreA()
print(a)

c)

a = 2

def endreA():
    return 5

a = endreA()
print(a)

d)

a = 2

def endreA(b):
    b = 5
    return b

endreA(a)
print(a)

e)

a = 2

def endreA(b):
    b = 5
    return b

a = endreA(a)
print(a)

f)

a = 2

def endreA(b):
    b = 5
    return b

a = endreA(a)
print(b)

a) 2
Fordi den globale variabelen a endres ikke. Kun den lokale variabelen a endres, og denne "lever" ikke utenfor prosedyren.

b) 2
Samme som i 1). Prosedyren endreA() returnerer heller ikke noe (default returverdi er None), dette lagres så i variabelen b, og den globale verdien til a forblir uforandret.

c) 5
Funksjonen endreA() returnerer verdien 5. Dette lagres så i den globale variabelen a. Dermed vil 5 skrives ut når man skriver ut a.

d) 2
Funksjonen endreA() kalles på, men returverdien lagres ikke noe sted, og verdien til variablen a forblir dermed uforandret.

e) 5
Funksjonen endreA() returnerer verdien 5 og denne lagres i den globale variablen a. Dermed vil 5 skrives ut når man skriver ut a.

f)

Traceback (most recent call last): File "testing.py", line 8, in <module>
    print(b)
NameError: name 'b' is not defined

I f) forsøker programmet å skrive ut variabelen b men den er ikke definert utenfor funksjonen. Siden variablen b er en lokal variabel som kun "lever" inne i funksjonen endreA(), så vil programmet ikke gjenkjenne denne utenfor skopet av funksjonen. Vi får dermed en NameError på at variablen b ikke er definert i det globale skopet.