Logga in
| 9 sidor teori |
| 14 Uppgifter - Nivå 1 - 3 |
| Varje lektion är menad motsvara 1-2 lektioner i klassrummet. |
Om figuren är en cirkel, använd areaformeln πr2, men om figuren är en triangel, använd 2bh.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? Kan du ändra på värdet i x
så att programmet skriver ut Hallå!
?
I den här lektionen går vi igenom följande begrepp:
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
.
Jämförelseoperatorer | |
---|---|
==
|
Utläses är lika medoch returnerar True om objekten är lika, t.ex. 3 == 6/2
|
!=
|
Utläses är inte lika medoch returnerar True om objekten inte är lika, t.ex. 3 != 4 . Symbolen != kan jämföras med tecknet = inom matematiken.
|
>
|
Olikheten är större änreturnerar True om det första talet är större än det andra, t.ex. 4 > 3 .
|
<
|
Olikheten är mindre änreturnerar True om det första talet är mindre än det andra, t.ex. 5 < 10 .
|
>= och <=
|
Som > respektive < , men returnerar True även om talen är lika. >= och <= kan jämföras med tecknen ≥ respektive ≤ 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
==
fungerar även för andra datatyper.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)
>
False
True
True
Kom ihåg att jämförelseoperatorer alltid returnerar antingen True
eller False
.
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 5 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 5 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. Det är sant att 5 och 7 ä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 och 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
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!')
>
Talet är fem!
Talet är fem!
om villkoret x == 5
faktiskt är sant, alltså om x
har tilldelats värdet 5 på rad 1. Om villkoret är falskt hoppar programmet över de indragna raderna och fortsätter under dem.else
-sats 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!')
>
Talet är inte fem!
if
-sats följd av en else
-sats skapar en struktur på formen Om villkoret är sant, gör si. Annars, gör så.
elif
-sats 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!')
>
Talet är tio!
elif
som en kombination av else
och if
, där villkoret bara undersöks om de ovanstående villkoren är falska.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!')
x = -123
?
Utskrift när x = 10
:
>
Ett ganska stort tal!
Utskrift när x = -123
:
>
Ett litet tal!
Hur fungerar villkor?
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
.
x = 10
På rad 2 börjar vi med att undersöka villkoret x > 0
, alltså om 10 är större än 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. Där får vi följande utskrift.
>
Ett ganska stort tal!
Eftersom if
-satsen på rad 2 var sann kommer vi inte att gå in i else
-satsen på rad 7 och hoppar därför över alla rader som kommer efter.
x = -123
Om det istället står x = -123
på första raden kommer villkoret på rad 2 vara falskt eftersom −123 är mindre än 0. Då hoppar vi över raderna 3 - 6 och går istället in i else
-satsen på rad 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 8 var sann.
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!')
>
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!')
>
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!')
>
Talet är INTE större än noll!
Programmet nedan utför beräkningen x2+9 om talet x är 3 eller 4.
x = 4
if x == 3: print(x**2 + 9)
elif x == 4: print(x**2 + 9)
>
25
x = 4
if x==3 or x==4: print(x**2 + 9)
Använd den logiska operatorn or
.
Eftersom beräkningen endast utförs om x
är 3 eller 4 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)
>
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.
koeff = [a, b, c]
.
Vi börjar med att skapa invärdena. För att ha något att testa med kan vi använda koefficienterna från 4x^2 + 4x + 1 = 0.
koeff = [4, 4, 1]
Vi fortsätter med exemplet och undersöker hur vi skulle lösa det så att vi vet vad vi ska göra i programmet. För att lösa ekvationen börjar vi med att dividera allt med koefficienten framför x^2-termen så att vi får en ekvation på pq-form.
4x^2 + 4x + 1 = 0 ⇔ x^2 + 4/4x + 1/4 = 0
Vi gör samma sak i programmet och skapar två variabler, p
och q
. I p
lägger vi koefficienten framför x-termen dividerad med koefficienten framför x^2-termen och i q
lägger vi konstanttermen dividerad med samma sak.
koeff = [4, 4, 1]
p = koeff[1] / koeff[0] q = koeff[2] / koeff[0]
Om man har en andragradsekvation skriven på pq-form, alltså x^2 + px + q = 0, kan lösningen skrivas som x = - p/2 ± sqrt(( p/2 )^2 - q). Nu är det dock viktigt att tänka på att det inte är säkert att det finns två lösningar till ekvationen. Beroende på vad som står i diskriminanten, alltså uttrycket under rottecknet, är det också möjligt att det bara finns en lösning eller ingen reell lösning alls. Vi skapar en till variabel som innehåller diskriminanten.
koeff = [4, 4, 1]
p = koeff[1] / koeff[0] q = koeff[2] / koeff[0] disk = (p/2)**2 - q
Nu finns det tre olika fall beroende vad vi har räknat ut i diskriminanten. Om den är positiv går det bra att dra roten ur värdet och det blir två olika lösningar när man adderar respektive subtraherar från - p2. Vi lägger in en if
-sats som undersöker om disk
är större än 0 och i så fall räknar ut dessa två lösningar och skriver ut resultatet.
import math koeff = [4, 4, 1]
p = koeff[1] / koeff[0] q = koeff[2] / koeff[0] disk = (p/2)**2 - q if disk > 0: x1 = -p / 2 - math.sqrt(disk) x2 = -p / 2 + math.sqrt(disk) print('Två lösningar: {} och {}'.format(x1, x2))
Här lade vi även till en rad i början av programmet för att importerar modulen math
så att vi kan använda funktionen sqrt()
. Det andra fallet är när diskriminanten är 0. Då finns det inget att addera eller subtrahera från - p2, så man får bara en lösning. Vi lägger till en elif
-sats som undersöker om disk
är lika med 0.
import math koeff = [4, 4, 1]
p = koeff[1] / koeff[0] q = koeff[2] / koeff[0] disk = (p/2)**2 - q if disk > 0: x1 = -p / 2 - math.sqrt(disk) x2 = -p / 2 + math.sqrt(disk) print('Två lösningar: {} och {}'.format(x1, x2)) elif disk == 0: x = -p / 2 print('En lösning: {}'.format(x))
Om diskriminanten varken är positiv eller lika med 0 måste den vara negativ, vilket är vårt tredje fall. Eftersom vi får ett imaginärt resultat om vi drar roten ur ett negativt tal finns det inga reella lösningar på ekvationen om diskriminanten är negativ. Vi skriver ut detta, och eftersom vi redan kontrollerat om disk
är positivt eller lika med 0 räcker det med en else
-sats.
import math koeff = [4, 4, 1]
p = koeff[1] / koeff[0] q = koeff[2] / koeff[0] disk = (p/2)**2 - q if disk > 0: x1 = -p / 2 - math.sqrt(disk) x2 = -p / 2 + math.sqrt(disk) print('Två lösningar: {} och {}'.format(x1, x2)) elif disk == 0: x = -p / 2 print('En lösning: {}'.format(x)) else: print('Inga reella lösningar')
Nu är hela programmet färdigt och fungerar för alla tre fall. Vi testar att köra det med koefficienterna för 4x^2 + 4x + 1 = 0 och ser att det fungerar.
> En lösning: -0.5
Nu kan vi använda programmet för att lösa våra tre andragradsekvationer. Den första, 4x^2 + 4x + 1 = 0, använde vi som ett exempel när vi skrev programmet, så allt vi behöver göra är att köra det.
import math
koeff = [4, 4, 1]
p = koeff[1] / koeff[0] q = koeff[2] / koeff[0] disk = (p/2)**2 - q if disk > 0: x1 = -p / 2 - math.sqrt(disk) x2 = -p / 2 + math.sqrt(disk) print('Två lösningar: {} och {}'.format(x1, x2)) elif disk == 0: x = -p / 2 print('En lösning: {}'.format(x)) else: print('Inga reella lösningar')
> En lösning: -0.5
Det finns alltså en lösning på ekvationen, x = -0,5. För att beräkna lösningarna till den andra ekvationen, x^2 + x + 1 = 0, behöver vi bara byta ut värdena i variabel koeff
så med koefficienterna för ekvationen. Då kommer det att stå koeff = [1, 1, 1]
, vilket ger följande resultat.
> Inga reella lösningar
Det finns alltså inga reella lösningar till ekvationen. Vi gör på samma sätt för den sista ekvationen, -25x^2 + 90x + 648 = 0. Vi byter då ut andra raden mot koeff = [-25, 90, 648]
och kör programmet.
> Två lösningar: -3.6000000000000005 och 7.2
Den första lösningen är egentligen -3,6 men på grund av hur flyttalen lagras i datorn kan man ibland få några extra deciamler på slutet. Vi får alltså de två lösningar: x = -3,6 och x = 7,2.
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!
Olika månader har olika många dagar. Kanske vet man inte hur många för varje månad, men det kan man alltid googla fram. Tabellen visar hur många dagar som ingår i varje månad.
Månad | Dagar |
---|---|
Januari | 31 |
Februari | 28 |
Mars | 31 |
April | 30 |
Maj | 31 |
Juni | 30 |
Juli | 31 |
Augusti | 31 |
September | 30 |
Oktober | 31 |
November | 30 |
December | 31 |
Nu ser vi att variabeln dagar
kan ha tre olika värden: 28, 30 eller 31. Det är dock bara februari som har 28 dagar, så vi kan låta programmet undersöka om manad
är den månaden. Kom ihåg att sätta apostrofer runt månadsnamnet så att det blir en sträng.
if manad == 'februari': dagar = 28
Är det inte februari behövs en ny kontroll, dvs. en elif
-sats, för att se om det ska vara 30 eller 31 dagar. Eftersom det finns flera månader av varje sort är det smidigt att använda in
här. Vi gör då en lista av alla månader med samma antal dagar, och använder in
för att se om månaden manad
ingår i listan.
if manad == 'februari': dagar = 28 elif manad in ['april', 'juni', 'september', 'november']: dagar = 30
Nu har vi jämfört manad
med alla månader kortare än 31 dagar, så om dagar
ännu inte fått ett värde måste manad
vara en 31-dagarsmånad. Vi täcker upp samtliga återstående fall med en else
-sats.
if manad == 'februari': dagar = 28 elif manad in ['april', 'juni', 'september', 'november']: dagar = 30 else: dagar = 31
Vi testar tilldelningen genom att ge manad
något månadsnamn och se om print
-raden ger förväntat svar.
manad = 'september'
if manad == 'februari': dagar = 28 elif manad in ['april', 'juni', 'september', 'november']: dagar = 30 else: dagar = 31
print("Månaden {} har {} dagar.".format(manad, dagar))
Månaden september har 30 dagar.
Gun-Britt har fått i uppdrag att skriva ett program som tar ett tal som invärde och ökar det med 1 om det är mindre än 5 och minskar det med 1 om det är större än eller lika med 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.
Vid första anblick kan det se ut som att programmet gör vad det ska. Första if
-satsen undersöker ju om tal
är mindre än 5 och den andra om tal
är större än eller lika med 5, precis som var angivet i uppgiften. Det är alltid en god idé att göra några testkörningar med sitt program för att se till så att det beter sig på det sätt vi förväntar oss. Vi testar på alla heltal mellan 1 och 10.
tal
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
---|---|---|---|---|---|---|---|---|---|---|
Resultat | 2 | 3 | 4 | 4 | 4 | 5 | 6 | 7 | 8 | 9 |
Någon konstigt har hänt när man kör programmet med tal = 4
. Talet 4 borde ökas med 1 och ge resultatet 5 men vi får ut samma tal som vi satte in. Anledningen till denna bugg är att if
-satserna är skrivna på ett sådant sätt att båda kommer att köras när tal = 4
. För att förstå det börjar vi med att titta på den första if
-satsen.
if tal < 5: tal += 1
Om tal
är 4 kommer detta villkor att vara sant, vilket innebär att vi går in i if
-satsen och ökar tal
med 1. Efteråt kommer då värdet 5 att vara sparat i tal
. Vi går sedan vidare och tittar på den andra if
-satsen.
if tal >= 5: tal -= 1
Eftersom tal
har ändrats till 5 kommer även det här villkoret att vara sant. tal
är ju större än eller lika med 5, så vi kommer att köra även den här if
-satsen. När vi gör det sänks värdet på tal
med 1 och vi får tillbaka 4. Det här borde ju inte ha hänt, och vi kan undvika det genom att byta ut den andra if
-satsen mot en else
-sats.
tal = 4 if tal < 5: tal += 1 else: tal -= 1 print(tal)
> 5
Eftersom else
-satsen bara körs om if
-satsen är falsk finns det nu ingen risk att båda kommer att köras. Om tal
är lika med 4 kommer den att ökas till 5 i if
-satsen och sedan hoppar programmet över else
-satsen, vilket gör att vi nu får rätt utvärde: 5.
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')
Vi vill skriva om programmet så att det använder elif
-satser, men då måste vi först veta hur det fungerar. Programmet undersöker först om åldern är under 20 år. Om den är det undersöks om den också är under 13. I så fall skrivs Barn ut och annars skrivs Tonåring ut. Är ålder 20 eller över skrivs antingen Vuxen eller Pensionär ut om åldern är under respektive över 65.
Ålder | Skriv ut |
---|---|
alder < 13 |
Barn |
13 ≤ alder < 20 |
Tonåring |
20 ≤ alder < 65 |
Vuxen |
65 ≤ alder |
Pensionär |
Vi börjar med att skriva en if
-sats som gör första kontrollen för att se om åldern är under 13. I så fall skriver vi ut Barn.
alder = 19 if alder < 13: print('Barn')
Nu skulle vi kunna skriva en elif
-sats som kontrollerar att åldern ligger mellan 13 och 20, men egentligen behöver vi bara kontrollera att den är mindre än 20. Villkoret i en elif
undersöks ju bara om satserna före har varit falska, så vi vet att om programmet har kommit fram dit så måste if
-satsen ha varit falsk. Då måste åldern vara 13 eller över, och det räcker att kontrollera om den är under 20.
alder = 19 if alder < 13: print('Barn') elif alder < 20: print('Tonåring')
Vi tänker på samma sätt igen. Om vi kommer fram till nästa elif
-sats måste både if
-satsen och den första elif
-satsen varit falska och åldern måste alltså vara 20 eller över. Då räcker det med att kontrollera om den är under 65 för att bestämma om vi ska skriva ut Vuxen eller inte.
alder = 19 if alder < 13: print('Barn') elif alder < 20: print('Tonåring') elif alder < 65: print('Vuxen')
Vi behöver inte göra någon speciell kontroll för att undersöka att ålder är 65 eller över eftersom vi redan har kontrollerat att den inte är under 13, 20 eller 65. Då måste den vara 65 eller över, så det räcker det med en else
-sats som skriver ut Pensionär.
alder = 19 if alder < 13: print('Barn') elif alder < 20: print('Tonåring') elif alder < 65: print('Vuxen') else: print('Pensionär')
> Tonåring
Nu har vi ett program som gör exakt samma sak som det i uppgiften, fast med hjälp av elif
-satser.