Uke 4 — bool / if¶
Introduksjon¶
Denne uken skal vi jobbe med booleans og if-statements i Python. Les den første delen av kapittel 2 i Automate the Boring Stuff frem til «while Loop Statements».
Eksempler¶
Vi skal demonstrere hvordan du kan sammenligne (<, >, ==, >=, <=
) uttrykk
på ulike måter, og hvordan slike sammenligninger kan brukes i if-setninger.
Eksempel: Sammenligninger¶
Her er noen eksempler på sammenligninger av tall og strenger. Strenger sammenlignes i alfabetisk rekkefølge.
Last ned filen her: eksempel_sammenlign.py
, og kjør koden. Du kan prøve
å skrive om rad 10 og 11 med f-strings. Prøv å sammenligninge noen andre uttrykk.
a = 5
b = 9
print(a > b)
print(f'{a > b}') # you can do the same with f-strings
print('a > b =', a > b)
# rewrite with f-string:
print(f'a > b = {a > b}') # print and evaluate expression with f-string
# try it yourself! rewrite the following as f-string:
print(a == b)
print(a <= b)
print(3 <= a <= 7 < b < 10)
print('---------------')
navn_1 = 'Alice'
navn_2 = 'Albert'
print(f'navn_1 < navn_2 = {navn_1 < navn_2}')
print(navn_1 == navn_2)
print(navn_1 > navn_2)
matches = navn_1 == "Bob"
print(f'matches = {matches}')
Eksempel: Boolse Operatorer¶
Her er noen eksempler på de boolske operatorene and
, or
og not
. Hvis du er usikker og trenger å oppdatere minnet ditt på boolske uttrykk, leser igjen seksjonen Boolean Values i kapittel 2 av teksten.
X and Y
evaluerer tilTrue
om bådeX
ogY
evaluerer tilTrue
.X or Y
evaluerer tilTrue
om entenX
ellerY
evaluerer tilTrue
.not X
evaluerer tilTrue
omX
evaluerer tilFalse
.
Last ned filen her: eksempel_boolske.py
. Skjønner du hva som skjer i de siste 8
linjene? Hva blir test_4
og hva tror du test_5
blir? Kjør koden. Var det riktig?
print('Boolean operators')
print(True and True)
print(True and False)
print('--------')
print(True or False)
print(True or True)
print('--------')
print(not True)
print(not False)
print('Larger boolean expressions')
test_1 = (5 > 3) and ('a' < 'c')
print(f'test_1 = {test_1}')
x = True
test_2 = (not x) and x
print(f'test_2 = {test_2}')
a = False
b = True
test_3 = ((not a) and (not b)) == (not (a or b))
print(f'test_3 = {test_3}')
print('Confuse yourself...')
true = False
false = True
# decide before running!
test_4 = (true and True)
print(test_4)
test_5 = test_4 or false
print(test_5)
Eksempel: If-setninger¶
Her er noen eksempler på if-setninger. Om uttrykket etter if
evalueres til True
kjøres kodeblokkene under.
La oss prøve første med et enkelt eksempel. Last ned filen her: eksempel_if_bool.py
, og kjør koden. Hvilket uttrykk kunne evaluere til True
? Hva om False
?
if True:
print('ABCDEF')
if False:
print('KLMXYZ')
Det kan være litt vanskelig å forstår hva koden gjøre. Du kan tegne bildet av koden å hjelpe deg selv til å forstå.
Se bildet for eksempelet på kontrollflyten for en enkel if-setning (a < b
eksempelen under og i filen eksempel_if_numbers.py
):

