Livekoding fredag 1. oktober
Følgende er oppgaver og løsningsforslag fra gjennomgangen vi gjorde sammen fredag 1. oktober.
Oppgave 1 (pekere/referanser)
Oppgave: Hva printes her? NB: Denne oppgaven er litt på kanten av pensum til nå, men er ment for å gi en liten smakebit på fremtidig pensum (en del har også vært litt forvirret rundt disse tingene):
tall = [1, 2, 3]
nummer = tall
print(tall)
nummer.append(4)
print(tall)
For å forstå løsningen på oppgaven, må man vite hvordan variable fungerer i Python. Variabelen tall
over peker på et objekt i minnet. Når vi setter nummer = tall
, setter vi nummer
til å peke på det samme objektet. Når vi legger til et tall til denne listen, så peker fortsatt tall
og nummer
på det samme objektet i minnet.
Oppgave 2 (pekere/referanser)
Hva printes her?
tekst = "Hei"
tekst2 = tekst
tekst2 = tekst2 + " på deg"
print(tekst)
Forskjellen fra oppgave 1 er at strenger i Python er "immutable". Dvs at de ikke kan endres. På første linje opprettes det et streng-objekt, men når vi skal utvide den strengen oppretter Python et nytt streng-objekt og setter variabelen tekst2
til å peke på den nye strengen.
Oppgave 3
Hva printes her?
a = 5
b = a
b += 10
print(a)
På lik linje med strenger, så er også tall (int) immutable. Når vi sier b += 10
, så oppretter Python et nytt int-objekt og setter b til å peke på dette. Variabelen a peker fortsatt på det opprinnelige objektet.
Oppgave 4: Funksjoner (og skop)
Hva printes her?
a = 10
def print_tall(a):
print(a)
a = 20
return 100
print_tall(a)
print(a)
I gruppetimen snakket vi om skop, og at når vi sier a = 20
inne i funksjonen print_tall
, så definerer vi bare enn lokal variabel a
som er i et lokalt skop inne i funksjonen. Vi endrer ikke den globale variabelen a
.
Oppgave 5: Lister
Oppgave: Gitt listene under, finn ved hjelp av for-løkker alle personer som er i begge gruppene:
gruppe1 = ["Emilie", "Mari", "Espen"]
gruppe2 = ["Espen", "Marius", "Ivar"]
Vi diskuterte ulike løsninger på dette problemet i gruppetimen, der den enkleste kanskje er to sett med for-løkker for å gå gjennom alle kombinasjoner av navn i de to listene. Vi så videre at den indre for-løkken gjerne kunne byttes ut med et funksjonskall til en funksjon av typen liste_har_elemenet
, og endte opp med denne koden:
def liste_har_element(liste, element):
for e in liste:
if e == element:
return True
return False
for navn in gruppe1:
if liste_har_element(gruppe2, navn):
print(navn)
Videre diskuterte vi at mengder kan være fint for å representere de to gruppene, ettersom det er unike navn i hver gruppe. Vi diskuterte også at mengder tillatter veldig raskt oppslag av om noe er i mengden (detaljene rundt det er ikke pensum). Man kan de ende opp med denne enkle koden:
gruppe1 = {"Emilie", "Mari", "Espen"}
gruppe2 = {"Espen", "Marius", "Ivar"}
for navn in gruppe1:
if navn in gruppe2:
print(navn)
Oppgave 6
personer = ["Emilie", "Ivar", "Mari", "Emilie", "Ivar"]
Oppgave: Lag en ordbok der nøkkel er navn og verdi er antallet ganger personen forekommer i listen over. Ikke bruk count. Man skal ende opp med noe sånt som dette: {"Emilie": 2, "Ivar": 2, ...}
Løsning som ble foreslått i gruppetimen:
teller = {}
for person in personer:
if person in teller:
teller[person] += 1
else:
teller[person] = 1
Opppgave 7
personer = {"gruppe1": ["Ivar", "Emilie", "Emilie", "Mari"],
"gruppe2": ["Espen", "Marius", "Emilie"],
"gruppe3": ["Marius"]}
Oppgave: Lag en ordbok der nøkkel er navn og verdi er antall ganger personen finnes totalt i alle gruppene. Eksempel på output: {"Emilie": 3, "Ivar": 1, ...
Løsning nr. 1 (ideen er å først en "flat" liste og bruk koden fra forrige oppgave):
personliste = []
for nøkkel in personer:
personliste += personer[nøkkel]
for person in personer:
if person in teller:
teller[person] += 1
else:
teller[person] = 1
Løsning nr. 2:
#mulig alternativ for-løkke: for gruppe, personer in personer.items():
for personer in personer.values():
for person in personer:
if person in teller:
teller[person] += 1
else:
teller[person] = 1
Oppgave 8
Vi diskuterte for-løkker og hva som er kravet for at noe kan itereres over i en for-løkke. Vi kom fram til at alt som er itererbart (iterable), kan itereres over.
Oppgave: Lag tilsvarende en ordbok der nøkkel er bokstav og verdi er antall ganger bokstaven finnes i teksten under.
tekst = "Hei på deg der"
teller = {}
for bokstav in tekst:
if bokstav in teller:
teller[bokstav] += 1
else:
teller[bokstav] = 1
Poenget med oppgaven var å se at selv strenger er itererbare.