Loopar, listor och slumptal

Datorer är bra på att göra samma sak många gånger. Med loopar upprepar du kod, och med listor sparar du många värden i en och samma variabel. Målet är att du ska kunna skriva for- och while-loopar och skapa enkla listor.

for-loopar

En for-loop kör koden en gång för varje värde i en följd. Varje varv får loopvariabeln nästa värde:

Python · du kan ändra koden
for x in [1, 5, 10]:
    print(f"x är nu {x}")

Vill du loopa över en talföljd använder du range(). range(0, 5) ger talen 0, 1, 2, 3 och 4 — det sista talet kommer inte med.

Python · du kan ändra koden
for x in range(0, 5):
    print(x)

Uppgift · Räkna till tio

Skriv ett program som skriver ut talen 1 till 10 med en for-loop.

Din lösning · du kan ändra koden
# Skriv din kod här
Visa lösningsförslag
Python · du kan ändra koden
for tal in range(1, 11):
    print(tal)

Eftersom det sista talet i range() inte kommer med måste det stå 11 för att 10 ska komma med.

while-loopar

En while-loop körs så länge ett villkor är sant. while x < 10: körs alltså om och om igen tills x inte längre är mindre än 10.

Python · du kan ändra koden
x = 1
while x < 10:
    print(x)
    x = x * 2

Ofta skriver man while True: — en loop som i princip körs i all oändlighet — och avbryter den med break när man är klar.

break

break avbryter loopen direkt. Här ökar x med ett varje varv, och loopen avbryts när x blir 10:

Python · du kan ändra koden
x = 0
while True:
    x = x + 1
    print(x)
    if x == 10:
        break
print("Klart!")

Tänk på

Glömmer du att avbryta en while True-loop fortsätter den för evigt — en oändlig loop. Här på sidan stoppas ett program automatiskt om det har kört i fem sekunder utan att vänta på inmatning.

Slumptal

Med modulen random kan programmet slumpa tal. Först måste modulen importeras med import random.

  • random.randint(start, slut) ger ett slumpat heltal, där både start och slut kan komma.
  • random.random() ger ett slumpat decimaltal mellan 0 och 1.
Python · du kan ändra koden
import random

tärning = random.randint(1, 6)
print(f"Du slog {tärning}")
print(random.random())

Kör flera gånger — du får olika resultat varje gång.

Uppgifter med loopar

Uppgift · Gissa talet

Skriv ett program där datorn slumpar ett tal mellan 1 och 10 som användaren ska gissa. Om gissningen är fel ska programmet säga det och låta användaren försöka igen. Använd en while-loop.

Din lösning · du kan ändra koden
# Skriv din kod här
Visa lösningsförslag
Python · du kan ändra koden
import random

hemligt = random.randint(1, 10)

while True:
    gissning = int(input("Gissa ett tal mellan 1 och 10: "))
    if gissning == hemligt:
        print("Rätt gissat!")
        break
    print("Fel, försök igen.")

Vill du göra det lite lättare kan programmet tala om ifall gissningen är för hög eller för låg, och räkna antalet försök.

Uppgift · Biobiljetter i en loop

Bygg vidare på biobiljetten från förra kapitlet. Lägg programmet i en while-loop så att man kan köpa biljetter till flera personer. När användaren skriver klar i stället för en ålder ska programmet skriva ut totalpriset och avslutas.

Din lösning · du kan ändra koden
# Skriv din kod här
Visa lösningsförslag
Python · du kan ändra koden
total = 0

while True:
    svar = input("Ålder (eller klar): ")
    if svar == "klar":
        break
    ålder = int(svar)
    if ålder < 12:
        pris = 60
    elif ålder < 18:
        pris = 80
    else:
        pris = 120
    print(f"Den biljetten kostar {pris} kr.")
    total = total + pris

print(f"Totalt att betala: {total} kr")

Uppgift · Multiplikationstabell

