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.

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

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