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 1¶
Her vil du se noen eksempler på sammenligninger av tall og strenger. Strenger sammenlignes i alfabetisk rekkefølge.
Last ned filen her: eksempel_1.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('a > b =', a > b)
# avoid repetition with f-strings and =
print(f'{a > b = }')
# rewrite as f-string-=
print(a == b)
print(a <= b)
print(3 <= a <= 7 < b < 10)
navn_1 = 'Alice'
navn_2 = 'Albert'
print(f'{navn_1 < navn_2 = }')
print(navn_1 == navn_2)
print(navn_1 > navn_2)
matches = navn_1 == "Bob"
print(f'{matches = }')
Eksempel 2¶
Her er noen eksempler på de boolske operatorene and
, or
og not
.
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_2.py
. Skjønner du hva som skjer i de siste 8
radene? 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 = }')
x = True
test_2 = (not x) and x
print(f'{test_2 = }')
a = False
b = True
test_3 = ((not a) and (not b)) == (not (a or b))
print(f'{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 3¶
Her er noen eksempler på if-setninger. Om uttrykket ved if
evaluerer til True
kjøres kodeblokken under.
Last ned filen her: eksempel_3.py
, og kjør koden. Hvorfor printes ingenting i
den siste if-setningen? Kan du endre koden slik at noe blir skrevet ut fra den?
print('Booleans')
if True:
print('ABCDEF')
if False:
print('KLMXYZ')
print('Numbers')
a = 5
b = 9
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')
print('\n'*3)
print('Start of names')
name = "Fred"
if 're' in name:
print("Your name has 're' inside!")
name = "Alice"
if 're' in name:
print("Your name has 're' inside!")
if name == "Alice":
print('Welcome, Alice!')
print('End of names\n\n\n')
print('Nested if-statements')
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 4¶
Her er noen eksempler på if-else-setninger. Om uttrykket ved if
ikke evalueres til
True
kjøres koden under else
i stedet.
Last ned filen her: eksempel_4.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) = }')
print(f'{is_even(37) = }')
###############
x = 'apple' if (5 < 6) else 'banana'
print(x)
x = 'apple' if (9 < 6) else 'banana'
print(x)
Eksempel 5¶
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.
Last ned filen her: eksempel_5.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.
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 6¶
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 å 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¶
Obs
Denne uken skal du levere koden på git. De siste ukene fikk du
en git.app.uib.no
-konto (Installasjon av nødvendig programvare),
og vi begynte å bruke git (Git setup).
Sjekk https://git.app.uib.no/ii/inf100/20h/assignments nå.
Der finnes din kopi av inf100-uke04
, som inneholder fire oppgave_....py
filer.
Du skal clone prosjektet, editere filene, og pushe resultatet
tilbake til serveren, slik som vi har gjort med test
-prosjektet tidligere.
Oppgave 1¶
I denne oppgaven skal vi fortsette på eksempelet med polynom fra forrige uke.
I filen oppgave_1.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.
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 2¶
Vi skal nå forbedre funksjonen fra oppgave 1.
I filen oppgave_2.py
skriv kode som gjør det samme som i oppgave 1, men nå
skal funksjonen din også kunne håndtere negative tall.
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 3¶
I denne oppgaven skal brukeren bestemme hva programmet gjør.
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_3.py
, skriv et program som spør brukeren om en enhet, enten
nanometer ('nm'
) eller terahertz ('THz'
), og en verdi (et tall).
Programmet skal så skrive ut
hvilken farge lyset med den enheten og den 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 4¶
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 kode som spør brukeren om et årstall, for å så skrive
ut på skjermen om dette er et skuddår eller ikke.
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)