Gör ett program som hjälper användaren att träna multiplikationstabellen. Fråga vilken tabell som ska övas på, skriv ut tabellen (till exempel 1 · 7 till 10 · 7) och fråga sedan efter en ny tabell.

Svårare: Låt programmet ge övningstal som användaren ska svara på, och håll koll på hur många rätt och fel det blir.

Din lösning · du kan ändra koden
# Skriv din kod här
Visa lösningsförslag
Python · du kan ändra koden
while True:
    svar = input("Vilken tabell vill du öva på? (tryck bara Enter för att sluta) ")
    if svar == "":
        break
    tabell = int(svar)
    for i in range(1, 11):
        print(f"{i} · {tabell} = {i * tabell}")

Den svårare varianten:

Python · du kan ändra koden
import random

rätt = 0
fel = 0
tabell = int(input("Vilken tabell vill du öva på? "))

for omgång in range(5):
    faktor = random.randint(1, 10)
    svar = int(input(f"Vad är {faktor} · {tabell}? "))
    if svar == faktor * tabell:
        print("Rätt!")
        rätt = rätt + 1
    else:
        print(f"Fel, det är {faktor * tabell}.")
        fel = fel + 1

print(f"Du fick {rätt} rätt och {fel} fel.")

Listor

En lista är som en låda med flera fack. I varje fack kan du spara ett värde, och alla facken är numrerade — numret kallas index.

Python · du kan ändra koden
# Skapa en lista
djur = ["hund", "katt", "fågel"]
print(djur[0])     # hund
print(djur[2])     # fågel

# Lägg till ett djur sist i listan
djur.append("kanin")
print(djur)
print(len(djur))   # 4 – antalet element

Kom ihåg

Index börjar på 0, inte 1. Det första elementet är alltså djur[0].

En for-loop kan gå igenom alla element i en lista:

Python · du kan ändra koden
djur = ["hund", "katt", "fågel", "kanin"]
for d in djur:
    print(f"Ett djur: {d}")

Här är en ”låda” där man kan stoppa ner vad som helst. Allt man skriver sparas i en lista. Skriver man P skrivs innehållet ut, och skriver man Q avslutas programmet.

En låda · du kan ändra koden
låda = []

while True:
    sak = input("Vad vill du lägga i lådan? (P = visa, Q = avsluta) ")
    if sak == "Q":
        break
    elif sak == "P":
        print("I lådan finns:", låda)
    else:
        låda.append(sak)

print("Hej då!")

Uppgift · Summering

Gör ett liknande program där man skriver in tal — så många man vill. Sedan ska man kunna skriva:

  • S för att summera alla tal,
  • P för att skriva ut alla tal,
  • Q för att avsluta.

Använd en while-loop som i lådan. Tänk på att det man skriver måste omvandlas till tal.

Extra: Se till att man kan skriva decimaltal med både punkt och komma, till exempel 2.5 och 2,5.

Din lösning · du kan ändra koden
# Skriv din kod här
Visa lösningsförslag
Python · du kan ändra koden
tal = []

while True:
    svar = input("Skriv ett tal (S = summera, P = visa, Q = avsluta): ")
    if svar == "Q":
        break
    elif svar == "S":
        print(f"Summan är {sum(tal)}")
    elif svar == "P":
        print("Talen:", tal)
    else:
        tal.append(float(svar.replace(",", ".")))

svar.replace(",", ".") byter kommatecken mot punkt, så att float() förstår både 2.5 och 2,5. Skriver man något som inte är ett tal kraschar programmet — det löser vi i nästa kapitel.

Snabbkoll

Har du förstått?

1.Vilka värden ger range(0, 5)?

2.Vad är djur[1] om djur = ["hund", "katt", "fågel"]?

3.Vad gör break?

4.Vilket kommando lägger till ett element sist i en lista?

5.Vilka tal kan random.randint(1, 5) ge?