Centralt innehåll

Fakta

Loopar fanns redan i tidigare programmeringsspråk, men just termen for användes för första gången 1958 i programmeringsspråket ALGOL 58.

1. Loopar

Ofta vill man utföra samma sak flera gånger i ett program. Att upprepa kod brukar kallas för att repetera, loopa eller iterera. Genom iterationer kan man utföra samma eller nästan samma kod flera gånger, antingen ett bestämt antal gånger eller så länge som ett villkor är sant.

Satser för upprepning kallas oftast för repetitionssatser eller loopar. Det finns två olika typer av repetitionssatser, while-loopen och for-loopen.

1.1 while-loopen

Om man vill upprepa en eller flera satser är det enkelt att använda en while-loop. while-loopen körs så länge som villkoret som styr loopen är sann. Med en while-loop upprepas alltså ett block med kod så länge det givna villkoret är sant.

# Exempel 1.1.1 - Skriver ut alla positiva heltal från 1 till 5

tal = 1
while tal <= 5:
    print(tal)
    tal = tal + 1
print('Loopen har avslutats')
ger utskriften
            1                    
2                    
3                    
4                    
5                    
Loopen har avslutats

While-loopen ser ut som if-satsen, men det står while i stället för if.

while tal <= 5:

De rader som ska utföras så länge som villkoret i while-loopen är sann måste vara indenterade.

    print(tal)
    tal = tal + 1

Raderna kommer att utföras ett visst antal gånger (ingen eller flera gånger). Villkoret kontrolleras före varje gång raderna ska utföras. Om villkoret är sant utförs raderna en gång till. Om villkoret är falskt utförs inte de indenterade raderna och programmet fortsätter med nästa rad efter while-loopen.

print('Loopen har avslutats')
# Exempel 1.1.2 - Skriver ut alla positiva heltal från 1 till 5 på samma rad

tal = 1
while tal <= 5:
    print(tal, end = ' ')   # Byter inte rad utan skriver ut ett mellanslag
    tal = tal + 1
ger utskriften
            1 2 3 4 5
# Exempel 1.1.3 - Skriver ut alla jämna positiva heltal mindre än 10

tal = 2
while tal < 10:
    print(tal)
    tal += 2  # Förkortad version av tal = tal + 2
print('Loopen har avslutats')
ger utskriften
            2                    
4                    
6                    
8                    
Loopen har avslutats

I den kod som upprepas måste villkoret ändras så att det förr eller senare inte längre är sant, annars får man en oändlig loop, dvs en loop som aldrig slutar att exekvera. Prova att ta bort eller kommentera bort raden tal += 2 så att du får en oändlig loop.

# Exempel 1.1.4 - Oändlig loop
tal = 2
while tal < 10:
    print(tal)
    # tal += 2
print('Loopen har avslutats')

Kör programmet, loopen fortsätter i all oändlighet, eftersom villkoret alltid är sant. Klicka på knappen "stop" i repl.it för att avsluta körningen.

# Exempel 1.1.5 - Skriver ut alla jämna positiva heltal mindre än 10 på samma rad med mellanslag

tal = 2
while tal < 10:
    print(tal, end = ' ')
    tal += 2  # Förkortad version av tal = tal + 2
ger utskriften
            2 4 6 8
# Exempel 1.1.6 - Skriver ut alla jämna positiva heltal mindre än 10 på samma rad utan mellanslag

tal = 2
while tal < 10:
    print(tal, end = '')
    tal += 2  # Förkortad version av tal = tal + 2
ger utskriften
            2468

Programmet beräknar medelvärdet av ett antal positiva heltal som skrivs in av användaren. Inmatningen avbryts när en nolla skrivs in. När man inte på förhand vet hur många gånger något ska upprepas är while-loopen ett bra alternativ.

# Exempel 1.1.7 - beräknar medelvärdet av ett antal positiva heltal

antal = 0
summa = 0
tal = int(input('Ange ett positivt heltal: '))
while tal != 0:
    antal = antal + 1      # Vad händer med antalet?
    summa = summa + tal    # Vad händer med summan?
    tal = int(input('Ange ett positivt heltal: '))

if antal != 0:
    medelvärde = summa / antal
    print('Medelvärdet är', medelvärde)
else:
    print('Du har inte skrivit in några tal')
kan ge utskriften
            Ange ett positivt heltal: 3 
Ange ett positivt heltal: 7 
Ange ett positivt heltal: 4 
Ange ett positivt heltal: 8 
Ange ett positivt heltal: 0 
Medelvärdet är 5.5

