Matematik med Python

Løkker

Løkker - et overblik

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
Anvendes når man kender det nøjagtige antal gennemløb (f.eks. 10 gange).

Funktionen bruges på på denne måde:

for [TÆLLER] in range( [STARTVÆRDI], [SLUTVÆRDI], [SPRING] ):
while
Anvendes når man ikke kender det nøjagtige antal gennemløb. Det kan f.eks. være at 4 tabellen skal køre indtil vi rammer 100.

Funktionen bruges på denne måde:

while [BETINGELSE]:

for løkken

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.

Intervaller

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.

Udskriv med spring

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

Udskriv baglæns

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

Udskriv vandret

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 - 

For char in ...

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.

Word word in...

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

Trekanttal - et eksempel

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:

$$ T_n = \frac {n \cdot (n+1)}{2} $$

For det tienden tal vil det altså være:

$$ T_{10} = \frac {10 \cdot (10+1)}{2} = 55 $$

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

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
a sættes til at være 1, så while kan kontrollere betingelsen
while a <= 5:
Så længe a er mindre end 5 så skal koden køres
print(a)
Udskriver a
a +=1
a gøres en større.

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.

While True

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.

break, continue, pass og exit

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
Afbryder løkken så koden kan fortsætte
continue
Genstarter løkken og kører ikke koden derunder
pass
Løkken fortsætter i samme session
exit()
Afbryder programmet

break

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.

continue

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

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()

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.

tj@desktop:~$ tj@tj-desktop:~$ python3 Python 3.8.5 (default, Jul 28 2020, 12:59:40) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> exit() tj@desktop:~$

Tællere i løkker

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
>>>