Observera att detta är en arbetsversion av sidan!
Dölj style3dev.css för att bli av med annoteringarna!

Introduktion till while-satsen

En vanlig situation är att man vill upprepa några flera gånger. För detta använder man så kallade iterationssatser även kallade loopar.

Python har två olika sådana: while- och for-satserna. Här skall vi behandla den förstnämnda.

Anmärkning: Exemplen i denna lektion är avsedda att illustrera just while-satsen. Det betyder inte att det är enda eller alltid bästa sättet att lösa dessa uppgifter på.

Exempel 1

Skriv ut kvadraterna på talen 1, 2, 3, ... 10.

x = 1 while x <= 10: print(x*x) x = x + 1

Exempel 2

Antag att vi vill räkna hur många gånger man måste slå en tärning för att få en sexa.
Tärningsslagen simuleras med uttrycket: random.randint(1,6) som genererar slumpvisa heltal mellan 1 och 6.

import random i = 1; while random.randint(1,6) != 6: i = i + 1 print("Antal slag: " + str(i))

Allmän form

while villkor: sats 1 sats 2 ... sats n sats som utförs när villkoret blivit False

Villkoret skall vara av logisk typ dvs bool. Se lektion om logiska uttryck.

Funktion:

  1. Beräkna värdet av villkoret.
  2. Om värdet tolkas som True så utför de indenterade satserna.
  3. Beräkna värdet av villkoret igen.
  4. Om värdet tolkas som True så utför de indenterade satserna.
  5. Beräkna värdet av villkoret igen.
  6. ...

 

Grafiskt kan man beskriva funktionen så här: Bild

De indenterade satserna kan vara av vilken typ som helst: tilldelningar, if-satser, while-satser.

Iterationen avslutas om villkoret tolkas som False. Den kan också avbrytas bl.a. av att en break- eller return-sats utförs.

I det första exemplet så ändras värdet på i inuti loopen vilket gör att villkoret blir False när i blivit större än 10.

I det andra exemplet så beror ju värdet av villkoret på det slumpmässiga resultatet av random(1, 6) vilket förr eller senare kommer göra uttrycket False (när tärningsslaget blir lika med 6).

Det andra exemplet hade också kunnat skrivas

i = 1 value = random.random(1, 6) while value != 6: value = random.random(1, 6) i = i + 1

Den första lösningen är lite elegantare - man slipper ju upprepa koden för att slå tärningen.

Ytterligare ett sätt att skriva koden på

i = 1 while True: v = random.randint(1,6) if v == 6: break print(f'Slag nr {i} blev {v}') i = i + 1 print(f'Efter {i} slag blev det en sexa')
Här avbryts inte iterationen av while-villkoret utan av satsen break inuti loopen. När denna sats utförs avslutas loopen och exekveringen fortsätter med den första satsen efter loopkroppen.

Övningar

  1. Skriv satserna som skriver ut kvadraterna på de jämna talen mellan 2 och 30 med ett värde per rad
  2. Samma som ovan men med 4 värden per rad dvs så här:
    4 16 36 64 100 144 196 256 324 400 484 576 676 784 900
    1. Tips 1: Sätt ett tab-tecken ("\t") mellan talen på samma rad.
    2. Tips 2: Satsen print(v, end='') skriver värdet på v utan att byta rad efter.
  3. Skriv satserna som skriver ut alla tal mellan 1 och 100 som är jämnt delbara med 7
  4. Skriv de satser som räknar hur många 6-or man får vi 100 kast med tärning.
  5. Skriv de satser som räknar (med en while-loop) hur många helår det krävs för att få ett kapital fördubblat med räntan 3 procent.

Valid CSS!