Villkor

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

Ofta behöver instruktioner delas upp i olika fall beroende på ett villkor: "Om figuren är en cirkel, använd areaformeln πr2\pi r^2, men om figuren är en triangel, använd bh2.\frac{bh}{2}." På den här sidan får du lära dig skriva kod som tolkar villkor och gör olika saker beroende på utfallet.

x = 20

if x > 20:
	print('Hej!')
elif x >= 0:
	print('Hejsan!')
else:
	print('Hallå!')
Vad tror du kommer att hända när du kör programmet? Vad tror du kommandona if, elif och else gör? Vad händer om du byter elif mot if på rad 5?5? Kan du ändra på värdet i x så att programmet skriver ut Hallå!?
Teori

Jämförelseoperatorer

Jämförelseoperatorer används för att jämföra två saker med varandra. De används t.ex. för att avgöra om en variabel har ett specifikt värde, om ett tal är litet nog eller om en lista är tillräckligt lång. Resultatet av en jämförelse är av datatypen bool, alltså antingen

True eller False.

Om jämförelsen är sann får man resultatet True och om den är falsk får man False.

  • ==
    Utläses "är lika med" och returnerar True om objekten är lika, t.ex. 3 == 6/2.
  • !=
    Utläses "är inte lika med" och returnerar True om objekten inte är lika, t.ex. 3 != 4. Symbolen != kan jämföras med tecknet \neq inom matematiken.
  • >
    Olikheten "är större än" returnerar True om det första talet är större än det andra, t.ex. 4 > 3.
  • <
    Olikheten "är mindre än" returnerar True om det första talet är mindre än det andra, t.ex. 5 < 10.
  • >=, <=
    Som > respektive <, men returnerar True även om talen är lika. >= och <= kan jämföras med tecknen \geq respektive \leq i matematiken.

Det går även att skriva dubbla olikheter för att undersöka om ett värde ligger inom ett intervall, t.ex.

0 < 5 <= 28
Exemplen ovan använder bara tal, eftersom det är den vanligaste datatypen för sådana här jämförelser. Faktum är att samtliga operatorer går att använda till jämförelser av såväl strängar som listor, men det är sällan användbart. Det är dock bra att känna till att t.ex. == fungerar även för andra datatyper.
Uppgift

Följande program gör ett antal jämförelser och skriver ut resultatet.

x = 5
print(x == 7)
print(x != 7)
print(-10 < x < 10)

Utan att köra programmet, avgör vad som kommer att skrivas ut.

Lösning

Vi går igenom rad för rad och undersöker vad som händer.

x = 5

Först skapas en variabel x där värdet 55 sparas. Notera att det är ett enkelt likhetstecken, så det är en tilldelning som görs, inte någon jämförelse.

print(x == 7)

De dubbla likhetstecknen betyder att vi gör en jämförelse mellan x och 7, och om de är lika med varandra är jämförelsen sann. I det här fallet finns värdet 55 lagrat i x, så jämförelsen blir 5 == 7, vilket är falskt. Resultatet blir då värdet False, som också är vad som skrivs ut.

print(x != 7)

Nu undersöker vi istället om x inte är lika med 7.7. Det är sant att 55 och 77 är olika tal, så True kommer att skrivas ut.

print(-10 < x < 10)

Den sista jämförelsen undersöker om värdet i x ligger mellan -10\text{-}10 och 10.10. Det gör det, så i det här fallet jämförelsen är sann, vilket ger resultatet True. Om vi kör programmet ser vi att detta stämmer.

x = 5
print(x == 7)
print(x != 7)
print(-10 < x < 10)
>
False
True
True
Visa lösning Visa lösning
Teori

if-sats

if-satser används för kodstycken som endast ska köras om ett visst villkor är uppfyllt. För att skriva en sådan sats börjar man med ordet if, alltså "om", följt av ett villkor och sedan ett kolon. För att markera den kod som bara ska köras om villkoret är uppfyllt använder man indrag.

x = 5
if x == 5:
	print('Talet är fem!')

  • Visa resultat

>
Talet är fem!

