qr code

Loopar med Python

Loopar med Python

Att upprepa kod kallas för att iterera. En upprepning kallas för en iteration eller en loop.

Du finns olika strukturer för iteration i Python, while-satser och for-satser .

while-satser

Med en while-sats upprepar du ett block med kod så länge något villkor är sant.

while <villkor>:
	#indenterad kod som upprepas

I den kod som upprepas måste villkoret ändras så att det förr eller senare inte längre är sant, annars får du en oändlig loop.

Exempel 1

Koden skriver ut alla multipler av 15 som är mindre än 100.

a = 0
while a < 100:
    print(a)
    a = a + 15

Prova att kommentera bort sista raden så att du får en oändlig loop. Kör programmet och klicka på stop för att avsluta körningen.

Ändra i koden så att alla multipler av 3 som är mindre än 50 skrivs ut.

for-satser

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

  • range(stopp), talföljden består av alla heltal ≥ 0 och < stopp
  • range(start, stopp), talföljden består av alla heltal ≥ start och < stopp
  • range(start, stopp, steg), talföljden börjar med talet start och ökas sedan med steg så länge resultatet är < stopp

För att skriva en for-sats anger du någon variabel och följande konstruktion

for <variabel> in <talföljd>:
	#indenterad kod som upprepas

där talföljden skapas av funktionen range().

Exempel 2

Testa koden:

for i in range(10):
	print(i)

Ändra talföljden till den som skapas av range(4, 10).

Ändra talföljden till den som skapas av range(4, 10, 2).

Formatering för tabeller

I och med att Python huvudsakligen används för text, kan man formatera texten för att skapa tabeller. Vi visar ett exempel med en tabell över några heltal och heltalen i kvadrat.

Med koden

print(" tal   kvadrat")
print("--------------")
for tal in range(-2, 3):
  print(f"{tal}      {tal*tal}")

skapas följande utskrift

 tal   kvadrat
--------------
-2      4
-1      1
0      0
1      1
2      4

I utskriften hamnar talen i den andra kolumnen inte rakt under varandra. Hade vi istället använt range(-10, 11) hade placeringen av talen i den andra kolumnen blivit ännu fulare.

Vi kan formatera utskriften av variabler så att de högercentreras efter någon position. Vi anger positionen efter ett kolon, efter variabelnamnet innanför måsvingarna.

Med koden

print(" tal  kvadrat")
print("-------------")
for tal in range(-2, 3):
  print(f"{tal:3} {tal*tal:7}")

skapas följande utskrift

 tal  kvadrat
-------------
 -2       4
 -1       1
  0       0
  1       1
  2       4

Nu är alla tal är högercentrerade efter någon position.

Om vi vill formatera tal efter någon position och visa två decimaler, kan vi lägga till .2f efter positionen.

Med denna kod

print("  tal  kvadrat")
print("--------------")
for tal in range(-2, 3):
  print(f"{tal:6.2f} {tal*tal:7.2f}")

blir utskriften

  tal  kvadrat
--------------
 -2.00    4.00
 -1.00    1.00
  0.00    0.00
  1.00    1.00
  2.00    4.00

Den sortens enkla tabeller som kan skapas med Python på grundskolenivå, kan med fördel istället skapas med kalkylblad, eller både med kalkylblad och med Python-programmering.

Summera tal

Om du vill summera talen \(0, 1, 2, 3, 4, 5\) kan du börja med att göra en variabel summa som har värdet \(0\). Sedan kan du addera till ett tal i taget genom att iterera.

Med en while-sats fungerar följande kod:

summa = 0;
tal = 0;
while tal < 6:
  summa = summa + tal;
  tal = tal + 1;
print(summa)

Med en for-sats fungerar följande kod:

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

I och med att det är så vanligt att man lägger till ett värde till en variabels värde, finns det en speciell tilldelningsoperator som gör just detta. Det finns tilldelningsoperatorer för alla räknesätt.

