Uke 3 — functions / def / return ================================ Teknisk ------- .. toctree:: :maxdepth: 1 ../03-gitsetup/README Introduksjon ------------ Denne uken skal vi jobbe med funksjoner i Python. Enten kan man definere sine egne funksjoner eller så kan man bruke innebygde funksjoner i Python. Du finner en liste på Pythons innebygde funksjoner i `Pythons dokumentasjon `_. Det er vel verdt å bli kjent med dokumentasjonen. Hvis du ikke kan en funksjon fra før, kan du søke den opp her og finne ut hva den gjør. Eksempler --------- Eksempel 1 .......... Funksjoner gjør at man kan kjøre samme blokk med kode flere ganger, uten å måtte skrive den samme koden flere ganger. Her er et eksempel på kode hvor vi bruker funksjoner. I koden ser du at vi ikke nødvendigvis må kalle funksjonene i samme rekkefølge som de er definert. Last ned filen her: :download:`eksempel_1.py`. .. literalinclude:: eksempel_1.py Noen steder i koden er det brukt en ekstra ``\``. Se for eksempel på ``ascii_castle()``. Her står det ``\'`` noen steder, men når vi kjører programmet printes ikke ``\``. Dette er fordi ``\`` er en så kalt 'escape character'. Vi kan bruke ``\`` før tegn som ellers ville ha noen annen betydning i en streng. For eksempel, om vi ikke hadde brukt ``\`` før ``'`` ville Python trodd at strengen var slutt ved ``'`` og vi hadde fått en feilmelding (prøv gjerne). Men når vi putter ``\`` før ``'`` sier vi til Python at vi ikke mener at strengen er slutt her, uten at Python skal printe tegnet ``'``. Siden ``\`` er et spesielt tegn på denne måten må vi bruke ``\`` før ``\`` om vi vil at Python skal lese strengen som tegnet ``\`` og ikke som en escape character. Det er derfor det står ``\\`` på alle steder hvor vi vil printe ``\``. Du kan lese mer om escape characters `her `_, og `her `_ er en liste med eksempler på alle escape characters i Python 3. Kjør koden. Hvorfor blir ikke ``ascii_square()`` skrevet ut? Eksempel 2 .......... Funksjoner kan også brukes for å gjøre beregninger. Mange ganger vil man gjøre samme beregning flere ganger. Da er det lurt å plassere koden for beregningen i en funksjon som man siden kan kalle flere ganger. Om man vil gjøre flere ulike beregninger etterpå hverandre kan man dessuten gjøre det. Her er et eksempel på kode hvor vi bruker funksjoner for å gjøre beregninger. Last ned filen her: :download:`eksempel_2.py`. .. literalinclude:: eksempel_2.py Kjør koden. Blev outputen hva du hadde ventet deg? Kan du lage noen funksjoner til, for å unngå repetisjonen i print-linjene? Eksempel 3 .......... I dette eksempelet bruker vi en funksjon for en beregning og en funksjon for å lage en streng. Vi beregner og printer andregradspolynomer. Last ned filen her: :download:`eksempel_3.py`. .. literalinclude:: eksempel_3.py I koden har vi brukt en f-string for å lage en streng. Du trenger ikke å bruke f-strings akkurat nå, men nå vet du at de finnes. Du kan finne en kort introduksjon til f-strings `her `_ om du vil vite mer. Her brukes ``return`` i ``poly_string()``, i stedet for å printe direkte i funksjonen. Prøv å endre i koden så at ``poly_string()`` printer strengen, i stedet for å bruke ``return``. Hva skjer? Eksempel 4 .......... Det er mulig å definere en funksjon i Python uten å bruke ``return``. Da returnerer Python verdien ``None`` i bakgrunnen. Husk at om du vil gi verdien fra en funksjon til en annen funksjon må du bruke ``return``. Her er noen eksempler på hva som skjer om man ikke bruker ``return`` i funksjoner. Last ned filen her: :download:`error_1.py`. .. literalinclude:: error_1.py Når du prøver å kjøre koden får du en feilmelding. - Se på det vanlige outputet før feilmeldingen: hvorfor ser det slik ut? - Hvorfor får du error når du kjører koden? - Hvorfor blir ikke den siste raden skrevet ut? - Endre koden slik at den kjører. - Hvorfor fikk du ingen feilmelding fra ``den_er_feil()``-funksjonen? Oppgaver -------- I disse oppgavene skal du lage og bruke funksjoner. Oppgave 1 ......... I denne oppgaven skal vi lage våre egne funksjoner som beregner maximum og minimum av to tall. Siden skal vi sammenligne disse med Pythons innebygde funksjoner ``max()`` og ``min()``. I filen ``oppgave_1.py``, skriv kode som gjør følgende: 1. Definerer en funksjon som heter ``egen_max()`` som beregner maximum av heltallene :math:`a` og :math:`b` ifølge formelen: .. math:: \frac{a + b + | a - b |}{2} (:math:`|a - b|` betyr absoluttverdien av :math:`a-b`). **Funksjonen skal returnere et heltall.** 2. Definerer en funksjon som heter ``egen_min()`` som beregner minimum av heltallene :math:`a` og :math:`b` ifølge formelen: .. math:: \frac{a + b - | a - b |}{2}. **Funksjonen skal returnere et heltall.** 3. Spør brukeren om to tall og skriver siden ut resultatet av ``egen_max()``, ``max()``, ``egen_min()`` og ``min()`` på tallene. La det være en tom linje etter inputen, og mellom resultatet for maximum og minimum. Eksempelkjøring:: Tall 1: 39 Tall 2: 14 egen_max(39, 14) = 39 max(39, 14) = 39 egen_min(39, 14) = 14 min(39, 14) = 14 Prøv å kjøre din kode med noen ulike tall. Gir dine egne funksjoner riktig svar? Tips **** Du kan bruke Pythons innebygde funksjon ``abs()`` til å beregne absoluttverdi. Du finner informasjon om hvordan funksjonen fungerer `i Pythons dokumentasjon `_. Oppgave 2 ......... I denne oppgave skal vi fortsette med konverteringen mellom Fahrenheit og Celsius vi begynte med forrige uke. Men denne gangen skal vi plassere beregningen i en funksjon. I filen ``oppgave_2.py``, skriv kode som gjør følgende: 1. Definerer en funksjon som heter ``fahrenheit_til_celsius()`` som tar en temperatur i enheten Fahrenheit og returnerer en temperatur i enheten Celsius. Den matematiske formelen er: .. math:: T_C = (T_F - 32) \cdot \frac{5}{9}, hvor :math:`T_C` er temperaturen i Celsius og :math:`T_F` er temperaturen i Fahrenheit. 2. Definerer en funksjon som heter ``celsius_til_fahrenheit()`` som tar en temperatur i enheten Celsius og returnerer en temperatur i enheten Fahrenheit. Den matematiske formelen er: .. math:: T_F = \frac{9}{5} \cdot T_C + 32, hvor :math:`T_C` er temperaturen i Celsius og :math:`T_F` er temperaturen i Fahrenheit. 3. Spør brukeren om en temperatur i enheten Fahrenheit og bruker ``fahrenheit_til_celsius()`` til å beregne tilsvarende temperatur i enheten Celsius. Denne temperaturen skrives ut på skjermen med **én** desimal. 4. Tar verdien du fikk i steg 3 og bruker ``celsius_til_fahrenheit()`` til å beregner tilsvarende temperatur i enheten Fahrenheit. Denne temperaturen skrives ut på skjermen med **èn** desimal. Eksempelkjøring:: Gi en temperatur i Fahrenheit: 225 Temperatur i Celsius: 107.2 Temperatur i Fahrenheit: 225.0 Hva skjer om du avrunder resultatet til èn desimal inne i funksjonene, så at ``fahrenheit_til_celsius()`` og ``celsius_til_fahrenheit()`` begge returnerer tall med kun èn desimal? Prøv dette med 44 og 67 Fahrenheit som input. Hvorfor blir resultatet slik? Tips **** Bruk den innebygde funksjonen ``round()`` til å bestemme antall desimaler. Du finner informasjon om hvordan funksjonen fungerer `i Pythons dokumentasjon `_. Oppgave 3 ......... I denne oppgaven skal vi fortsette med tekstboksen vi holdt på med forrige uke. Denne gangen skal vi plassere tegningen av boksen i en funksjon. I filen ``oppgave_3.py``, skriv kode som gjør følgende: 1. Definerer en funksjon (som du selv velger et deskriptivt navn for) som tar en streng som argument og tegner en boks runt teksten på skjermen. Det skal være **ett** mellomrom før og etter strengen, og **en** ``=`` på hver side. Fyll inn over og under tilsvarende. 2. Spør brukeren om navn. 3. Bruker funksjonen du definerte i 1) til å tegne en boks rund navnet på skjermen. La det være en tom linje før og etter boksen. 4. Ønsker brukeren en god dag (velg setning selv). Eksempelkjøring:: Hva heter du? Lina ======== = Lina = ======== Jeg håper du får en fin dag!