Utforskning 3
Eksempel 1: While-løkker (while-loops)
While-løkker brukes i situasjoner når løkka skal utføres så lenge noe er sant. Her er noen eksempler på while-løkker.
print("Countdown...")
num = 10 # start
while num > 0: # test
print(num)
num -= 1 # update
# first square greater than or equal to 1000
n = 1 # start
while n * n < 1000: # test
n += 1 # update
print(n, "is the first number where n^2 is larger than 1000")
# sleepy triangle
s = "" # start
while s != "ZZZZZZZZZZZ": # test
print(s)
s += "Z" # update
I kodene overfor ser du at det er merket med ’start’, ’test’ og ’update’. En while-loop er avhengig av et vilkår og kjøres om betingelsen er oppfylt. Betingelsen/vilkåret er linjen som er merka med ’test’. Betingelsen i while-løkker trenger ofte en startverdi som oppdateres mens løkken utføres. Dette er linjen merket med ’start’ (startverdi) og ’update’ (oppdateringen) i koden.
Eksempel 2: break og continue.
Man bruker break til å avbryte en løkke. Man bruker continue for å hoppe rett til neste iterasjon av løkken uten å fullføre resten av den pågående iterasjonen.
Her er noen eksempler på break og continue. Prøv først å si hva som kommer til å skje når du kjører koden. Kjør så koden og se om det var riktig.
break
kan brukes å bryte en endeløs while-løkke.
while True:
answer = input("Should we continue? ")
if answer == "n":
break
print("Great, let's go one more time...")
print("Bye!")
continue
kan brukes til å hoppe over noe. Hva hopper koden nedenfor over?
# If you are confused about what this code does you can include
# more print statements.
for i in range(100):
if "4" in str(i):
continue
print(i)
Se på den siste løkken. Den kan skrives om ved hjelp av if-else sånn at man ikke må bruke continue. Finner du ut hvordan man kan gjøre det? Kan løkken med break skrives om sånn at vi får det samme resultatet uten å bruke break?
Eksempel 3: for-løkker (for-loops)
Her er noen eksempler på for-løkker (for-loops). Prøv først å si hva som kommer til å skje når du kjører koden. Kjør så koden og se om det var riktig. Merk spesielt hvilke tall du får fra løkkene med range(). Hva er det minste tallet du får? Hva er det største? Hva om du bruker tre tall som argument til range()? Prøv selv med noen ulike tall.
for letter in "Hello":
print(letter)
for mitt_løkkevariabelnavn_som_jeg_kan_velge_fritt in "Hello":
print(mitt_løkkevariabelnavn_som_jeg_kan_velge_fritt)
x = "Hello"
for letter in x:
print(letter)
print("Range 1:")
for n in range(7):
print(n)
print("Range 2:")
for n in range(3, 7):
print(n)
print("Range 3:")
for n in range(2, 17, 3):
print(n)
Både break og continue kan også brukes med for-loops. Sammenligne output fra de neste to løkkene. Hvilken løkke er lettere for deg å forstå?
print("Afternoon 1:")
result = ""
for letter in "Good afternoon":
if letter == "o":
result += "0"
else:
result += letter
print(result)
print("Afternoon 2:")
result = ""
for letter in "Good afternoon":
if letter == "o":
result += "0"
continue
result += letter
print(result)
Alle for-løkker kan skrives om til while-løkker. Her er et eksempel.
# Every for-loop can be written as a while-loop:
print("For-loop")
for x in range(2, 19, 3):
print(x)
print("While-loop")
x = 2
while x < 19:
print(x)
x += 3
Kan du skrive om en av for-løkkene med range() fra eksempel 3 til en while-løkke?
Det finnes ofte flere ulike måter til å gjøre det samme ting med programmering. Noen er enklere å bruke enn andre, og det kommer an på konteksten hva som er den beste muligheten.
Eksempel 4: problemløsning ved hjelp av en for-loop i Python
Her er et eksempel på problemløsning ved hjelp av en for-loop i Python. Vi skal løse Problem 1 fra projecteuler.net:
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
Så hvordan går vi fra problem til kode? Denne prosessen kan deles opp i to deler.
- Finne en algoritme som løser problemet.
- Implementere algoritmen i valgt programmeringsspråk (i vårt tilfelle, Python).
Algoritme
La oss begynne med den første delen. Vi vil finne ut et sett med instrukser som gir summen vi trenger. Om vi ville beregnet summen opp til 10 selve, med papir og penn, ville vi sannsynligvis tenkt/gjort noe slikt:
1 er ikke et multiplum av 3 eller 5, så gjør vi ingen med dette tallet.
2 er ikke et multiplum av 3 eller 5, så gjør vi ingen med dette tallet.
3 er et multiplum av 3, så vi må ta med tallet i summen. Summen vår blir da 3.
4 er ikke et multiplum av 3 eller 5, så gjør vi ingen med dette tallet.
5 er et multiplum av 5, så vi må ta med tallet i summen. Summen vår blir da 3 + 5 = 8.
6 er et multiplum av 3, så vi må ta med tallet i summen. Summen vår blir da 8 + 6 = 14.
7 er ikke et multiplum av 3 eller 5, så gjør vi ingen med dette tallet.
8 er ikke et multiplum av 3 eller 5, så gjør vi ingen med dette tallet.
9 er et multiplum av 3, så vi må ta med tallet i summen. Summen vår blir da 14 + 9 = 23.
Vi prøver å sammenfatte hva vi gjør her. Vi går igjennom tallene fra 1 til 9 og sjekker om tallet er et multiplum av 3 eller 5. Ved sånt tilfelle adderer vi tallet til summen. La oss skrive dette litt klarere, og for et vilkårlig tall N som øvre grense:
Gå igjennom heltallen 1 fra til N-1 (for eksempel 9 om den øvre grensen er 10).
For hvert tall, sjekke om tallet er et multiplum av 3 eller 5.
Om det er det, addere tallet til summen.
Dette er algoritmen vår. Den er ikke avhengig av noe programmeringsspråk. Dette er bare et sett med instrukser som, om man utfører dem, gir summen fra problemet.
Implementasjon
Nå er det tid for del 2: å implementere algoritmen i Python. Her må man finne de delene av programmeringsspråket man skal bruke. I dette tilfelle vil vi gjøre noe for alle tall fra 1 til den øvre grensen (som vi gir navnet max_N). Dette kan vi for eksempel gjøre med en for-loop over range(max_N). Denne går fra og med null til og med max_N - 1:
max_n = 10
for n in range(max_n):
For hver iterasjon av for-løkken skal vi sjekke om det aktuelle tallet n er et multiplum av 3 eller 5. Dette kan vi gjøre med et if-statement innen for-løkken. Her sjekker vi om tallet er delelig med 3 eller 5 (det er samme som at det er et multiplum av 3 eller 5) med koden n % 3 == 0 or n % 5 == 0
. Hvis vilkåret er oppfylt, adderer vi tallet til summen med koden summe += n
. Ellers skal vi ikke gjøre noe, så det er ingen mer kode innen for-løkken.
Her er koden. Kjør koden og endre på max_n sånn at du kan svare på problemet. Hva er summen av alle multiplumer av 3 og 5 som er mindre enn 1000?
# Problemløsning
max_n = 10
summe = 0
for n in range(max_n):
if (n % 3 == 0) or (n % 5 == 0):
summe += n
print(f"The sum of all multiples of 3 or 5 below {max_n} is {summe}")
Hvordan kunne du svare på problemet med while-løkke i stedet av for-løkken?
Eksempel 7:
Her er noen eksempler på kode som ikke er riktig.
PS: Når vi bruker while-loops er det mulig å lage program som aldri stopper om vilkåret i while-løkken alltid er oppfylt. Om du tror at koden din er i en uendelig loop kan du avslutte kjøringen ved å taste
ctrl-c
i terminalen som kjører koden.
Prøv først om du kan finne feilen i koden. Kjør siden koden og se hva som skjer. Endre koden slik at den går å kjøre, og ikke blir fast i en uendelig loop.
print("Countdown:")
n = 10
while n > 0:
print(n)
print("Countdown again:")
n = 10
while n > 0:
print(n)
n += 1
print("Multiples of 3:")
i = 30
while i >= 0:
if i % 3 != 0:
continue
i -= 1
print(i)
i -= 1
print("Find the sum of all numbers from 1 to 100")
for n in range(1, 101):
total = 0
total += n
print(total)
print("Again, find the sum of all numbers from 1 to 100")
for n in range(1, 101):
sum_2 += n
print(sum_2)