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: :download:`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.
.. literalinclude:: eksempel_sammenlign.py
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 til ``True`` om både ``X`` og ``Y`` evaluerer til ``True``.
* ``X or Y`` evaluerer til ``True`` om enten ``X`` eller ``Y`` evaluerer til ``True``.
* ``not X`` evaluerer til ``True`` om ``X`` evaluerer til ``False``.
Last ned filen her: :download:`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?
.. literalinclude:: eksempel_boolske.py
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: :download:`eksempel_if_bool.py`, og kjør koden. Hvilket uttrykk kunne evaluere til ``True``? Hva om ``False``?
.. literalinclude:: eksempel_if_bool.py
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 :download:`eksempel_if_numbers.py`):
.. image:: ./img/uke04_if.png
:width: 400
:alt: control flow for if statement evaluating ``a < b``
Last ned filen her: :download:`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?
.. literalinclude:: eksempel_if_numbers.py
La oss prøve et annet eksempel. Last ned filen her: :download:`eksempel_if_names.py`, og kjør koden.
Hvorfor printes ingenting i den siste if-setningen?
.. literalinclude:: eksempel_if_names.py
La oss prøve et siste eksempel på if-setninger. Last ned filen her: :download:`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?
.. literalinclude:: eksempel_if_nested.py
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`):
.. image:: ./img/uke04_if_else.png
:width: 400
:alt: control flow for if-else statement evaluating ``a < b``
Last ned filen her: :download:`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``.
.. literalinclude:: eksempel_if_else.py
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`):
.. image:: ./img/uke04_if_elif_else.png
:width: 400
:alt: control flow for if-elif-else statement evaluating ``a`` og ``b``
Last ned filen her: :download:`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.
.. literalinclude:: eksempel_if_elif.py
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: :download:`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).
.. literalinclude:: errors_1.py
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.eks ``1x^2``, skal ``1`` ikke skrives ut,
bare ``x^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 :download:`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``, ikke ``5x + -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, ikke ``1``,
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)