Last ned filen her: eksempel_if_numbers.py
, og kjør koden. Prøve å tegne et bilde av kontrollflyten for a > b
i koden.
Til slutt er det noen if-setninger som ikke er så gode. Hva er galt med dem? Hvordan kan du skrive dem bedre?
a = 5
b = 9
#############
# the diagram above shows this control flow visually
if a < b:
print('Smaller!')
#############
if a > b:
print('Bigger!')
#############
if a == b:
print('The same!')
print('More than one line can be here:')
print('as')
print('many')
print('as')
print('you')
print('like.')
#############
if a > 5 and b < 10:
print('A is above 5 and B is less than 10')
#############
print('Done comparing numbers\n\n\n')
print('How not to not write bad if-conditions:')
if (a < b) == True: # Do *not* write comparisons like this!
print('Writing "if (a<b) == True" is doing double work!')
print('"a < b" is already a boolean by itself.')
print('Writing "if True==True:" doesn\'t make it more true')
if not (a >= b) == False: # nooooo! use this instead: if a < b:
print('An if statement with many negatives is not readable')
La oss prøve et annet eksempel. Last ned filen her: eksempel_if_names.py
, og kjør koden.
Hvorfor printes ingenting i den siste if-setningen?
name = "Fred"
if name == "Fred":
print("Welcome, Fred!")
if 're' in name:
print("Your name has 're' inside!")
name = "Alice"
if name == "Alice":
print('Welcome, Alice!')
if 're' in name:
print("Your name has 're' inside!")
La oss prøve et siste eksempel på if-setninger. Last ned filen her: eksempel_if_nested.py
, og kjør koden. Hvorfor printes ingenting i
denne if-setningen? Kan du endre koden slik at noe blir skrevet ut i den?
x = 101.2
y = -56.8
z = 104
if z % 5 == 0:
print('Z is divisible by 5')
if x > 100:
print('Also, x is larger than 100')
if y > 50:
print('Also, y is larger than 50')
print('Still in the Z if-block')
print('Outside again. Try other values for x y z')
Eksempel: If-else-setninger¶
Her er noen eksempler på if-else-setninger. Om uttrykket ved if
ikke evalueres til
True
kjøres koden under else
i stedet.
Se bildet for et eksempel på kontrollflyten for en enkel if-else-setning (a < b
eksempelen i eksempel_if_else.py):

Last ned filen her: eksempel_if_else.py
, og kjør koden. Hva returneres av funksjonene
is_smaller()
, is_odd()
og is_even()
(et heltall, en float, en streng, etc.)?
De siste 5 radene er eksempler på hvordan man kan bruke if-else som uttrykk i Python.
Uttrykket A if X else B
evalueres til A
om X
evalueres til True
, ellers
evalueres det til B
.
a = 5
b = 9
if a < b:
print('Smaller!')
else:
print('Bigger!')
print('Done!')
#############
def compare(x,y):
if x < y:
print(f'{x} is smaller than {y}')
else:
print(f'{x} is not smaller than {y}')
compare(5,9)
compare(10,3)
compare(-101.435, 56.7)
compare('Fred','Alice')
##############
def is_smaller(a,b):
return a < b
if is_smaller(30,50):
print('30 is smaller than 50')
else:
print('30 is not smaller than 50')
###############
def is_odd(x):
return x % 2 == 1
def is_even(x):
return x % 2 == 0
print(f'is_odd(37) = {is_odd(37)}')
print(f'is_even(37) = {is_even(37)}')
###############
x = 'apple' if (5 < 6) else 'banana'
print(x)
x = 'apple' if (9 < 6) else 'banana'
print(x)
Eksempel: If-elif-else-setninger¶
Her er noen eksempler på if-elif-else-setninger. Om uttrykket ved if
ikke evalueres
til True
går Python videre til elif
og sjekker om det uttrykket evalueres til True
,
og kjører isåfall kodeblokken under. Forskjellen mellom to if
etter hverandre og
if
så elif
er at om uttrykket ved if
evalueres til True
sjekkes ikke det i elif
’en.
Om man har to if
etter hverandre sjekkes alltid begge uttrykkene.
Se bildet for et eksempel på kontrollflyten for en enkel if-elif-else-setning (den første eksempelen i eksempel_if_elif_else.py):

