«for»-løkker

I artikkelen om løkker bruker vi Python-koden under til å skrive ut de 5 første kvadrattallene:

for n in range(1, 6):
    print(n**2)

Dette er ei for-løkke.

Ei for-løkke består av kodeordet for etterfulgt av et variabelnavn, deretter kodeordet in etterfulgt av en mekanisme som generer verdier til variabelen, og til slutt et kolon. I eksemplet over bruker vi Pythons innebygde funksjon range() til å generere variabelverdiene. Det er ikke den eneste måten å gjøre det på, men det er den måten vi skal bruke foreløpig. range(1, 6) betyr heltallene i intervallet [1, 6), det vil si 1, 2, 3, 4 og 5. Sluttverdien i range() tas altså ikke med. Verdiene tildeles fortløpende til variabelen, som vi kaller løkkevariabelen eller iterasjonsvariabelen. For hver ny verdi gjennomløpes kodelinjene i løkka, det vil si i den tilhørende blokka som er rykket inn. I eksemplet over kjøres altså linja med print() 5 ganger, med n lik henholdsvis 1, 2, 3, 4 og 5.

Generelt bør vi gi variabler beskrivende navn, men som løkkevariabler er navn på 1 bokstav, som n, m, k, helt i orden.

I eksemplet over ga vi inn to argumenter til range(), startverdien og sluttverdien. Hvis vi utelater startverdien, blir den satt til 0. Vi kan også legge til en skrittverdi bakerst, som angir hvilke skritt verdien skal endres med. I eksemplet over ga vi ikke inn noen skrittverdi, da ble den automatisk satt til 1.

Python-funksjonen range() har altså formen range(start, slutt, skritt), der start og skritt kan sløyfes.

Eksempel 1:

range(10) betyr verdiene 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

range(3, 10) betyr verdiene 3, 4, 5, 6, 7, 8, 9.

range(-2, 5) betyr verdiene −2, −1, 0, 1, 2, 3, 4.

range(1, 10, 2) betyr verdiene 1, 3, 5, 7, 9.

start, slutt og skritt må være heltall, men kan gjerne være negative. En negativ skrittverdi betyr at vi teller nedover.

Eksempel 2:

range(5, -3, -1) betyr verdiene 5, 4, 3, 2, 1, 0, −1, −2.

Oppgave 1:

Skriv Python-kode som beregner og skriver ut de 10 første kvadrattallene, altså 12, 22, 32, … 102.

Endre deretter koden slik at den bare tar med kvadratet av oddetallene mellom 1 og 10, altså 12, 32, 52, 72, 92.

Se løsningsforslag

Oppgave 2:

Studer for-løkkene under og avgjør hvilke verdier som vil bli skrevet ut. Sjekk deretter i Python om du har rett.

for n in range(5, 1, -2):
    print(n)
for n in range(-5, 10, 2):
    print(n)

Vi kan naturligvis kombinere for og if. Eksempel 3 under består av ei for-løkke som gjennomløper tallene fra 1 til 100 og skriver ut alle tallene som er delelige med 7. Et tall er delelig med 7 når tallet modulo 7 er 0.

Se løsningsforslag

Eksempel 3:

# Skriver ut tallene mellom 1 og 100 som er delelige med 7
for n in range(1, 101):
    if n % 7 == 0:
        print(f"{n} er delelig med 7.")

Vi ser at linja med if er rykket inn én gang fordi den ligger i blokka som tilhører for-løkka. Linja med print() er rykket inn to ganger fordi den ligger i blokka som både tilhører if og for.

Oppgave 3:

Modifiser koden i eksempel 3 slik at den skriver ut tallene mellom 1 og 100 som er delelige med 5 i stedet for delelige med 7.

Se løsningsforslag

Oppgave 4:

Koden under er den samme som i eksempel 3, men vi har bare rykket inn linja med print() én gang. Vurder hvilken effekt det vil ha på koden, og sjekk deretter om du har rett ved å kjøre koden i Python.

for n in range(1, 101):
    if n % 7 == 0:
        pass
    print(f"{n} er delelig med 7.")

Se løsningsforslag

Løkkevariabel som ikke brukes

La oss si at vi skal skrive Python-kode for å la skoleelever trene på 7-gangen. De skal skrive inn et tall de tror er i 7-gangen, og koden skal avgjøre om det de skriver, er riktig eller ikke. Koden kan se ut som i eksempel 4.

Eksempel 4:

# Leser inn et tall og avgjør om det er i 7-gangen
tall = int(input("Skriv et tall i 7-gangen: "))
if tall % 7 == 0:
    print(f"Riktig. {tall} er i 7-gangen.")
else:
    print(f"Feil. {tall} er ikke i 7-gangen.")

Men så ønsker vi at denne koden skal gjentas ti ganger. Det kan vi gjøre ved å bygge den inn i ei for-løkke som gjennomløpes 10 ganger, altså ved å legge den med innrykk under en kode som dette:

for n in range(10):

Her vil range() tildele verdiene 0, 1, …, 9 til løkkevariabelen n. Men vi trenger jo egentlig ikke n til noe, den er der bare fordi Python krever at det skal stå et variabelnavn mellom for og in. I tilfeller der vi har variabler som ikke brukes, eller bare brukes midlertidig til kladd, sier stilguiden PEP 8 at vi skal bruke en enkel understreking, altså _, som variabelnavn. Den komplette koden bør altså se ut som i eksempel 5.

Eksempel 5:

Koden under gjennomløper koden fra eksempel 4 ti ganger.

for _ in range(10):
    # Leser inn et tall og avgjør om det er i 7-gangen
    tall = int(input("Skriv et tall i 7-gangen: "))
    if tall % 7 == 0:
        print(f"Riktig. {tall} er i 7-gangen.")
    else:
        print(f"Feil. {tall} er ikke i 7-gangen.")

SkjermfilmSe film om for-løkker

Kilder

    • Matthes A. (2019). Python Crash Course. no starch press

I språk som C og JavaScript har for-løkker en litt annen form. Generelt har de formen for(startuttrykk, sluttbetingelse, oppdateringsuttrykk). For eksempel vil for(n = 1; n <= 3; n += 0.5) gjennomløpe den tilhørende løkka med n som har verdier 1, 1,5, 2, 2,5 og 3. Uttrykkene er mer kompliserte enn i Python, men gir også betydelig større fleksibilitet.