Teknik 1 · Programmering · Kapitel 4
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:
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.
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.
# Skriv din kod här
Visa lösningsförslagDölj lösningsförslag
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.
x = 1
while x < 10:
print(x)
x = x * 2Ofta 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:
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.
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.
# Skriv din kod här
Visa lösningsförslagDölj lösningsförslag
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.
# Skriv din kod här
Visa lösningsförslagDölj lösningsförslag
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.
# Skriv din kod här
Visa lösningsförslagDölj lösningsförslag
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:
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.
# 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 elementKom 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:
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.
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:
Sför att summera alla tal,Pför att skriva ut alla tal,Qfö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.
# Skriv din kod här
Visa lösningsförslagDölj lösningsförslag
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?