Ofte har man brug for at et program skal gøre det samme igen og igen. Det kan f.eks. være at skulle udføre den samme beregning, på et stigende tal. Det kan f.eks. være at udskrive 4 tabellen (4, 8, 12, 16, ...).
Den at gentage noget igen og igen kaldes en løkke (engelsk: loop)
Python arbejder med 2 forskellige løkker: for og while.
for
for [TÆLLER] in range( [STARTVÆRDI], [SLUTVÆRDI], [SPRING] ):
while
while [BETINGELSE]:
Her vil vi lave et simpel for-løkke, som udskriver de første 5 tal:
for i in range(5):
print(i)
>>> %Run test.py
0
1
2
3
4
Læg mærke til, at Python printer tallene 0-4 - altså de første 5 værdier, da python tæller fra 0.
Hvis du vil have den til at printe fra 1, altså som vi kan lide det, så kan det gøres ved at lægge en til hver gang i print(i+1)
, altså:
for i in range(5):
print(i+1)
>>> %Run test.py
1
2
3
4
5
Her har jeg brugt bogstavet i som tæller. Det "plejer" man at gøre da i bruges som en forkortelse for integer - altså heltal.
i vil være den variabel der holder styr på hvor langt løkken er nået.
Du kan også bestemme start og slutværdien. Her vælger vi intervallet fra 8-13.
for i in range(8,13):
print(i)
>>> %Run test.py
8
9
10
11
12
Her kan vi se fordelen ved måde Python tæller:
Forestil dig at vi i et program skal udskrive den 8. værdi og 5 værdier frem. Startværdien er altså 8. Slutværdien vil være 8+5 = 13. det ville vi kunne skrive direkte ind i koden:
for i in range(8,8+5)
Altså:
for i in range(8,13)
Det er faktisk rigtig smart at Python tæller som Python gør.
Vi kan også få Python til at udskrive i spring. Her udskriver vi hver andet tal:
for i in range(0,10,2):
print(i)
>>> %Run test.py
0
2
4
6
8
Hvis du gerne vil have Python til at tælle baglæns kan du gøre det på samme måde. Her sætter vi springværdien til -1:
for i in range(5,0,-1):
print(i)
>>> %Run test.py
5
4
3
2
1
Hvis du hellere vil have din udkrift vandret kan det gøres på følgende måde. Indsæt end=" - "
i din print
-sætning
for i in range(0,10):
print(i, end=" ")
>>> %Run test.py
0 1 2 3 4 5 6 7 8 9
Hvis du gerne vil have et tegn (f.eks. en delestreg) mellem tallene indsætter du det imellem citationstegnene:
for i in range(0,10):
print(i, end=" - ")
>>> %Run test.py
0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -
Ofte har man brug for at kunne gennemføre en funktion på hver eneste tegn i en tekststreng. Herunder er vist et simpelt eksempel hvor man ved hjælp af en for-løkke printer hver bogstav i navnet.
for char in "Thomas":
print(char)
>>> %Run test.py T h o m a s
Her har jeg brugt char i stedet for i. Det er et bevidst valg, da denne funktion ikke laver tal, men bogstaver. Ligesom tal hedder integers, så hedder tegn char.
Når du bruger char, så gør du opmærksom på at nu sker der noget andet - og det gør koden lettere at læse.
Man kan også printe en tekst ord for ord. Det gøres ved at anvende funktionen split()
:
tekst = "Hej med dig"
for word in tekst.split():
print(word)
>>> %Run test.py Hej med dig
Her vil vi lave et program der udskriver trekanttallene. Trekanttal er de tal vi får når vi bygger trekanter på følgende måde:
De røde cirkler er dem vi lægger til hver gang, og det som sker er, at vi starter med 1, så siger 1 + 2, derefter 1 + 2+ 3 osv. Hvis vi skulle finde det n'te trekantal, f.eks. det 10, så kan bruge følgende formel:
For det tienden tal vil det altså være:
Først laver vi en funktion, så det kan udregne tallene for os og tester den med det samme:
def trekanttal(n):
tal = (n*(n+1))/2
return tal
trekanttal(10)
>>> %Run test.py
55.0
Vi kan se at det kommer ud som en float, men da vi ved det altid vil være en int, så ændrer vi det med det samme:
def trekanttal(n):
tal = (n*(n+1))/2
# Her konverterer vi til int
tal = int(tal)
return tal
print(trekanttal(10))
>>> %Run test.py
55
Nu har vi funktionen på plads, så nu skal vi lave en løkke så vi får udskrevet tallene. Vi starter med at udskrive de første 10 tal vandret:
def trekanttal(n):
tal = (n*(n+1))/2
tal = int(tal)
return tal
for i in range(1,11):
print(trekanttal(i), end=" - ")
>>> %Run test.py
1 - 3 - 6 - 10 - 15 - 21 - 28 - 36 - 45 - 55 -
While betingelser angiver noget der skal ske så længe en betingelse er opfyldt. Herunder laver vi en kode, der udskriver tallet a, startende med en og indtil \( a \leq 5 \).
a = 1
while a <= 5:
print (a)
a +=1
>>> %Run test.py
1
2
3
4
5
Det som koden siger er:
a = 1
while a <= 5:
print(a)
a +=1
While køres igen, og tjekker om \( a \leq 5 \) og så længe den er det, så kører koden. og det gør den indtil a er 6.
Der kan være situationer hvor det ikke er dig som programmør der sætter betingelserne. Det kan f.eks. være en bruger der skal skrive noget, en temperatur der måles eller at en værdi rammes. Altså en der løkke der køres indtil en betingelse er opfyldt.
I de tilfælde laver man en while True:
Som standard er tilstanden altid True, og det betyder at når Python ser denne kode så kører den indtil løkken bliver afbrudt med break
Lad os se på følgende program, hvor brugeren skal gætte det rigtige tal mellem 1 og 10. Her er betingelsen for at løkken stopper, at brugeren taster 5.
while True:
a = 5
valg = input("Gæt et tal mellem 1 og 10: ")
if valg == "5":
print ("\n\tGodt gættet\n")
break # Stopper løkken så koden kan køre videre
else:
print("\n\tPrøv igen\n")
>>> %Run test.py Gæt et tal mellem 1 og 10: 3 Prøv igen Gæt et tal mellem 1 og 10: 7 Prøv igen Gæt et tal mellem 1 og 10: 5 Godt gættet Tillykke... Du fandt tallet :)
Her er det brugeren input (5) der stopper løkken, men det kunne også være at en sensor blev aktiveret eller lavede en bestemt måling.
I Python er der 4 metoder vi kan anvende for at bryde ind i betingede løkker. Det kan både være i for og while løkker:
Her har du en oversigt over de 4 metoder
break
continue
pass
exit()
I eksemplet ovenfor så du hvordan break
anvendes. Så snart brugeren valgte 5 blev løkken afbrudt, og udskriv: Tillykke... Du fandt tallet!
break
afbryder løkken, så koden kan køre videre.
Du skal bruge continue
, når du vil stoppe den kørsel løkken har gang i, men du vil ikke stoppe selve løkken.
I eksemplet herunder udskriver programmet sætningen Helle ser en elefant, men fjerner samtidig alle e'er i sætningen:
for char in "Helle ser en elefant":
if char == "e":
continue
print(char, end="")
Hll sr n lfant
continue
stopper ikke løkken, men den forhindrer e bliver udskrevet.
pass
minder om continue, men lader resten af koden køre videre.
I eksemplet herunder, hvor jeg udskriver tallene fra 1-5, vil jeg gøre opmærksom på at 4 er mit lykketal:
for i in range(1,6):
if i == 4:
print("Næste tal er mit lykketal")
pass
print(i)
>>> %Run test.py 1 2 3 Næste tal er mit lykketal 4 5
pass
er også brugbar til tomme funktioner. Forestil dug at du er i gang med en længere kode, hvor du skal have lavet nogle funktioner der ikke er nødvendige i første omgang. Men du vil gerne have dem ind i koden.
Tag f.eks. koden med trekanttal som vi har lavet længere oppe. Hvis vi gerne vil tilføje en fremtidig funktion som udregner firkanttal, som vi endnu ikke har sat os ind i, så kan vi gøre det sådan her:
def trekanttal(n):
tal = (n*(n+1))/2
# Her konverterer vi til int
tal = int(tal)
return tal
# Skal indeholde beregning af firkanttal
def firkanttal(n):
pass
print(trekanttal(10))
#print(firkanttal(10))
exit()
er den "hårde" metode og svarer til at afslutte Python. Kommandoen afslutter ikke bare programmet, men også Python selv. Forestil vi laver et program hvor brugeren skal skrive ja for at fortsætte og hvis han ikke gør så lukker programmet:
svar = input(f"Skriv \"ja\" for at fortsætte: ")
while True:
if svar == "ja":
break
else:
print("\nProgrammet afsluttes nu")
exit()
print("Velkommen")
>>> %Run test.py Skriv "ja" for at fortsætte: n Programmet afsluttes nu ─────────────────────────────────────────────────── Python 3.8.5 (/usr/bin/python3) >>>
Læg mærke til at Thonny laver en streg udskriver versionen af Python. Det skyldes at Python lukker helt ned pga. exit()
. Thonny sørger for at genstartet Python med det samme, så vi kan fortsætte.
Her er et eksempel hvor jeg har startet Python op fra kommandolinien på min PC, og her kan du se, at exit()
stopper Python fuldstændig.
while True:
kan risikere at blive en løkke der aldrig stopper, så resten af programmet ikke kan afvikles. Derfor kan det være smart at sikre sig, at den kun kun kører nogle få gange. Det kan f.eks. være et simpelt kodeprogram, hvor man kun får 3 forsøg på at indtaste det rigtige tal.
Her ændrer vi programmet ovenover, hvor man skal skal gætte et tal mellem 1 og 10, men hvor brugere kun har 3 chancer til at gætte det:
forsøg = 3
print("Du har 3 forsøg til at gætte et tal mellem 1 og 10.\n\n")
while True:
if forsøg > 0:
a = 5
valg = input("Gæt et tal mellem 1 og 10: ")
if valg == "5":
print ("\n\tGodt gættet\n")
break # Stopper løkken så koden kan køre videre
else:
forsøg -= 1
print(f"\n\tPrøv igen. Du har {forsøg} tilbage.\n")
else:
print("Du har ikke flere forsøg")
break
>>> %Run test.py Du har 3 forsøg til at gætte et tal mellem 1 og 10. Gæt et tal mellem 1 og 10: 2 Prøv igen. Du har 2 tilbage. Gæt et tal mellem 1 og 10: 9 Prøv igen. Du har 1 tilbage. Gæt et tal mellem 1 og 10: 4 Prøv igen. Du har 0 tilbage. Du har ikke flere forsøg >>>