Tilldelningsoperatorer i Python
operator kodexempel motsvarighet
+= a += 1 a = a + 1
-= a -= 1 a = a - 1
*= a *= 2 a = a * 2
/= a /= 2 a = a / 2
%= a %= 2 a = a % 2
//= a //= 2 a = a // 1

Om vi vill räkna upp summan kan vi alltså skriva:

summa += tal

Programmeringsuppgifter

Uppgift 1

Öva på for-satser

Gör en for-sats som, med ett tal per rad, skriver ut:

  1. Alla heltal fr.o.m \(0\) t.o.m. \(10\).
  2. Alla heltal fr.o.m \(25\) t.o.m. \(32\).
  3. Talen \(-7, -5, -3, -1, 1, 3 \).

Uppgift 2

Öva på while-satser

Gör en while-sats som, med ett tal per rad, skriver ut:

  1. Alla heltal fr.o.m \(0\) t.o.m. \(10\).
  2. Alla heltal fr.o.m \(25\) t.o.m. \(32\).
  3. Kvadrattalen \(0, 1, 4, 9, 16, 25 \).

Uppgift 3

Rätvinklig asterisk-triangel

Med kommandot print("*"*5) kan man skriva ut fem asterisker.

Gör ett program som låter användaren mata in antal asterisker. Skriv sedan ut en rätvinklig triangel av asterisker.

En körning kan se ut så här:

Antal asterisker: 4
*
**
***
****

Uppgift 4

Likbent asterisk-triangel

Gör ett program som låter användaren mata in ett udda antal asterisker. Skriv sedan ut en likbent triangel av asterisker. På varje rad ska det vara ett udda antal asterisker.

En körning kan se ut så här:

Antal asterisker: 7
    *
   ***
  *****
 *******

Gör en heltalsvariabel för antalet blanka tecken som ska skrivas ut per rad innan asteriskerna skrivs ut. Vilket värde ska denna variabel ha per rad?

Uppgift 5

Siffrorna i talet

Gör ett program som låter användaren skriva in ett positivt heltal. Programmet ska sedan skriva ut siffrorna i talet med en siffra per rad i omvänd ordning.

En körning kan se ut så här:

Skriv in ett positivt heltal: 567
7
6
5

Uppgift 6

Siffrorna i det binära talet

Det finns en inbyggd funktion bin(<tal>) som omvandlar ett tal till binär form och returnerar en textsträng med den binära representationen av talet, textsträngen lägger till prefixet 0b. I och med att funktionen returnerar en textsträng, kan du alltså inte använda resultatet till beräkningar, bara till att skriva ut och se hur den binära representationen ser ut.

  1. Gör ett program som låter användaren skriva in ett positivt heltal. Visa sedan talet på binär form.
  2. Lägg till en while-sats som skriver ut en binär siffra i taget i omvänd ordning. (Använd resten vid heltalsdivision med två.)

En körning kan se ut så här:

Skriv in ett positivt heltal: 28
På binär form är talet = 0b11100
0
0
1
1
1

Uppgift 7

Aritmetisk talföljd

I en aritmetisk talföljd är skillnaden mellan ett tal och föregående tal konstant.

  1. Gör ett program som skriver ut de \(n\) första talen i den aritmetiska talföljden

    \[5, 8, 11, 14, \ldots\]

    Det går bra att skriva ett tal per rad.

    Låt användaren skriva in hur stort \(n\) ska vara, skriv sedan ut talen. Testa koden med små positiva heltal \(n\).

  2. Lägg till kod som också beräknar summan av talen i talföljden. Skriv ut både talföljd och summa.

Uppgift 8

Geometrisk talföljd

I en geometrisk talföljd är kvoten mellan ett tal och föregående tal konstant.

  1. Gör ett program som skriver ut de \(n\) första talen (som decimaltal) i den geometriska talföljden

    \[1, \frac{1}{2}, \frac{1}{4}, \frac{1}{8}, \ldots\]

    Låt användaren skriva in hur stort \(n\) ska vara, skriv sedan ut talen. Testa koden med små positiva heltal \(n\).

  2. Ändra koden så att summan av talen i talföljden beräknas. Sedan ska summan av talen skrivas ut istället för talföljden. Testa koden med olika positiva heltal \(n\). Vilket är det minsta \(n\) som ger summan 2.0?