Före medelvärdet beräknas upprepas while-satsen tills användaren skriver i en nolla.
Sedan kontrolleras också att användaren skrivit in minst ett tal, dvs att variabeln antal är större än noll, innan medelvärdet beräknas. För om antalet är noll kommer programmet att krascha pga av medelvärdet beräknas genom att summan divideras med antal, vilket betyder division med noll. Men det undviker koden här genom att först kontrollera att variabeln antal är skilt ifrån noll.

Vill man även kontrollera att angivet tal verkligen är ett positivt heltal kan koden ändras lite för att även kontrollera det. Det kontrolleras med en if-sats som ligger i while-loopen. Det går bra att ha de olika satstyperna i varandra, s.k. nästlade satser. Var noga med att indenteringen blir rätt, annars kan hela kodens logik förändras.

# Exempel 8 - beräknar medelvärdet av ett antal positiva heltal, med kontroll att talen är positiva

antal = 0
summa = 0
tal = -1
while tal != 0:
    tal = int(input('Ange ett positivt heltal: '))
    if tal < 0:
        print('Du måste ge ett positivt heltal')
    elif tal > 0:
        antal = antal + 1      # Vad händer med antalet?
        summa = summa + tal    # Vad händer med summan?

if antal != 0:
    medelvärde = summa / antal
    print('Medelvärdet är', medelvärde)
else:
    print('Du har inte skrivit in några tal')

1.2 for-loopen

När du vet hur många gånger kodraderna ska upprepas är for-loopen att föredra.

# Exempel 1.2.1 - Ett program som beräknar de 15 första talen i 8-ans multiplikationstabell

print(0 * 8)
print(1 * 8)
print(2 * 8)
print(3 * 8)
print(4 * 8)
print(5 * 8)
print(6 * 8)
print(7 * 8)
print(8 * 8)
print(9 * 8)
print(10 * 8)
print(11 * 8)
print(12 * 8)
print(13 * 8)
print(14 * 8)

Tänk om det hade varit de 1000 första talen i 8:ans multiplikationstabell?

En for-loop kan användas för att göra koden enklare.

För att skriva en for-loop anger man någon variabel, ofta används variabelnamnet i, och följande konstruktion där talföljden skapas av satsen range().

# Exempel 1.2.2 - for-loop med range

for i in range(15):
    print(i * 8)

For-loopen börjar med ordet for och sedan ett variabelnamn, oftast används i. Variabeln i fungerar som en räknare och kommer att få olika värden i varje upprepning. Efter variabelnamnet kommer ordet in. Efter in ska man tala om vilka värden variabeln i ska ha under upprepningarna. Range bestämmer antalet upprepningar och vilket intervall variabeln i:s värden varierar.

Ger man ett värde till range är det antalet upprepningar och variabeln i:s värde varierar mellan 0 upp till det slutvärde som angavs. Observera att det slutvärdet som ges i range inte ingår i intervallet.

# Exempel 1.2.3 - for-loop med ett slutvärde i range

for i in range(5):
    print(i)
ger utskriften
            0            
1            
2            
3            
4
# Exempel 1.2.4 - for-loop med ett slutvärde i range och utskrift på samma rad

for i in range(5):
    print(i, end = ' ')
ger utskriften
            0 1 2 3 4

Ger man två värden till range är det i:s startvärde och slutvärde. Slutvärde – startvärde ger då antalet upprepningar. Observera att startvärdet i range ingår i intervallet, men inte slutvärdet.

# Exempel 1.2.5 - for-loop med start och slutvärde

for i in range(4, 10):
    print(i)
ger utskriften
            4            
5            
6            
7            
8            
9
# Exempel 1.2.6 - for-loop med start och slutvärde utskriven på samma rad utan mellanslag

for i in range(4, 10):
    print(i, end = '')
ger utskriften
            456789

Ger man tre värden till range är det i:s startvärde, slutvärde och steg. Intervallet börjar med startvärdet för variabeln i som sedan ökas med värdet för steg i varje upprepning, så länge som värdet är mindre än slutvärdet.

# Exempel 1.2.7 - for-loop med startvärde, slutvärde och steg

for i in range(4, 10, 2):
    print(i)
ger utskriften
            4
6
8

Steget kan vara negativt. Intervallet börjar med startvärdet för variabeln i som sedan minskas med värdet för steg i varje upprepning, så länge som värdet är större än slutvärdet.

