Løkker


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 evaluerer til True.

x = 0
while x < 5:
    print("Jeg skal være snill", x)
    x += 1

print("Ferdig!")

En iterasjon er en gjennomkjøring av kodeblokken inni en løkke. I eksempelet over utføres koden fem ganger, og vi sier at løkken har fem iterasjoner.

While-løkker er spesielt godt egnet for tilfeller der vi ønsker å gjenta den samme operasjonen flere ganger, men vi vet ikke på forhånd hvor mange ganger. For eksempel kan vi ønske å finne det minste heltallet \(n\) slik at \(n^2\) er større enn 1000. Ved hjelp av en løkke kan vi prøve alle mulige positive heltall helt til vi finner det vi leter etter:

n = 1
while n * n <= 1000:
    n += 1
print(n, "er laveste heltall slik at n^2 er større enn 1000")

Et irriterende program.1

name = ''
while name != 'your name':
    print('Please type your name.')
    name = input()
print('Thank you!')

Et program for å telle antall siffer i et tall.

x = 222222

part_of_x = abs(x)
count = 0

while part_of_x > 0:
    count += 1
    part_of_x = part_of_x // 10

print(f"Det er {count} siffer i {x}.")
Uendelig løkke

Når man skriver en while-løkke, kan man risikere at løkken varer evig dersom betingelsen alltid blir tilfredsstilt.

x = 1
while x < 10:
    print(x)
    x + 1     # Glemt tilordning; variabelen a endres ikke

Hjelp, programmet mitt avsluttes ikke! For å avbryte en evig løkke, trykk ctrl + c når fokuset er på terminalen hvor koden kjøres.

Break og continue

Break benyttes for å bryte ut av en løkke.

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 (neste steg blir å sjekke betingelsen på nytt).

while True:
    print("Brukernavn: ", end="")
    username = input()

    if username == "":
        break # Avbryter løkken

    if username != "admin":
        print(f"Fant ikke bruker {username}")
        continue # Avbryter resten av iterasjonen

    print(f"Passord for {username}: ", end="")
    password = input()
    if password == "42":
        print("Du er nå logget inn")
        print("Bla bla bla")
        print("Du er nå logget ut igjen")

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.

print("------------For-løkke--------------")

for i in range(5):
    print("Jeg skal være snill", i)
print("Ferdig!")


print("------------While-løkke------------")

i = 0
while i < 5:
    print("Jeg skal være snill", i)
    i += 1
print("Ferdig!")

Man kan angi hvor en for-løkke begynner og slutter hvor store hopp som skal gjøres mellom hver iterasjon.

print("---------For-loop--------")
for x in range(2, 19, 3):
    print(x)

print("---------While-loop---------")
x = 2
while x < 19:
    print(x)
    x += 3
# Skriv ut tallene mellom a og b
a = 3
b = 10

print("---------For-loop---------")
for i in range(a, b + 1):
    print(i, end=" ")
print()

print("---------While-loop---------")
i = a
while i <= b:
    print(i, end=" ")
    i += 1
print()

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, end=" ")
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, end=" ")
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, end=" ")
print()
# Hopp kan også være negativ. Eksempel: 10 9 8 7 6
for i in range(10, 5, -1):
    print(i, end=" ")
print()
# En range kan være tom
print("---")
for i in range(3, 3):
    print(i, end=" ")
print()
for i in range(19, 3):
    print(i, end=" ")
print()
for i in range(5, 10, -1):
    print(i, end=" ")
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 – altså både strenger, ranges, lister eller en annen type samling.

s = "foo"
for letter in s:
    print(letter)
print()

for x in ["en", "liste", "med", "strenger"]:
    print(x)
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})", end=" ")
    print()
# Hvilken figur tegner vi her?
height = 5

for row in range(height):
    for col in range(row):
        print("*", end="")
    print()
Stil

Benytt alltid en for-løkke hvis det er naturlig. 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.

# Dårlig
repetitions = 5
x = 0
while x < repetitions:
    print("Jeg skal være snill", x)
    x += 1
# Bra
repetitions = 5
for x in range(repetitions):
    print("Jeg skal være snill", x)

    

  1. Fra Automate the Boring Stuff with Python. Al Sweigart, CC BY-NC-SA 3.0. ↩︎