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.