# Exempel 1.2.8 -  for-loop med startvärde, slutvärde och negativt steg

for i in range(5, 2, -1):
    print(i, end = ' ')
ger utskriften
            5 4 3

Om man i förväg vet hur många gånger man vill upprepa ett block kod, kan man använda en for-loop och den inbyggda funktionen range(). Funktionen range() skapar en talföljd som kan specificeras på olika sätt. Om start, slut och steg är tal, kan funktionen range() användas på följande sätt:

1.3 Summera tal

# Exempel 1.3.1 - summera tal med en for-loop

summa = 0
for tal in range(6):
    summa = summa + tal

print(summa)
ger utskriften
            15

Om man vill använda en utökad tilldelningsoperator går det att skriva: summa += tal istället för summa = summa + tal

# Exempel 1.3.2 - summera med operatorn +=, summan av 0 + 1 + 2 + 3 + 4 + 5 beräknas

summa = 0
for tal in range(6):
    summa += tal

print(summa)
ger utskriften
            15
# Exempel 1.3.3 - beräknar summan av alla jämna heltal i intervallet 500 - 1000

summa = 0
for i in range(500, 1001, 2):
    summa += i

print(summa)
ger utskriften
            188250
# Exempel 1.3.4 - summera tal med en while-loop

summa = 0
tal = 0
while tal < 6:
    summa = summa + tal
    tal = tal + 1

print(summa)
ger utskriften
            15

2. Nästlade for-loopar

En loop i en annan loop kallas för nästlade loopar.

# Exempel 3.1 - nästlade loopar

for x in range(2):
    for y in range(3):
        print('Python')
ger utskriften
            Python       
Python       
Python       
Python       
Python       
Python

Den inre loopen (med variabeln y) körs 3 upprepningar, dvs 3 utskrifter av ordet Python. Men den inre loopen ligger i sin tur i en yttre loop (med variabeln x), som körs 2 gånger. Den inre loopen körs alltså 2 gånger och vardera gången skrivs ordet Python ut 3 gånger. Sammanlagt skrivs alltså ordet Python ut 6 gånger.

Samma exempel, men om utskriften ändras till värdena på x och y.

# Exempel 3.2 - nästlade loopar med utskrift av värden

for x in range(2):
    for y in range(3):
        print('x =', x, 'y =', y)
ger utskriften
            x = 0 y = 0  
x = 0 y = 1  
x = 0 y = 2  
x = 1 y = 0  
x = 1 y = 1  
x = 1 y = 2
# Exempel 3.3 - utskrift av multiplikationstabeller med nästlade loopar

for tabell in range(1, 4):
    print('')   # Skriver ut en tom rad
    print(tabell, ':ans tabell', sep='')

    for tal in range(1, 11):
        produkt = tabell * tal
        print(tabell, '*', tal, '=', produkt)
ger utskriften
            1:ans tabell 
1 * 1 = 1    
1 * 2 = 2    
1 * 3 = 3    
1 * 4 = 4    
1 * 5 = 5    
1 * 6 = 6    
1 * 7 = 7    
1 * 8 = 8    
1 * 9 = 9    
1 * 10 = 10  

2:ans tabell 
2 * 1 = 2    
2 * 2 = 4    
2 * 3 = 6    
2 * 4 = 8    
2 * 5 = 10   
2 * 6 = 12   
2 * 7 = 14   
2 * 8 = 16   
2 * 9 = 18   
2 * 10 = 20  

3:ans tabell 
3 * 1 = 3    
3 * 2 = 6    
3 * 3 = 9    
3 * 4 = 12   
3 * 5 = 15   
3 * 6 = 18   
3 * 7 = 21   
3 * 8 = 24   
3 * 9 = 27   
3 * 10 = 30

Begrepp

Iteration: Repetition, upprepning, loop. Satser som upprepas.

While-loop: Upprepar satser så länge som ett villkor är sant. Villkoret kontrolleras först i varje upprepning.

For-loop: Upprepar satser ett givet antal gånger.

Oändlig loop: En loop där villkoret aldrig blir falskt, och som upprepas i all oändliget.

Utökad tilldelningsoperator: En förkortad version av en tilldelning och beräkning, t.ex. +=

Nästlad repetitionssats: En loop i en annan loop.

Övningar