Det här exemplet kommer bara att skriva ut Talet är fem! om villkoret x == 5 faktiskt är sant, alltså om x har tilldelats värdet 55 på rad 1.1. Om villkoret är falskt hoppar programmet över de indragna raderna och fortsätter under dem.

Teori

else

Man vill ofta att programmet gör olika saker beroende på om ett villkor är sant eller falskt. Då använder man en else-sats nedanför if-satsen genom att skriva ordet else, alltså "annars", följt av ett kolon. All efterföljande indragen kod kommer då bara att köras om villkoret i if-satsen är falskt.

x = 6
if x == 5:
	print('Talet är fem!')
else:
	print('Talet är inte fem!')

  • Visa resultat

>
Talet är inte fem!

Man kan se det som att en if-sats följd av en else-sats skapar en struktur på formen "Om villkoret är sant, gör si. Annars, gör så."

Teori

elif

Det händer ofta att man vill göra mer komplicerade förgreningar i sitt program. Då är det bekvämt att använda elif-satser, som används efter en if-sats eller en annan elif-sats.

x = 10
if x == 5:
	print('Talet är fem!')
elif x == 10:
	print('Talet är tio!')
else:
	print('Talet är varken fem eller tio!')

  • Visa resultat

>
Talet är tio!

Man kan se elif som en kombination av else och if, där villkoret bara undersöks om de ovanstående villkoren är falska.
Uppgift

Vad kommer att hända om man kör följande program?

x = 10
if x > 0: if x > 100: print('Ett stort tal!') else: print('Ett ganska stort tal!')
else: if x < -100: print('Ett litet tal!') else: print('Ett ganska litet tal!')

Vad händer om man ändrar första raden till x = -123?

Lösning

Vi stegar oss igenom programmet och undersöker vilken väg som tas vid villkoren, först för x = 10 och sedan för x = -123.

Exempel

x = 10

På rad 22 börjar vi med att undersöka villkoret x > 0, alltså om 1010 är större än 0,0, vilket det är. Det betyder att vi går in i if-satsen och kommer direkt till ett nytt villkor: x > 100. Det är inte sant, så vi hoppar över den indragna raden och går till else-satsen på rad 5.5. Där får vi följande utskrift.

>
Ett ganska stort tal!

Eftersom if-satsen på rad 22 var sann kommer vi inte att gå in i else-satsen på rad 77 och hoppar därför över alla rader som kommer efter.

Exempel

x = -123

Om det istället står x = -123 på första raden kommer villkoret på rad 22 vara falskt eftersom -123\text{-} 123 är mindre än 0.0. Då hoppar vi över raderna 33 - 66 och går istället in i else-satsen på rad 7.7. Där stöter vi på villkoret x < -100. Det är sant, så vi går in i den satsen och och får följande utskrift.

>
Ett litet tal!

Den efterföljande else-satsen kommer inte att köras eftersom if-satsen på rad 88 var sann.

Visa lösning Visa lösning
Teori

Logiska operatorer

Logiska operatorer används för att slå ihop eller ändra villkor. Ett vanligt fall är att man har två villkor som ska gälla samtidigt, t.ex. att två variabler ska vara positiva. Då används operatorn and, dvs. "och", mellan villkoren.

x = 7
y = 18
if x>0 and y>0:
	print('Punkten ligger i första kvadranten!')

  • Visa resultat

>
Punkten ligger i första kvadranten!

Ibland har man två villkor där minst ett ska gälla. Då används operatorn or, dvs. "eller", mellan de två villkoren.

x = 5
y = -2
if x<0 or y<0:
	print('Punkten ligger INTE i första kvadranten!')

  • Visa resultat

>
Punkten ligger INTE i första kvadranten!

Man kan också vända ett villkor till dess motsats med operatorn not, dvs. "inte". Om ett tal inte är större än noll så måste det vara noll eller mindre. Exemplet nedan blir därför samma sak som att använda villkoret x <= 0.

x = -3
if not x>0:
	print('Talet är INTE större än noll!')

  • Visa resultat

>
Talet är INTE större än noll!

