Uke 3 — bool / if ================= Introduksjon ------------ Denne uken skal vi jobbe med booleans og if-statements i Python. Først skal vi også se på f-strings, som gir en enkel måte å lage strenger som bruker verdier i variabler. Les den første delen av `kapittel 2 i Automate the Boring Stuff `_ frem til "*while* Loop Statements". Eksempler --------- Eksempel: f-strings ................... Vi bruker f-strings ved å putte et "f" foran strengen vi vil lage. Når vi har "f" foran strengen kan vi putte variabler eller andre uttrykk innen "{}". Så blir verdien konvertert til en streng og puttet inn hvor parentesene er. La oss se på noen eksempler. Last ned filen her: :download:`eksempel_f_strings.py `, og kjør koden. .. literalinclude:: eks/eksempel_f_strings.py Eksempel: Sammenligninger ......................... Vi skal demonstrere hvordan du kan sammenligne (``<, >, ==, >=, <=``) uttrykk på ulike måter, og hvordan slike sammenligninger kan brukes i if-setninger. 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:: eks/eksempel_sammenlign.py Eksempel: in ............ Vi kan bruke ordet ``in`` til å sjekke om en ting er med i en annen ting. Resultatet blir en boolsk verdi. Last ned filen her: :download:`eksempel_in.py `, og kjør koden. .. literalinclude:: eks/eksempel_in.py Eksempel: Boolske 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`` har verdien ``True`` om både ``X`` og ``Y`` har verdien ``True``. * ``X or Y`` har verdien ``True`` om enten ``X`` eller ``Y`` har verdien ``True``. * ``not X`` har verdien ``True`` om ``X`` har verdien ``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:: eks/eksempel_boolske.py Eksempel: If-setninger ...................... Her er noen eksempler på if-setninger. Om uttrykket etter ``if`` har verdien ``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. Hva blir printet? .. literalinclude:: eks/eksempel_if_bool.py Det kan være litt vanskelig å forstår hva koden gjør. Du kan tegne bildet av koden for å 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:: eks/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:: eks/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:: eks/eksempel_if_nested.py Eksempel: If-else-setninger ........................... Her er noen eksempler på if-else-setninger. Om uttrykket ved ``if`` ikke har verdien ``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 :download:`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. .. TODO should we mention this at all? .. literalinclude:: eks/eksempel_if_else.py Det finnes en annen måte å bruke if-else: vi kan bruke ``A if X else B`` som et uttrykk. Uttrykket har verdien ``A`` om ``X`` har verdien ``True``, ellers har det verdien ``B``: .. code-block:: python 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 har verdien ``True`` går Python videre til ``elif`` og sjekker om det uttrykket har verdien ``True``, og kjører isåfall kodeblokken under. Forskjellen mellom to ``if`` etter hverandre og ``if`` så ``elif`` er at om uttrykket ved ``if`` har verdien ``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 :download:`eksempel_if_elif.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? .. literalinclude:: eks/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:: eks/errors_1.py Oppgaver -------- Oppgave 1 ......... Vi skal utøke programmet fra oppgave 5 førrige uken. I filen ``uke_03_oppg_1.py`` skal du skrive et program som leser inn navn, gateadresse, postkode og poststed fra brukeren og siden skriver ut den lengste raden i adressen. Om flere rader har den lengste lengden skal programmet **bare skrive ut den første** av de radene som har lengst lengde. Kjøring av programmet ditt skal se ut slik som følgende eksempelkjøring: .. code-block:: html Hva er ditt navn? Ola Olsson Hva er din adresse? Gateveien 1 Hva er ditt postnummer og poststed? 1234 Stedet Gateveien 1 Oppgave 2 ......... Her skal vi gjøre nesten samme sak igjen, men med en liten forskjell. I filen ``uke_03_oppg_2.py`` skal du skrive et program som leser inn navn, gateadresse, postkode og poststed fra brukeren og siden skriver ut den/de lengste radene. Så denne gang om flere rader har den lengste lengden skal programmet **skrive ut alle disse radene**. Kjøring av programmet ditt skal se ut slik som følgende eksempelkjøring: .. code-block:: html Hva er ditt navn? Ola Olsson Hva er din adresse? Gateveien 1 Hva er ditt postnummer og poststed? 1234 Stedet Gateveien 1 1234 Stedet Oppgave 3 ......... Våre øyne oppfatter elektromagnetisk stråling med en bølgelengde fra 380 til 740 nanometer, eller med en frekvens fra 405 til 790 terahertz. Men det finnes også elektromagnetisk stråling som vi ikke kan se. Vi deler in elektromagnetisk stråling i følgende spektrum: ===================== ================== ================== Spektrum Bølgelengde (nm) Frekvens (THz) ===================== ================== ================== Radiobølger over 10⁹ under 3·10⁻⁴ Mikrobølger 10⁶ -- 10⁹ 3·10⁻⁴ -- 0.3 Infrarød stråling 740 -- 10⁶ 0.3 -- 405 Synlig lys 380 -- 740 405 -- 790 Ultrafiolett stråling 10 -- 380 790 -- 3·10⁴ Røntgenstråling 0.01 -- 10 3·10⁴ -- 3·10⁷ Gammastråling under 0.01 over 3·10⁷ ===================== ================== ================== I filen ``uke_03_oppg_3.py`` skal du skrive et program som tar som input først en enhet, enten nanometer (``'nm'``) eller terahertz (``'THz'``), og siden en verdi (et tall). Programmet skal siden skrive ut hvilket spektrum som stråling med den enheten og det verdiet tillhører. Om du får en verdi som er akkurat på grensen mellom to spektrum så skal du velge den som er overst av de to i listen. For eksempel: om brukeren skriver ``'nm'`` og ``'10'`` så skal programmet ditt skrive ut at det er ultrafiolett stråling. Eller om brukeren skriver ``'THz'`` og ``'790'`` så skal programmet ditt skrive ut at det er synlig lys. Kjøring av programmet ditt skal se ut slik som følgende eksempelkjøringer. Husk at store eller små tall kan også skrives med e-notasjon: ``2.5e-4`` betyr 2.5·10⁻⁴. .. code-block:: html Angi enhet: nm Angi verdi: 65000 Dette er infrarød stråling. .. code-block:: html Angi enhet: nm Angi verdi: 6.5e4 Dette er infrarød stråling. .. code-block:: html Angi enhet: THz Angi verdi: 0.015 Dette er mikrobølger. .. code-block:: html Angi enhet: THz Angi verdi: 1.5e-2 Dette er mikrobølger. Oppgave 4 ......... 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 ``uke_03_oppg_4.py``, skriv et program som spør brukeren om et årstall og skriver ut om det er et skuddår eller ikke. Kjøring av programmet ditt skal se ut slik som følgende eksempelkjøringer: .. code-block:: html Angi år: 1996 Dette er et skuddår. .. code-block:: html Angi år: 1900 Dette er ikke et skuddår. 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 `_. Oppgave 5 ......... Vanligvis sier mann at et menneskeår er ekvivalent med 7 hundeår. Dette tar dokk ikke hensyn til at hunder blir voksne på ca 2 år. Derfor kan det være bedre å regne begge de første 2 menneskeårene som 10.5 hundeår, og etter det regne hvert menneskeår som 4 hundeår. I filen ``uke_03_oppg_5.py`` skal du skrive et program som spør brukeren om antall menneskeår og siden skriver ut hvor mange hundeår det tilsvarer. Kjøring av programmet ditt skal se ut slik som følgende eksempelkjøringer: .. code-block:: html Angi menneskeår: 2 Dette tilsvarer 21.0 hundeår. .. code-block:: html Angi menneskeår: 11 Dette tilsvarer 57.0 hundeår.