Du kan inte att lära dig att programmera genom att läsa en bok eller titta på videos. Du måste öva på att skriva kod själv och ju mer du övar desto bättre blir du.
  1. Vad blir utskriften?
    tal = 1
    while tal < 4:
        print(tal, end = ' ')
        tal = tal + 1
    tal = 1
    while tal <= 4:
        print(tal, end = ' ')
        tal += 1
    tal = 0
    while tal < 5:
        print(tal, end = ' ')
        tal += 1
    tal = 2
    while tal <= 5:
        tal += 1
        print(tal, end = ' ')
  2. Skriv ett program som med while-loopen skriver ut:
    alla tal mellan 0 och 10
    alla tal mellan 1 och 12
    alla tal mellan 14 och 2
    alla tal mellan 1 och 100
    alla tal mellan 10 och 100
  3. Använd while-loopen för att skriva ut alla multipler av 3 som är mindre än 50.
  4. * Ett A4-papper är 0,1 mm tjockt. Om man viker pappret dubbelt blir det 0,2 mm tjockt. Antag att det går att vika pappret dubbelt ett obegränsat antal gånger. Använd en loop för att beräkna hur många gånger r pappret måste vikas dubbelt så att tjockleken blir lika med avståndet till månen, som är 384 000 km.
    Tips: Använd while-loopen.
  5. Vad blir utskriften?
    for i in range (5):
        print(i, end = '')
    for i in range (10):
        print(i, end = '')
    for i in range (1, 10):
        print(i)
    for i in range (2, 7):
        print(i)
    for i in range (0, 10, 1):
        print(i)  
    for i in range (10, 0, -1):
        print(i)
    for i in range (0, 10, 2):
        print(i, end = ' ')  
  6. for n in range(1, 11):
        print(n * 8)
    Ändra i programmet så att det beräknar och skriver ut de
    fem första talen i sjuans tabell
    fem första talen i åttans tabell
    tolv första talen i nians tabell
  7. Skriv ett program som med for-loopen skriver ut:
    alla tal mellan 1 och 12
    alla tal mellan 17 och 23
    alla tal mellan 14 och 2
    alla tal mellan 1 och 100
    alla tal mellan 10 och 100
  8. Skriv ett program som skriver ut:
    alla jämna heltal mellan 2 och 50
    alla udda tal mellan -9 och 9
    alla jämna heltal mellan 1 och 20 baklänges.
  9. Skriv ett program som beräknar värdet av uttrycket 3x+3 för alla heltal från x=1 till x=10
  10. * Ett bankkonto har en ränta på 1.2 % per år. Hur mycket har startkapitalet växt efter 5 år?
  11. * Skriv ett program som skriver ut alla heltal mellan 0 och 100, som är delbara med 3

Inlämningsuppgift

Exit tickets - While

login     logout    

Exit tickets



Uppgift - Fråga

Skriv ett program där användaren får svara på en fråga tills rätt svar anges. Frågan ska alltså upprepas så länge som användaren svarar fel (tips: använd while-loopen).

Frågan och rätt svar ska vara variabler som skrivs överst i koden, t.ex.

question = 'Vad heter Sveriges huvudstad? '
correct_answer = 'Stockholm'
Exempelkörning:
Vad heter Sveriges huvudstad? Oslo
Fel svar

Vad heter Sveriges huvudstad? Copenhagen
Fel svar

Vad heter Sveriges huvudstad? Stockholm
Korrekt svar

Programmet avslutas

Hur hanterar du svar där skillnaden endast är stora/små bokstäver, t.ex. om användaren svarar stockHolm?

OBS! Kontrollera att ditt program fungerar genom att byta fråga och svar genom att endast byta värden för variablerna question och correct_answer och sedan provköra igen.

Kom ihåg! Använd beskrivande variabelnamn och kommentera koden.

Frivillig utmaning

Räkna antal försök som behövs för att svara rätt.

Exempelkörning:
Vad heter Sveriges huvudstad? Oslo
Fel svar

Vad heter Sveriges huvudstad? Stockholm
Korrekt svar

Du svarade korrekt efter 2 försök

Frivillig extra utmaning

Begränsa antalet försök.

question = 'Vad heter Sveriges huvudstad? '
correct_answer = 'Stockholm'
max_tries = 3

Exempelkörning:
Vad heter Sveriges huvudstad? Oslo
Försök 1: Fel svar

Vad heter Sveriges huvudstad? Helsingfors
Försök 2: Fel svar

Vad heter Sveriges huvudstad? Köpenhamn
Försök 3: Fel svar

Frågan avbryts: Du svarade fel trots 3 försök