Uppgift

Programmet nedan utför beräkningen x2+9x^2+9 om talet xx är 33 eller 4.4.

x = 4 if x == 3: print(x**2 + 9)
elif x == 4: print(x**2 + 9)

  • Visa resultat

>
25

Visa hur man kan använda logiska operatorer för att förenkla programmet så att beräkningen bara behöver skrivas en gång i koden.

Lösning

Eftersom beräkningen endast utförs om x är 33 eller 44 behöver bara ett av villkoren x == 3 och x == 4 vara sant. Det är ett perfekt tillfälle att använda or-operatorn.

x = 4 if x==3 or x==4: print(x**2 + 9)

  • Visa resultat

>
25

Istället för att skriva beräkningen på två ställen i koden har vi alltså angett två olika sätt att "hitta till" beräkningen. Det är en bra princip att försöka undvika upprepad kod. På det sättet blir programmet mer överskådligt, och om beräkningen ska ändras behöver man bara göra det på ett ställe.

Visa lösning Visa lösning

Uppgifter

Nivå 1
1.1
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Skriv följande villkor som kod.

a

xx är inte -13.\text{-}13.

b

nn är mindre än eller lika med 10.10.

c

yy är antingen -1\text{-}1 eller 2.2.

d

aa är större än 33 och bb är 4.4.

1.2
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

För vilka värden på x är följande villkor sanna?

a

6 < x <= 10

b

not x != 19

c

x != 3 or x != -3

1.3
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Skriv ett program som beräknar absolutbeloppet av ett tal x utan att använda den inbyggda funktionen abs().

1.4
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Skriv ett program som givet en variabel xx beräknar funktionsvärdet för f(x)=1x+1x2. f(x) = \dfrac{1}{x} + \dfrac{1}{x - 2}. Se till att ditt program ger ett lämpligt svar för alla xx-värden.

1.5
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Gör ett program som tar en triangels sidlängder och använder dem för att skriva ut om triangeln är rätvinklig eller inte. T.ex. motsvarar sidlängderna 3,3, 44 och 55 en rätvinklig triangel. Programmet behöver inte själv avgöra vilken sida som är längst.

1.6
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Utan att köra koden, avgör vad programmen kommer att skriva ut och förklara varför.

a
x = 7
if x == 9:
	print('Ja!')
else:
	print('Nej!')
b
x = 7
jamforelse = (x < 9)
if jamforelse:
	print('Ja!')
else:
	print('Nej!')
c
x = 7
variabel = False
if variabel:
	print('Ja!')
else:
	print('Nej!')
1.7
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Skriv ett program som avgör och skriver ut om ett tal är delbart med 7.7. Testa det på talen 6046360\,463 och 55307.55\,307.

1.8
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Flyttal är inte exakta. Det stämmer förstås att 0.1+0.20.1 + 0.2 är exakt 0.3,0.3, men i exemplet nedan verkar beräkningen ge något annat i Python.

summa = 0.1 + 0.2
if summa == 0.3:
	print('Lika!')
else:
	print('Inte lika!')

  • Visa resultat

>
Inte lika!

Pythons summa blir alltså inte exakt 0.3, men med en print-rad kan man se att den är väldigt nära. Ändra villkoret så att talen ändå behandlas som lika.

Nivå 2
2.1
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan
a
Skriv ett program som löser andragradsekvationer på formen

ax2+bx+c=0. ax^2 + bx + c = 0. Låt invärdet vara en lista med koefficienter, koeff = [a, b, c].

b
Använd programmet för att lösa följande ekvationer.

4x2+4x+1=0,x2+x+1=0 4x^2 + 4x + 1 = 0, \quad x^2 + x + 1 = 0 och-25x2+90x+648=0 \text{och} \quad \text{-}25x^2 + 90x + 648 = 0

2.2
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Jonna hittar kod på nätet där kommandot in används i ett villkor. Hon misstänker att det används för att se om ett värde ingår i en lista.

if x in [23, 24, 50, 52]:

