Uke 7 — list / tuple / functions
================================
Denne uken avslutter vi med lister, tuple og funksjoner. Les
https://automatetheboringstuff.com/2e/chapter4/
frem til "A Short Program: Conway’s Game of Life" og
avsnittet "Keyword Arguments and the print() Function" i
https://automatetheboringstuff.com/2e/chapter3/
Eksempler
---------
Eksempel: Tupler
.................
Tupler er litt som en liste, men bruker ``()`` isteden for ``[]``.
Det er noen viktige forskjeller på tupler og lister som vi skal se på seinere.
I dette eksempelet lager vi noen tupler og ser hvordan de kan brukes.
Last ned filen her: :download:`eksempel_tuple.py`, og kjør koden.
.. literalinclude:: eksempel_tuple.py
Eksempel: Sekvenser
....................
Her er noen eksempler på lister, tupler og strenger. De er like på mange måter,
hovedforskjellen er at listene kan endres, vi kaller det for "mutable". Tuples, strenger
og de enkle datatypene int, float, bool er "immutable", og kan kun endres ved å
lage en ny kopi av verdien.
Last ned filen her: :download:`eksempel_sequence_types.py`, og kjør koden. Skjønner du hva
som skjer?
.. literalinclude:: eksempel_sequence_types.py
Eksempel: Forandres vs ikke forandres
.....................................
Her er noen eksempler på forskjellen mellom lister, som er 'mutable' (kan forandres),
og tupler, som er 'immutable' (kan ikke forandres).
Last ned filen her: :download:`eksempel_mutable.py`, og kjør koden. Skjønner du hva
som skjer? Hvorfor er ``b`` blitt endret etter ``a += [999, 777]``? Hvorfor er
``b`` ikke blitt endret etter ``a += (999, 777)``?
.. literalinclude:: eksempel_mutable.py
Eksempel: map()
................
``map()`` tar a funksjon og en liste og bruker funksjonen på hvert element i listen.
``map(f, [a, b, c])`` blir ``[f(a), f(b), f(c)]``.
Det kan være fint hvis du vil gjøre det samme for alle elementene i listen, men fortsatt ha en liste.
Last ned filen her: :download:`eksempel_map.py`, og kjør koden.
.. literalinclude:: eksempel_map.py
Eksempel: zip()
..................
zip() er en innebygd funksjon som "zipper" sammen sekvensene som blir gitt inn og
returnerer en liste av tupler, en sekvens kan f.eks. være en liste, streng eller en
tuple. Den tar det første elementet fra hver sekvens og legger de sammen i en
tuple, og så det andre elementet i hver sekvens og legger de sammen osv.
Om sekvensene har ulik lengde, er det den korteste sekvensen som bestemmer
lengden på zip() outputet.
Last ned filen her: :download:`eksempel_zip.py`, og kjør koden.
.. literalinclude:: eksempel_zip.py
Eksempel: Funksjoner
....................
Her er noen eksempler på funksjoner med 'keyword arguments'.
Last ned filen her: :download:`eksempel_func.py`, og kjør koden. Skjønner du hva
som skjer?
.. literalinclude:: eksempel_func.py
Se på de tre siste funksjonskallene. Her brukes funksjonen ``my_sum`` på tre forskjellige måter.
Hvordan er resultatet forskjellig? Kan du forklare hvorfor?
Eksempel: Finne feilene
.......................
Her er noen eksempler på ting som kan gå feil.
Last ned filen her: :download:`errors_1.py`. Før du kjør koden, se om du finner
alle feil som gjør at den ikke går å kjøre. Kjør siden koden. Fant du alle feil?
Endre koden så at den går å kjøre. Koderaden ``greeting_str = str(full_greeting)``
er ikke feil slik at man får en error fra Python, men den gjør ikke akkurat hva vi
vil at den skal gjøre. Endre så at det blir riktig output.
.. literalinclude:: errors_1.py
Spørsmål
--------
* Svare på spørsmål 11-16 i `kapittel 4 av Automate the Boring Stuff `_.
* Svare på spørsmål 1-4 og 7-8 i `kapittel 3 i Automate the Boring Stuff `_.
* På hvilke ulike måter er det mulig å kalle følgende funksjon? ::
f(x, a=0, b=1)
.. week 8:
* problem solving
* several project euler, but can we find non-maths tasks, too?
Euler 2
Euler 14
Wolf-sheep model from last week
Oppgaver
--------
Oppgave 1
.........
I ``oppgave_1.py`` fra listen ``names``, bruk listeinklusjon for å bygge en ny
liste som inneholder en liste til for hvert navn, med
(1) navnet stavet baklengs, og (2) lengden på navnet.
Skriv ut resultatet.
``names = ['Jakob', 'Emma', 'Ola', 'Sondre', 'Maia', 'Emilie', 'Noa']``
Hvis du trenger å friske opp hukommelsen på listeinklusjon kan du se på forrige
ukes oppgaver.
Eksempelkjøring (for listen ``['Bob','Oliver']``)::
[['boB', 3], ['revilO', 6]]
Oppgave 2
.........
I ``oppgave_2.py`` gjør det samme som i oppgave 1, med denne gangen bruk
``map()`` metoden. Du må definere en funksjon som kan brukes i map().
Husk: i python 3 må den returnerte verdien fra ``map()`` konverteres til ``list()``
for å returnere en liste.
Oppgave 3
.........
I ``oppgave_3.py`` pakk ut tuplene ``cat`` og ``dog`` til verdiene
``personlighet, stemme, favorittmat``.
Lag en ny liste som inneholder personligheten til begge to.
Du kan bruke ``zip()`` og hente ut det første elementet.
``cat = ('aloof', 'meow', 'tuna')``
``dog = ('friendly', 'woof', 'sausage')``
Eksempelkjøring::
['aloof', 'friendly']
Oppgave 4
.........
I ``oppgave_4.py`` bytt ut kattens favorittmat fra ``tuna`` til ``laks``.
Skriv ut den nye tuplen.
``cat = ('aloof', 'meow', 'tuna')``
Oppgave 5
.........
Vi kan også tenke på lister som stacks. I ``oppgave_5.py`` bruk ``append()``
og ``pop()`` metoder for å legge til tallene 6 og 7 til ``stack`` og for ta ut
det siste tre tallene fra ``stack``. Skriv ut resultatet i den rekkefølgen du får
fra pop().
``stack = [3, 4, 5]``
Oppgave 6 - Pig latin
.....................
I ``oppgave_6.py`` bruk ``input()`` i en løkke for å bygge en liste med minst 3 ord
(alle små bokstaver) fra bruker-input. Avbryt løkken når brukeren ikke skriver noe.
Lag en funksjon som heter ``pigify`` som gjør følgende:
1. hvis et ord begynner med en vokal, legger -way til slutten av ordet
(e.g., eple --> epleway)
2. hvis ordet ikke begynner med en vokal, skal funksjonen flytte alle bokstavene i
begynnelsen av ordet frem til den første vokalen til slutten av ordet, og legge
til -ay (e.g., banan --> ananbay, plomme -> ommeplay).
Kjør funksjonen på listen din og skriv ut resultatet.
Eksempelkjøring::
Enter word: dog
Enter word: shrew
Enter word: orange
Enter word:
original words:
['dog', 'shrew', 'orange']
words in pig latin:
['ogday', 'ewshray', 'orangeway']
Hint: Du kan bruke ``map()`` metoden for å bruke ``pigify`` funksjonen på
hvert ord i listen din.
Oppgave 7
.........
I ``oppgave_7.py`` bruk ``sorted()`` med søkeordargumenter for å sortere listen
``frukt`` etter ordlengde. (https://docs.python.org/3.9/library/functions.html#sorted)
``frukt = ['eple', 'appelsin', 'ananas', 'kokosnøtt', 'banan', 'kirsebær']``
..
Oppgave 8
.........
I ``oppgave_8.py``,
Gitt en M x N tuple med 5 koordinater på ((x1,y1), (x2,y2) ...),
bruk zip() for å lage en tuple i formatten ((x1, x2, ...),(y1, y2, ...)).
``five_by_two = ((0, 1), (1, 2), (2, 3), (3, 4), (4, 5))``
Hint: Bruk ``*`` for å pakk ut tupler
Oppgave 8
.........
I ``oppgave_8.py`` skal vi lage en funksjon som regner ut vekslepenger.
Skriv en funksjon ``return_change(payment, price)`` som returnerer en liste med mynter som skal betales tilbake.
Myntene er 1, 5, 10 og 20-kroner, og vi vil betale tilbake med så få mynter som mulig.
(vi vil heller bruk én 20-kroning enn tjue 1-kroninger). Ikke bruke print() eller input() i innleveringen.
Eksempelkjøring::
>>> return_change(30, 20)
[10]
>>> return_change(30, 13)
[10, 5, 1, 1]
**Tips**: se på eksemplene fra forrige uke!
..
Oppgave 10: `Project Euler nr. 14 `_
.........................................................................
I denne oppgaven skal vi løse `problem nr. 14 i Project Euler `_.
I ``oppgave_10.py`` lag en funksjon som heter ``collatz_sequence``.
Funksjonen skal ta et positivt heltall som argument og returnere Collatz-sekvensen som en liste.
Eksempelkjøring::
>>> collatz_sequence(13)
[13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
>>> collatz_sequence(1)
[1, 4, 2, 1]
Lag en ny funksjon som heter ``euler_14`` for å løse problemet. Du kan bruke ``collatz_sequence``.
Fordi 1 million er et veldig stort tall og kan ta lang tid skal vi løse det for et litt mindre tall: ti tusen.
Funksjonen skal ikke ta noen argumenter, og skal returnere det tallet under 10'000 som gir den lengste Collatz-sekvensen.
..
BONUS Oppgave
.............
Denne oppgaven er ikke obligatorisk, men du kan få 2 bonuspoeng for riktig løsning.
Denne oppgaven er større enn en eksamensoppgave, men stilen er lik.
Skriv **en funksjon** som fyller ut en tekst med mellomrom slik at alle rader får samme
lengd. Lengden på radene skal være et argument til funksjonen. Den justerede teksten
skal returneres av funksjonen som en streng. **Funksjonen skal ikke bruke print() eller input().**
Her er hele spesifikasjonen:
**Input:** funksjonen skal ta to argument, en str (``text``) og en int (``line_len``).
**Output:** funksjonen skal returnere samme tekst som i ``text`` men hvor alle rader har lengden ``line_len``.
**Vilkår:**
* Alle rader må inneholde så mange ord som er mulig innen radlengden.
* Funksjonen får bare fylle ut med mellomrom (' ') mellom ordene (ikke tab eller noen annen whitespace).
* Mellomrommen i hver rad må være så jevnt fordelt som mulig, i.e. forskjellen mellom størst antall
mellomrom og minst antall mellomrom mellom orden i en rad får ikke være mer enn 1. Men du får selv
velge hvordan du vil plassere ut mellomrommen så lenge dette er oppfyllt.
* Alle rader må begynne med et tegn som ikke er whitespace.
* Slutten på alle rader må enten være på formen ``'char\n'`` eller ``'char'``, hvor ``'char'`` er et tegn
som ikke er whitespace, i.e. du får ikke begynne eller slutte en rad med mellomrom.
* Den siste raden i teksten skal ikke bli fylt ut med mellomrom. I denne raden skal det være eksakt ett
mellomrom mellom alle ord.
* Du kan anta at inget ord i ``text`` er lengre enn ``line_len``.
**Eksempel:** om input til funksjonen er følgende tekst:
Alice was beginning to get very tired of sitting by her sister
on the bank, and of having nothing to do: once or twice she had peeped
into the book her sister was reading, but it had no pictures
or conversations in it, 'and what is the use
of a book,' thought Alice 'without pictures or conversation?'
og ``line_len`` er 60 skal funksjonen returnere noe slikt::
Alice was beginning to get very tired of sitting by her
sister on the bank, and of having nothing to do: once or
twice she had peeped into the book her sister was reading,
but it had no pictures or conversations in it, 'and what is
the use of a book,' thought Alice 'without pictures or
conversation?'
(men du får selv velge hvordan du vil plassere mellomrommen, innen vilkårene).