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.