Själv programmerar Jonna en kalender. Programmet använder variabeln manad som innehåller ett månadsnamn som 'mars'. Hon behöver nu skriva kod som tilldelar variabeln dagar ett värde motsvarande antalet dagar i månaden manad. Om detta görs rätt ska alltså kodraden nedan kunna köras, och visa rätt oavsett vilken månad som ligger i manad.

print('Månaden {} har {} dagar.'.format(manad, dagar))

Använd in för att hjälpa Jonna göra tilldelningen!

2.3
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Gun-Britt har fått i uppdrag att skriva ett program som tar ett tal som invärde och ökar det med 11 om det är mindre än 55 och minskar det med 11 om det är större än eller lika med 5.5. Hon har kommit fram till följande program.

tal = 8
if tal < 5:
	tal += 1
if tal >= 5:
	tal -= 1
print(tal)

Gun-Britts vän Josef påstår att det finns ett fel i programmet. Hitta felet och skriv om programmet så att det fungerar som det ska.

2.4
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Skriv om följande kod så att den använder elif-satser istället för att ha villkorssatser inne i andra villkorssatser.

alder = 19
if alder < 20:
	if alder < 13:
		print('Barn')
	else:
		print('Tonåring')
else:
	if alder >= 65:
		print('Pensionär')
	else:
		print('Vuxen')
Nivå 3
3.1
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Fredrik skriver ett program som tar reda på om en punkt (x,y)(x, y) ligger i något av de blå områdena.

Han har skrivit koden nedan. Den undersöker de blå områdena separat och ser om den aktuella punkten ligger där.

x = 12
y = -8

if x > 0:
	if y < 0:
		if y > -x:
			print('Punkten ligger i det blå området.')
if x < 0:
	if y > 0:
		if y > -x:
			print('Punkten ligger i det blå området.')

Fredrik tror att han kan korta ned koden. Visa hur han kan använda logiska operatorer för att sortera fram relevanta punkter med en enda if-rad.

3.2
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Charlie har skrivit ett program som avgör om en given punkt ligger på en ram eller inte. Ramen definieras av ett antal variabler som anger de största och minsta xx- och yy-värdena för ramens inner- och yttermått i ett koordinatsystem.

Uppgift 2671 1.svg
x = 0
y = 0

x_inre_min = 0
x_inre_max = 20
y_inre_min = -5
y_inre_max = 10
x_yttre_min = -5
x_yttre_max = 25
y_yttre_min = -10
y_yttre_max = 15

if (x >= x_yttre_min and x <= x_inre_min) and (y >= y_yttre_min and y <= y_inre_min): ##Nedre vänstra hörnet
	print("På ramen!")
elif (x >= x_yttre_min and x <= x_inre_min) and (y >= y_inre_max and y <= y_yttre_max): ##Övre vänstra hörnet
	print("På ramen!")
elif (x >= x_inre_max and x <= x_yttre_max) and (y >= y_yttre_min and y <= y_inre_min): ##Nedre högra hörnet
	print("På ramen!")
elif (x >= x_inre_max and x <= x_yttre_max) and (y >= y_inre_max and y <= y_yttre_max): ##Övre högra hörnet
	print("På ramen!")
elif (x >= x_inre_min and x <= x_inre_max) and (y >= y_yttre_min and y <= y_inre_min): ##Nedre rektangeln
	print("På ramen!")
elif (x >= x_inre_min and x <= x_inre_max) and (y >= y_inre_max and y <= y_yttre_max): ##Övre rektangeln
	print("På ramen!")
elif (x >= x_yttre_min and x <= x_inre_min) and (y >= y_inre_min and y <= y_inre_max): ##Vänstra rektangeln
	print("På ramen!")
elif (x >= x_inre_max and x <= x_yttre_max) and (y >= y_inre_min and y <= y_inre_max): ##Högra rektangeln
	print("På ramen!")
else:
	print("Inte på ramen!")

Charlies program fungerar men han tycker att det är rätt långt och krångligt, och han misstänker att det går att göra samma sak på ett mer effektivt sätt. Hjälp honom att förbättra programmet genom att skriva om if-satserna.

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 }}