geometrisk summa

Uppgift 9

Tabell av kvadrater

Gör ett program som låter användaren mata in ett positivt heltal \(n\). Skriv ut en tabell för alla heltal fr.o.m. noll t.o.m. \(n\) som visar talet samt talets kvadrat. En körning av programmet kan exempelvis se ut så här:

Det största talet: 4
----------------
  tal    kvadrat
----------------
    0      0
    1      1
    2      4
    3      9
    4     16

Uppgift 10

Beräkna medelvärde

Gör ett program som beräknar medelvärdet av \(n\) stycken tal som användaren matar in. Börja med att fråga användaren hur många tal som ska användas. En körning av programmet kan exempelvis se ut så här:

Skriv in antalet tal: 5
Skriv in tal 1: 0
Skriv in tal 2: 3
Skriv in tal 3: 4.5
Skriv in tal 4: 4.5
Skriv in tal 5: 7
Medelvärdet av talen är 3.8.

Uppgift 11

Lån med ränta

Gör ett program som låter användaren mata in hur mycket pengar som ska lånas och vilken räntesats per år lånet ska växa med. Visa sedan hur mycket lånet växer under en tioårsperiod med en tabell. Visa lånet med två decimaler

En körning kan exempelvis se ut så här:

Skriv in lånet: 5000
Skriv in årlig ränta i procent: 5
----------------
 år     lån
----------------
  0    5000.00 
  1    5250.00 
  2    5512.50 
  3    5788.12 
  4    6077.53 
  5    6381.41 
  6    6700.48 
  7    7035.50 
  8    7387.28 
  9    7756.64 

Uppgift 12

Annuitetslån

Gör ett program som låter användaren mata in

  • hur mycket pengar som ska lånas,
  • vilken räntesats per år lånet ska växa med,
  • hur mycket som ska betalas av per år i kronor.

Vi beräkning av det årliga lånet kan du använda den inbyggda funktionen max() vilken tar emot ett antal argument och returnerar det maximala argumentet. Genom att beräkna maximum av lånet och talet noll, kommer lånet aldrig att bli negativt.

En körning kan exempelvis se ut så här:

Skriv in lånet: 5000
Skriv in årlig ränta i procent: 5
Skriv in årlig avbetalning i kr: 900
----------------
 år     lån
----------------
  0    5000.00 
  1    4350.00 
  2    3667.50 
  3    2950.88 
  4    2198.42 
  5    1408.34 
  6     578.76 
  7       0.00 
  8       0.00 
  9       0.00 

Uppgift 13

Primtal?

Gör ett program som låter användaren mata in ett positivt heltal. Ta reda på om talet är ett primtal eller inte och skriv ut resultatet.

Ett enkelt tillvägagångssätt är att kontrollera om talet är delbart med något av talen \(2\) upp till talet själv. I sådana fall är talet inte ett primtal. I själva verket räcker det att kontrollera om talet är delbart med något av talen \(2\) upp till roten av talet. Om talet \(37\) inte är delbart med något heltal som är mindre än \(\sqrt{37} \) kan det inte heller vara delbar med något heltal större än \(\sqrt{37}\).

I algoritmen kan du exempelvis göra en boolsk variabel är_primtal som är sann från början. Om du hittar någon delare låter du är_primtal bli falsk.

Uppgift 14

Project Euler

På sidan Project Euler kan du öva problemlösning med problem som kräver en kombination av matematiskt och datalogiskt tänkande.

Du kan om du vill, göra ett konto och lösa problemen en efter en. Efter varje problem matar du in ett svar på den fråga som ställs. För att kunna besvara frågan måste du använda det program du skrivit. När du klarat ett problem kan du delta i (eller beskåda) en diskussion om problemet på ett forum.

Du kan också bara ge dig i kast med problemen utan att göra ett konto.

Lös Project Euler: Problem 1.