Uke 11 - modules / import / standardbibliotek ============================================= Eksempler --------- Eksempel 1 .......... Vi kan gjenbruke funksjoner og variabler fra en annen fil med ``import``. Her er en fil med noen nyttige innhold (du kan laste ned filen her: :download:`eks_1_lib.py`). Den slags fil også kaller man for modul/library: .. literalinclude:: eks_1_lib.py I hovedprogrammet kan vi gjenbruke filen i ulike måter: Vi kan ``import``-e hele filen med sitt navn, eller vi kan gi et nytt navn med ``import .. as``. Se hvordan vi bruker funksjoner fra filen. En annen mulighet er å plukke ut spesifikke funksjoner med ``from .. import ...``. Vi kan også bruke ``as`` her. (du kan laste ned hovedprogrammet her: :download:`eksempel_1.py`) .. literalinclude:: eksempel_1.py Pass på at begge filene ligger i den samme mappen, og at terminalen kjører der. Ved bruk av import kan man strukturere store programmer på en oversiktlig måte, gjerne også i flere mapper. Det går utover pensum her, men mer informasjon finnes på https://docs.python.org/3.8/tutorial/modules.html Standardbiblioteker ................... Mange nyttige biblioteker er allerede med i hver Python-installasjon, det er "Python Standard Library". Vi skal vise noen eksempler av nyttige moduler her. En full oversikt finnes på Pythons hovedsiden: https://docs.python.org/3.8/library/ Når man kommer til å jobbe mer med Python er det lurt å bli kjent med oversikten her. Man trenger ikke å være ekspert i alle modulene, men man må ha en idé hva slags moduler det finnes. Moduler som ``sys`` eller ``os`` er brukt i nesten alle prosjektene, mens biblioteker som f.eks ``sunau`` (Read and write Sun AU audio files) har en veldig spesialisert målgruppe. Dokumentasjonen for hvert bibliotek er veldig bra, med mange eksempler. Det finnes alltid noe nyttig når man leser gjennom. Eksempel 2 .......... Pythons bibliotek ``math`` inneholder mange vanlige matematiske funksjoner og konstanter. Du finner dokumentasjonen for biblioteket på https://docs.python.org/3.8/library/math.html. Her er noen eksempler på bruk av ``math`` (du kan laste ned koden her: :download:`eksempel_2.py`): .. literalinclude:: eksempel_2.py Det finnes også andre bibliotek for å gjøre beregninger. `Her er en liste på numeriske biblioteker `_. Se på noen av dem og lag dine egne eksempler. .. .. fractions?? .. https://docs.python.org/3.8/library/fractions.html Eksempel 3 .......... Om man trenger en kalender eller må beregne tidspunkt, er det best å bruke en ferdig bibliotek. I Python er det `datetime `_. Les gjennom siden og se på eksemplene der. Filen :download:`eksempel_3.py` viser noen enkle bruk av biblioteken: .. literalinclude:: eksempel_3.py Prøv å legge inn noe du fant i dokumentasjonen. Eksempel 4 .......... Når vi vil telle antall kan vi bruke klassen ``Counter`` i biblioteket ``collections``, som er en spesiell versjon av dict(), hvor hvert element begynner med 0 allerede. Dokumentasjonen finner du her: `collections `_. Vi prøver `igjen <../uke_09/#eksempel-4>`_ å telle antall ord i en tekst, men denne gangen bruker vi ``Counter``. Du kan laste ned koden her: :download:`eksempel_4.py`. .. literalinclude:: eksempel_4.py Eksempel 5 .......... `itertools `_-biblioteken gjør det enklere å skrive ulike typer løkke. Filen :download:`eksempel_5.py` viser et tilfelle, men det finnes mange eksempler i dokumentasjonen. Gjerne prøv noen av dem. .. literalinclude:: eksempel_5.py Eksempel 6 .......... Du kan bruke biblioteket ``random`` til å generere tilfeldige tall. Dokumentasjonen for dette biblioteket finner du `her `_. Du kan laste ned koden her: :download:`eksempel_6.py`. Prøv å kjør koden noen ganger uten ``random.seed(123456)`` og noen ganger med ``random.seed(123456)``. Hva er forskjellen? .. literalinclude:: eksempel_6.py Oppgaver -------- Del 1 - random .............. Sriv en funksion ``kast_n_2(n)`` som tar inn et heltall ``n`` og simulerer n kast av to terninger (``random.randint(1,6)``) og legger til summen av de to i en liste. Returner den listen (som nå inneholder n elementer med tall mellom 2 og 12). Hvor ofte får vi øyesummen 2, 3, …, 12? Bruk ``collections.Counter`` i en funksjon ``print_histo(xs)`` som tar inn en slik liste og printer ut et enkelt histogram hvor ``'*'`` står for 1%. :: 2 ** 3 *** 4 ***** ... 10 *** 11 ** 12 * (Ikke bruk random.seed() slik at testene kan fungere rett.) Del 2 - datetime, `Project Euler nr.19 `_ .............................................................................. * Bruk ``datetime``-modulen for å fikse ``del_2.py``. * Nyttige funksjoner finnes i `dokumentasjonen om datetime.date `_ How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)? .. .. Del 3 - fractions, `Project Euler nr.57 `_ .. ............................................................................... .. .. * Bruk ``fractions``-modulen: `Dokumentasjon `_ .. .. It is possible to show that the square root of two can be expressed as an .. infinite continued fraction:: .. .. √2 = 1 + (1 / (2 + (1 / (2 + (1 / (2 + …)))))) .. .. By expanding this for the first four iterations, we get:: .. .. 1 + 1/2 = 3/2 = 1.5 .. 1 + 1/(2 + 1/2) = 7/5 = 1.4 .. 1 + 1/(2 + 1/(2 + 1/2)) = 17/12 = 1.41666… .. 1 + 1/(2 + 1/(2 + 1/(2 + 1/2))) = 41/29 = 1.41379… .. .. The next three expansions are ``99/70``, ``239/169``, and ``577/408``, but the eighth .. expansion, ``1393/985``, is the first example where the number of digits in the .. numerator exceeds the number of digits in the denominator. .. .. In the first one-thousand expansions, how many fractions contain a numerator .. with more digits than the denominator? Del 3 - egen statistikk ....................... Lag et bibliotek ``del_3_lib.py`` i den samme mappen sånn at det følgende programmet fungerer, men uten å bruke de eksisterende funksjonene ``mean,median,mode,max,min`` fra Python:: import del_3_lib data = [3, 1, 7, -3, 5, 9, 1, 5, 9, 7, -3, 7] a = del_3_lib.mean(data) b = del_3_lib.median(data) c = del_3_lib.mode(data) d = del_3_lib.max(data) e = del_3_lib.min(data) print(a,b,c,d,e) Alle funksjonene skal ta en liste som argument. * Funksjonen ``mean()`` skal returnere gjennomsnittet av tallene i listen. Gjennomsnittet av tallene :math:`x_1, x_2, ..., x_n` kan beregnes med formelen: .. math:: \frac{x_1 + x_2 + ... + x_n}{n}. For eksempel:: del_3_lib.mean([2, 5, 3, 1]) # skal returnere 2.75 * Funksjonen ``median()`` skal returnere medianen av tallene i listen. Dette er tallet som er i mitten etter att listen er blitt sortert. Om lengden av listen er jevn er medianen gjennomsnittet av de to tallene i mitten. For eksempel:: del_3_lib.median([4, 12, 3, 9, 5]) # skal returnere 5 del_3_lib.median([3, 6, 93, 45, 14, 22]) # skal returnere 18 * Funksjonen ``mode()`` skal returnere typetallet: det vanligste tallet i listen. Om flere tall er like vanlige skal funksjonen returnere det tallet som er først i listen. For eksempel:: del_3_lib.mode([3, 4, 22, 7, 4, 15, 4, 7, 1]) # skal returnere 4 del_3_lib.mode([3, 22, 7, 4, 15, 4, 7, 1, 4, 7, 22, 15, 22]) # skal returnere 22 * Funksjonen ``max()`` skal returnere den største verdien i listen. For eksempel:: del_3_lib.max([3, 6, 93, 45, 6, 14, 22]) # skal returnere 93 * Funksjonen ``min()`` skal returnere den minste verdien i listen. For eksempel:: del_3_lib.min([3, 6, 93, 45, 6, 14, 22]) # skal returnere 3 Del 4 (uten tests) .................. `Project Euler 89 `_ er en god øvelse for ``dict`` og filhåndtering.