Loopar

{{ 'ml-heading-theory' | message }}

En stor fördel med datorer är att de snabbt kan göra liknande beräkningar tusentals eller miljontals gånger. För att programmera sådana upprepningar använder man loopar med formuleringar som

"För alla dessa värden, gör så här: ..."
eller
"Fortsätt att göra ... tills ...".

Dessa två typer av loopar beskrivs med for- respektive while-satser, och på denna sida kommer du att lära dig hur man konstruerar sådana loopar.

varde = 0
maxvarde = 100
while varde < maxvarde:
	print(varde)
	varde = varde + 5
Vad tror du att koden gör? Vad kommer att skrivas ut? Vad händer om du byter plats på rad 4 och 5?
Teori

for-sats

Om man har instruktioner som ska upprepas ett känt antal gånger, t.ex. för varje element i en lista med given längd, kan man använda en for-sats. Dessa skrivs med kommandot for följt av ett variabelnamn, kommandot in och till sist en lista eller uppräkning, avslutat med ett kolon.

for element in ['hej', 'på', 'dig']:
	print(element)

  • Visa resultat

>
hej
på
dig

Första raden i det här programmet kan tolkas som "För varje element i listan ['hej', 'på', 'dig']". Det innebär att variabeln element sätts till det första värdet i listan och sedan ändras för varje ny upprepning i loopen. Dessa upprepningar kallas iterationer, och i den första kommer alltså element att vara lika med 'hej' för sedan bytas till 'på' i andra iterationen och 'dig' i tredje.
Teori

range()

range() är en funktion som skapar en uppräkning av heltal. Skriver man t.ex. range(5) får man en uppräkning från 00 till 4.4. Argumentet man anger ingår alltså inte i uppräkningen. Dessa uppräkningar är av datatypen iterator och används ofta tillsammans med loopar.

for x in range(8):
	print(x)

  • Visa resultat

>
0
1
2
3
4
5
6
7

Om man skriver två argument i funktionen kommer uppräkningen att ske från det första argumentet till, men inte med, det andra.

for x in range(3,8):
	print(x)

  • Visa resultat

>
3
4
5
6
7

Lägger man till ytterligare ett argument kommer det att användas som steglängden i uppräkningen.

for x in range(3,8,2):
	print(x)

  • Visa resultat

>
3
5
7

Uppgift

Skriv ett program som använder en for-sats för att skriva ut "Party!" tio gånger.

Lösning

Vi börjar med att skriva en for-sats som går igenom heltalen från 00 till och med 99 för en variabel x. Det ger att instruktionerna inne i loopen upprepas 1010 gånger.

for x in range(10):

Vi behöver egentligen inte värdet som finns i variabeln x, bara att instruktionerna i loopen upprepas 1010 gånger. För att skapa en for-sats måste man dock skriva något mellan for och in, så vi skriver in ett variabelnamn som sedan aldrig används. Inne i loopen använder vi print() för att skriva ut vårt meddelande.

for x in range(10): print('Party!')

  • Visa resultat

>
Party!
Party!
Party!
Party!
Party!
Party!
Party!
Party!
Party!
Party!

Visa lösning Visa lösning
Teori

while-sats

while-satser används för kodstycken som ska upprepas så länge ett visst villkor är uppfyllt. Det är användbart för loopar där man inte vet hur många upprepningar som krävs. För att skriva en sådan sats börjar man med ordet while, alltså "medan", följt av ett villkor och ett kolon. Den kod som ska upprepas skrivs med ett indrag.

tal = 1
while tal < 20:
	print('Talet är', tal)
	tal = tal*2 + 1

  • Visa resultat

>
Talet är 1
Talet är 3
Talet är 7
Talet är 15

I while-satser måste man akta sig för oändliga loopar. I programmet nedan ändras aldrig värdet på x,x, och då är villkoret alltid sant. Programmet kommer då aldrig ur loopen och måste avbrytas manuellt. De flesta programmeringsmiljöer har en stoppknapp för detta.

x = 1
while x < 5:
	print(x**2)
Uppgift

Skriv en while-sats som summerar de positiva heltalen, 1,2,3...1, 2, 3... , tills summan är minst 100100 och sedan skriver ut hur många tal som behövdes.

Lösning

Först måste vi bestämma villkoret. Vi ska addera termer tills summan är 100100 eller mer, och alltså har vi en process som pågår medan summan är mindre än 100.100. Villkorsraden kan därför skrivas så här.

while summa < 100:

Men programmet kan inte börja så, för jämförelsen kan inte göras innan variabeln summa fått ett värde. Vi måste därför först skapa variabeln summa, och från början är den 0.0. Eftersom 00 är mindre än 100100 är villkoret sant från början och då kan programmet starta loopen.

summa = 0
while summa < 100:

Sedan måste vi få loopen att räkna upp heltalen. Vi skapar variabeln tal som börjar på 00 utanför loopen, för att sedan öka med 11 för varje iteration.

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

Nu har vi en loop som räknar upp heltal. Varje iteration ska nu avslutas med att talet läggs till summan. Till slut blir då summan så stor att villkoret blir falskt och loopen avslutas.

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

När programmet har kommit ut ur loopen finns det senaste talet kvar i variabeln tal. Detta värde är också antalet tal som har adderats, vilket är vad vi är ute efter. Vi behöver alltså bara skriva ut det.

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

  • Visa resultat

>
14

Visa lösning Visa lösning
Teori

break

break används i en for- eller while-sats för att avbryta den. Det är t.ex. användbart när man söker igenom en lista efter en viss sorts element. I exemplet nedan avbryts sökningen med break när ett tal mellan 6161 och 6767 har hittats.

lista = [44, 50, 55, 1, 62, 70, 94, 66, 56, 6]
for tal in lista:
	if 61 < tal < 67:
		print(tal)
		break

  • Visa resultat

>
62

Notera att det finns ytterligare ett tal i listan som ligger i intervallet, men programmet hittar inte detta just eftersom loopen avbryts efter att det första hittats.

Uppgifter

{{ 'mldesktop-placeholder-grade-tab' | message }}
{{ 'mldesktop-placeholder-grade' | message }} {{ article.displayTitle }}!
{{ grade.displayTitle }}
{{ exercise.headTitle }}
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan
Test
{{ 'mldesktop-selftest-notests' | message }} {{ article.displayTitle }}!
{{ tests.error }}

{{ 'ml-heading-exercise' | message }} {{ focusmode.exercise.exerciseName }}

keyboard_backspace
{{ section.title }} keyboard_backspace {{ 'ml-btn-previous' | message }} {{ 'ml-btn-previous-exercise' | message }} {{ 'ml-btn-next-exercise' | message }} keyboard_backspace {{ 'ml-btn-next-exercise' | message }}