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 .
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.
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.
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()
.
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)
.
I och med att Python ofta 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.
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.
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
Öva på for-satser
Gör en for-sats som, med ett tal per rad, skriver ut:
Öva på while-satser
Gör en while-sats som, med ett tal per rad, skriver ut:
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 * ** *** ****
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?
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
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.
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
Aritmetisk talföljd
I en aritmetisk talföljd är skillnaden mellan ett tal och föregående tal konstant.
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\).
Lägg till kod som också beräknar summan av talen i talföljden. Skriv ut både talföljd och summa.
Geometrisk talföljd
I en geometrisk talföljd är kvoten mellan ett tal och föregående tal konstant.
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\).
Ä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
?
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\), en tabell 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
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.
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
Annuitetslån
Gör ett program som låter användaren mata in
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
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.
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.