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.