Les og utforsk
Introduksjon
Denne uken vil vi utforske while- og for-løkker, etter å ha fokusert på if-setninger i forrige uke. Du bør føle deg trygg i bruken av alle tre, if, while og for, etter denne uken. Se https://automatetheboringstuff.com/2e/chapter2/ for en detaljert oversikt.
While-løkker
For å utføre en blokk med kode flere ganger, kan man benytte en while-løkke. Koden inne i løkken utføres så lenge betingelsen er true.
x = 0
while x < 5:
print("Jeg skal være snill", x)
x += 1
print("Ferdig!")
print("Countdown...")
num = 10 # start
while num > 0: # test
print(num)
num -= 1 # update
#first square less than 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
En iterasjon er en gjennomkjøring av kodeblokken inni en løkke.
# Use a counting loop to do something 7 times.
n = 0
while n < 7:
print("Hello!")
n += 1
Det er ikke mulig å kjøre interaktive løkker i Brython på denne netsiden. Du må lime inn koden i VS-code.
# Read input 5 times:
n = 0
while n < 5:
name = input(f"Name {n+1}? ")
print("Hello,", name)
n += 1
While -løkker er hendig når man ikke vet på forhånd hvor mange iterasjoner man trenger. Et irriterende program.1
name = ''
while name != 'your name':
print('Please type your name.')
name = input()
print('Thank you!')
Uendelig løkke
Først ting først: For å komme deg ut av en evig løkke, trykk
ctrl + c
når fokuset er på terminalen hvor koden kjøres.
Når man skriver en while-løkke, kan man risikere at løkken varer evig dersom betingelsen alltid blir tilfredsstilt.
a =0
b=5
while a < b + 1:
print(a)
a + 1 # Glemt tilordning, a endres ikke
Når vi kjører koden på denne nettsiden/i Brython, avbrytes løkken av en timeout. Om koden kjøres som en fil eller i REPL, vil løkken vare evig.
Break og continue
Break benyttes for å bryte ut av en løkke.
# Running an endless loop with a break condition is a common pattern.
while True:
answer = input("Should we continue? ")
if answer == "n":
break
print("Great, let's go one more time...")
print("Bye!")
while True:
print('Please type your name.')
name = input()
if name == 'your name':
break
print('Thank you!')
Continue benyttes for å hoppe over resten av kodeblokken og gå tilbake til begynnelsen av løkken.
while True:
username = input("Brukernavn: ")
if username == "":
break # Avbryter løkken
if username != "admin":
print("Fant ikke bruker")
continue # Avbryter resten av iterasjonen
print(f"Passord for {username}: ")
password = input()
if password == "42":
print("Du er nå logget inn")
break # Avbryter hele resten av funksjonen
print("Slår av maskinen nå.")
For-løkker og range
Det er ofte at vi vet på forhånd hvor mange ganger vi ønsker at løkken skal kjøres. Da bør vi benytte en for-løkke.
En for-løkke er kortere å skrive enn en while-løkke, og reduserer faren for feil og bugs.
# Every for-loop can be written as a while-loop:
print("---------While-loop---------")
x = 2
while x < 19:
print(x)
x += 3
print("---------For-loop--------")
for x in range(2, 19, 3):
print(x)
print("---------While-loop---------")
x = 0
while x < 5:
print("Jeg skal være snill", x)
x += 1
print("Ferdig!")
print("---------For-loop--------")
for i in range(5):
print("Jeg skal være snill", i)
print("Ferdig!")
range()
-funksjonen gir oss en ordnet samling med tall. Funksjonen kan ta ett, to eller tre heltalls argumenter.
# Ett argument: begynner med 0 og går opp til (og ikke
# inkludert) det gitte argumentet. Eksempel: 0 1 2 3
for i in range(4):
print(i)
print()
# To argument: tallene begynner på det første tallet,
# og går opp til (og ikke inkludert) det andre tallet.
# Eksempel: 6, 7, 8, 9, 10
for i in range(6, 11):
print(i)
print()
# Tre argument: de to første argumentene betyr det
# samme som for to argumenter. Det tredje argumentet
# beskriver hvor store hopp som gjøres mellom hver
# iterasjon. Eksempel: 3, 5, 7, 9 (hopper med 2)
for i in range(3, 11, 2):
print(i)
print()
# Hopp kan også være negativ. Eksempel: 10 9 8 7 6
for i in range(10, 5, -1):
print(i)
print()
# En range kan være tom
print("---")
for i in range(3, 3):
print(i)
print()
for i in range(19, 3):
print(i)
print()
for i in range(5, 10, -1):
print(i)
print()
print("---")
En range er en samling med tall. En streng er en samling med bokstaver. En for-løkke kan brukes for å iterere over alle typer samlinger.
s = "foo"
for letter in s:
print(letter)
print()
Nøstede løkker
# Vi kan ha løkker inni løkker
rows = 3
cols = 5
for row in range(rows):
for col in range(cols):
print(f"({row}, {col})")
print()
# Hvilken figur tegner vi her?
height = 5
for row in range(height):
for col in range(row):
print("*", end="")
print()
Turtle
import turtle as t
t.speed(0)
t.colormode(255) # set color to rgb color mode (r,g,b)
sidelength = 20 # set length of side
for i in range(30):
# update position and color
t.right(15)
t.color(255 - (3 * i), 132 - (3 * i), 190 - (3 * i))
# draw basic square
sides = 0
while sides < 4:
t.forward(sidelength + (5 * i))
t.right(90)
sides += 1
t.done()
Stil
Benytt alltid en for-løkke hvis det er naturlig, dvs når vi vet på forhånd hvor mange ganger løkken skal kjøre. Dette gjør det lettere å forstå koden, og er mindre utsatt for bugs som gjør at programmet blir sittende fast i en uendelig løkke.
|
|
Finn Feilene
Her er noen eksempler på kode som ikke er riktig.
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):
sum = 0
sum += n
print(sum)
print("Again, find the sum of all numbers from 1 to 100")
for n in range(1, 101):
sum_2 += n
print(sum_2)
Fra Automate the Boring Stuff with Python. Al Sweigart, CC BY-NC-SA 3.0. ↩︎