Last ned filen her: eksempel_if_elif.py
, og kjør koden. Hvorfor blir det ulike resultater
fra ’chain 4’ med elif og ’chain 4’ med bare if?
I Python kan man bruke in
for å sjekke om en bokstav eller en streng er en del av en annen streng.
a = 9
b = 9
if a < b:
print('Smaller!')
elif a > b:
print('Bigger!')
else:
print('Same!')
print('Done!')
#############
print('Chain 1')
if False:
print('A')
elif False:
print('B')
elif False:
print('C')
elif False:
print('D')
else:
print('E')
print('Chain 2')
if False:
print('A')
elif False:
print('B')
elif True:
print('C')
elif False:
print('D')
else:
print('E')
print('Chain 3')
if True:
print('A')
elif False:
print('B')
elif False:
print('C')
elif False:
print('D')
else:
print('E')
print('Chain 4')
if False:
print('A')
elif True:
print('B')
elif False:
print('C')
elif True:
print('D')
else:
print('E')
print('Chain 4, just using if')
if False:
print('A')
if True:
print('B')
if False:
print('C')
if True:
print('D')
else:
print('E')
print('End of chain examples')
####################
tekst = 'oppvaskmaskin'
if 'a' in tekst:
print('We have an A')
else:
print("We don't have an A")
if 'e' in tekst:
print(f'There is an e in {tekst}')
elif tekst[3:5] == 'va':
print('Characters 3-5 are VA')
elif 'opp' in tekst:
print('The text contains "opp"')
else:
print('None of the options matched')
print('==========')
if 'opp' in tekst:
print('The text contains "opp"')
Eksempel: Finne feilene¶
Her er noen eksempler på kode som ikke er riktig. Prøv å finne feilene uten å kjøre koden først.
Last ned filen her: errors_1.py
. Finn feilen og endre så at koden går ann å kjøre.
Hva hvis en som besøker museumet er både en senior og en student? Endre koden slik at denne personen betaler riktig pris (en person som tilhører to kategorier betaler kun den billigste prisen).
a = 42
if a % 7 == 0
print(f"{a} is divisible by 7.")
if a % 5 = 0:
print(f"{a} is divisible by 5.")
name = "Alice"
if name == Alice:
print('Hello, Alice!')
if True:
print('A')
print('B')
print('C')
if 5 < 3:
print('Five is smaller than three')
else:
print('Five is bigger than three')
# This code should tell a visitor entering a museum what
# they must pay, depending on whether the visitor is a
# senior, a student or none of the above. Try some different values.
visitor_is_senior == False
visitor_is_student == False
if visitor_is_senior:
print('Please pay 80 NOK.')
if visitor_is_student:
print('Please pay 90 NOK.')
else:
print('Please pay 100 NOK.')
Oppgaver¶
Oppgave: Positiv poly_string¶
I denne oppgaven skal vi fortsette på eksempelet med polynom fra forrige uke.
I filen oppgave_positiv.py
, skriv kode hvor du definerer en funksjon poly_string(a,b,c)
som tar tre positive heltall eller 0 som argument, og returnerer strengen med
andregradspolynomet (ax^2 + bx + c
). Det første tallet er
andregradskoeffisienten (a
), det andre tallet er førstegradskoeffisienten (b
) og
det tredje tallet er konstanten (c
). For eksempel, om
funksjonen får tallene 3, 7 og 10, skal den returnere strengen "3x^2 + 7x + 10"
.
Om noen av tallene er
0
skal tilsvarende uttrykk ikke være med i strengen.Om noen av de første to tallene er
1
, f.eks1x^2
, skal1
ikke skrives ut, barex^2
.Om alle tre tall er
0
skal strengen være"0"
.Det skal være et mellomrom før og etter hvert plusstegn, men det skal ikke være mellomrom mellom koeffisientene og potensene av x. Se eksempelkjøringene.
Før begynner du å kode, tenke litt og tegne forgreningene av programmet ditt på papir. Du kan også begynne med filen oppgave_positiv_setup.py
.
Når ditt program kjøres skal brukeren spørres om tre tall. Etterpå skal det tilsvarende andregradspolynomet skrives ut på skjermen. Du må bruke funksjonen du laget.
Eksempelkjøring:
Angi koeffisient foran x^2: 3
Angi koeffisient foran x: 7
Angi konstantterm: 10
Ditt polynom er 3x^2 + 7x + 10.
Eksempelkjøring:
Angi koeffisient foran x^2: 0
Angi koeffisient foran x: 16
Angi konstantterm: 0
Ditt polynom er 16x.
Eksempelkjøring:
Angi koeffisient foran x^2: 1
Angi koeffisient foran x: 1
Angi konstantterm: 1
Ditt polynom er x^2 + x + 1.
Eksempelkjøring:
Angi koeffisient foran x^2: 0
Angi koeffisient foran x: 0
Angi konstantterm: 0
Ditt polynom er 0.
Oppgave: Negativ poly_string¶
Vi skal nå forbedre funksjonen fra oppgave 1.
I filen oppgave_negativ.py
skriv kode som gjør det samme som i oppgave 1, men nå
skal funksjonen din også kunne håndtere negative tall. Denne funksjonen skal også hete poly_string()
.
Om en koeffisient er negativ skal den skrives med minustegn i stedet for et plusstegn før uttrykket:
5x - 3
, ikke5x + -3
.Et minustegn mellom to uttrykk skal ha et mellomrom før og etter.
Hvis uttrykket begynner med et negativt tall, skal du ikke ha mellomrom der:
-5x^2
, ikke- 5x^2
.Om den første eller andre koeffisienten er
-1
skall bare minustegnet, ikke1
, skrives ut. Se eksempelkjøringene.
Eksempelkjøring:
Angi koeffisient foran x^2: -26
Angi koeffisient foran x: -5
Angi konstantterm: -9
Ditt polynom er -26x^2 - 5x - 9.
Eksempelkjøring:
Angi koeffisient foran x^2: -1
Angi koeffisient foran x: -1
Angi konstantterm: -1
Ditt polynom er -x^2 - x - 1.
Eksempelkjøring:
Angi koeffisient foran x^2: -13
Angi koeffisient foran x: 8
Angi konstantterm: 0
Ditt polynom er -13x^2 + 8x.
Eksempelkjøring:
Angi koeffisient foran x^2: 20
Angi koeffisient foran x: -5
Angi konstantterm: 44
Ditt polynom er 20x^2 - 5x + 44.
Oppgave: Farge¶
I denne oppgaven skal du regne ut fargen til lys.
Våre øyne oppfatter lys med en bølgelengde fra 380 til 740 nanometer, eller med en frekvens fra 405 til 790 terahertz. Dette spektrumet kan deles opp ut fra fargene vi ser i henhold til følgende tabell:
Farge |
Bølgelengde |
Frekvens |
---|---|---|
fiolett |
380–450 nm |
680–790 THz |
blå |
450–485 nm |
620–680 THz |
cyan |
485–500 nm |
600–620 THz |
grønn |
500–565 nm |
530–600 THz |
gul |
565–590 nm |
510–530 THz |
oransje |
590–625 nm |
480–510 THz |
rød |
625–740 nm |
405–480 THz |
I filen oppgave_farge.py
, skriv to funksjoner som heter wavelength_to_color
og frequency_to_color
.
wavelength_to_color
skal ta en bølgelengde i nm som argument og returnere fargen til den bølgelengden. (F.eks ’cyan’).
frequency_to_color
skal ta en frekvens i THz som argument og returnere fargen.
For å teste funksjonene dine kan du spørre brukeren om en enhet (bruk input()
), enten
nanometer ('nm'
) eller terahertz ('THz'
), og en verdi (et tall).
Så kan du bruke de to funksjonene dine til å skrive ut hvilken farge lys med den enheten og verdien har.
For eksempel, om brukeren angir THz
487
skal programmet ditt skrive ut at lyset med den frekvensen er oransje.
Om brukeren angir nm
392
skal programmet skrive ut at lyset med den bølgelengden
er fiolett. Du kan anta at brukeren alltid angir gyldige verdier.
Oppgave: Skuddår¶
I denne oppgaven skal vi beregne om et gitt år er et skuddår eller ikke.
Regelen for å beregne om et år er et skuddår eller ikke er som følger:
Vanligvis er et år som er deleligt med 4 et skuddår (for eksempel 1996 var et skuddår).
Men år som også er delelige med 100 (for eksempel 1900) er ikke skuddår.
Unntatt år som er delelige med 400 (for eksempel 2000). Disse er skuddår.
I filen oppgave_4.py
, skriv funksjonen som hete is_leap_year()
som tar et årstall som argument og returnerer True
dersom det er et skuddår, og False
dersom det ikke er det.
Du kan bruke Pythons modulooperator %
til å beregne om et tall er deleligt med
et annet tall. Du kan finne mer informasjon om denne operatorn i
Pythons dokumentasjon.
Litt ekstra…¶
Hva skriver ut dette programmet? Hvordan fungerer det?
def chain(n):
if n == 0:
print('Done')
else:
print('X' * n)
chain(n-1)
chain(5)