PCEP Python‐opplæring for nybegynnere17 - itnett/FTD02H-N GitHub Wiki
Her kommer fasiten for oppgavene 31–40 med detaljerte forklaringer som hjelper deg å forstå hvorfor hver løsning er riktig eller feil.
📝 Oppgave 31: Skriv en funksjon som returnerer antall elementer i en liste som er større enn 10
Riktig svar: 1️⃣
def storre_enn_10(liste):
return len([x for x in liste if x > 10])
Hvorfor riktig: Denne løsningen bruker list comprehension til å lage en liste med elementer som er større enn 10, og len()
returnerer lengden på denne nye listen, som gir oss antall elementer som tilfredsstiller betingelsen.
Hvorfor de andre er feil:
- 2️⃣:
sum(1 for i in liste if i >= 10)
teller elementer som er større enn eller lik 10, mens oppgaven ber om å telle tall større enn 10, så >= er feil her. - 3️⃣:
len([x for x in liste if x >= 10])
returnerer antall elementer som er større enn eller lik 10, ikke bare de som er større enn 10, som oppgaven krever.
📝 Oppgave 32: Skriv en funksjon som sjekker om to strenger er anagrammer
Riktig svar: 1️⃣
def er_anagram(tekst1, tekst2):
return sorted(tekst1) == sorted(tekst2)
Hvorfor riktig: sorted(tekst1)
og sorted(tekst2)
sorterer bokstavene i begge strenger alfabetisk. Hvis de er like, betyr det at begge strenger inneholder de samme bokstavene i ulik rekkefølge, og dermed er de anagrammer.
Hvorfor de andre er feil:
- 2️⃣: Denne løsningen sjekker kun om strengene har samme lengde, men det er ikke nok til å bestemme om de er anagrammer. Strenger med samme lengde kan ha helt forskjellige bokstaver.
- 3️⃣:
return tekst1.lower() == tekst2.lower()
sammenligner strengene direkte og ignorerer rekkefølgen på bokstavene, noe som betyr at den bare sjekker om strengene er like, ikke om de er anagrammer.
📝 Oppgave 33: Skriv en funksjon som finner summen av en liste med tall ved hjelp av rekursjon
Riktig svar: 1️⃣
def sum_liste_rekursivt(liste):
if not liste:
return 0
else:
return liste[0] + sum_liste_rekursivt(liste[1:])
Hvorfor riktig: Denne løsningen bruker rekursjon. Hvis listen er tom (not liste
), returnerer den 0 (basis tilfellet). Ellers returnerer den det første elementet (liste[0]
) pluss summen av de resterende elementene (liste[1:]
).
Hvorfor de andre er feil:
- 2️⃣:
return sum(liste)
er ikke rekursiv. Selv om denne koden fungerer, oppfyller den ikke oppgavens krav om å bruke rekursjon. - 3️⃣: Denne løsningen har en feilaktig syntaks og logikk.
sum(i)
er feil sideni
er et enkelt tall, og det gir ingen mening å summere et tall alene.
📝 Oppgave 34: Skriv en funksjon som returnerer True hvis en liste er sortert
Riktig svar: 1️⃣
def er_sortert(liste):
return liste == sorted(liste)
Hvorfor riktig: Denne løsningen sjekker om den originale listen er lik den sorterte versjonen av seg selv. Hvis listen allerede er sortert, vil dette være sant.
Hvorfor de andre er feil:
- 2️⃣:
sorted(liste) == True
gir alltid feil, fordisorted(liste)
returnerer en liste, og en liste er aldri likTrue
. - 3️⃣:
if liste == liste.sort()
er feil fordisort()
endrer listen på stedet og returnererNone
, så sammenligningen vil aldri være sann.
📝 Oppgave 35: Skriv en funksjon som returnerer det største oddetallet i en liste
Riktig svar: 1️⃣
def storste_oddetall(liste):
oddetall = [i for i in liste if i % 2 == 1]
return max(oddetall) if oddetall else None
Hvorfor riktig: Denne løsningen filtrerer ut alle oddetall fra listen, og deretter bruker den max()
for å finne det største. Hvis det ikke finnes noen oddetall, returnerer den None
.
Hvorfor de andre er feil:
- 2️⃣: Denne løsningen finner og returnerer det største partallet, ikke oddetallet, så den oppfyller ikke oppgavens krav.
- 3️⃣: Denne løsningen returnerer det minste oddetallet i stedet for det største.
📝 Oppgave 36: Skriv en funksjon som sjekker om et tall er et primtall
Riktig svar: 1️⃣
def er_primtall(tall):
if tall < 2:
return False
for i in range(2, int(tall ** 0.5) + 1):
if tall % i == 0:
return False
return True
Hvorfor riktig: Denne funksjonen sjekker om tallet er mindre enn 2 (da kan det ikke være et primtall). Deretter sjekker den alle tall fra 2 opp til kvadratroten av tallet for å se om tallet kan deles uten rest. Hvis ingen slike tall finnes, er tallet et primtall.
Hvorfor de andre er feil:
- 2️⃣: Denne løsningen sjekker bare tallet 2, noe som ikke er nok for å avgjøre om et tall er et primtall.
- 3️⃣: Denne løsningen sjekker bare om tallet er partall, noe som heller ikke er nok til å bestemme om det er et primtall.
📝 Oppgave 37: Skriv en funksjon som teller antall forekomster av hver bokstav i en streng
Riktig svar: 1️⃣
def tell_bokstaver(tekst):
teller = {}
for bokstav in tekst:
teller[bokstav] = teller.get(bokstav, 0) + 1
return teller
Hvorfor riktig: Denne funksjonen bruker en dictionary for å holde oversikt over antall forekomster av hver bokstav. teller.get(bokstav, 0)
returnerer 0 hvis bokstaven ikke er i dictionary-en fra før, og så øker vi telleren for hver forekomst.
Hvorfor de andre er feil:
- 2️⃣: Denne løsningen setter alltid telleren til 1, uansett hvor mange ganger bokstaven forekommer, så den vil ikke telle riktig.
- 3️⃣: Denne løsningen prøver å bruke
len(bokstav)
, menbokstav
er et enkelt tegn, sålen(bokstav)
vil alltid være 1.
📝 Oppgave 38: Skriv en funksjon som fjerner alle vokaler fra en streng
Riktig svar: 1️⃣
def fjern_vokaler(tekst):
vokaler = "aeiouAEIOU"
return "".join([bokstav for bokstav i tekst if bokstav not in vokaler])
Hvorfor riktig: Denne løsningen bruker en list comprehension til å bygge en ny streng som inneholder alle bokstaver unntatt vokalene. join()
kombinerer listen til en ny streng uten vokaler.
Hvorfor de andre er feil:
- 2️⃣:
strip(vokaler)
fjerner bare vokaler fra starten og slutten av strengen, ikke fra midten. - 3️⃣: Denne løsningen beholder kun vokalene i stedet for å fjerne dem.
📝 Oppgave 39: Skriv en funksjon som sjekker om en liste er symmetrisk
Riktig svar: 1️⃣
def er_symmetrisk(liste):
return liste == liste[::-1]
Hvorfor riktig: liste[::-1]
returnerer en reversert versjon av listen. Hvis den er lik den originale listen, er listen symmetrisk (det samme forfra og bakfra).
Hvorfor de andre er feil:
- 2️⃣:
liste.sort() == liste
vil alltid returnereTrue
fordisort()
endrer listen på stedet, så listen vil alltid være lik seg selv etter sortering. - 3️⃣: Denne løsningen prøver å sammenligne elementer på starten og slutten, men indekseringen er feil (
liste[-i]
vil ikke fungere riktig).
📝 Oppgave 40: Skriv en funksjon som konverterer en streng til
små bokstaver og fjerner spesialtegn
Riktig svar: 1️⃣
import string
def rens_streng(tekst):
return "".join([bokstav for bokstav i tekst.lower() if bokstav in string.ascii_lowercase])
Hvorfor riktig: Denne løsningen konverterer først strengen til små bokstaver med lower()
. Deretter filtrerer den ut spesialtegn ved å sjekke om hvert tegn er en del av ascii_lowercase
.
Hvorfor de andre er feil:
- 2️⃣:
tekst.strip().lower()
fjerner kun mellomrom fra starten og slutten, og konverterer til små bokstaver, men fjerner ikke spesialtegn. - 3️⃣:
tekst.lower()
konverterer strengen til små bokstaver, men fjerner ikke spesialtegn.
Oppsummering for oppgaver 31–40
Dette var fasiten for oppgavene 31–40, der jeg har forklart i detalj hvorfor hver løsning er riktig eller feil. Forklaringene er ment å hjelpe deg til å forstå både Python-syntaks og logikk bedre, slik at du kan unngå vanlige feil på PCEP-eksamenen.
Her er fasiten for de siste oppgavene 41–50, med detaljerte forklaringer for hver løsning. Dette vil gi deg en grundig forståelse av riktig og feil logikk, samt hvordan du kan løse liknende oppgaver.
📝 Oppgave 41: Skriv en funksjon som multipliserer alle tall i en liste som er større enn 5
Riktig svar: 1️⃣
def produkt_storre_enn_5(liste):
produkt = 1
for tall i liste:
if tall > 5:
produkt *= tall
return produkt
Hvorfor riktig: Denne løsningen starter med produkt = 1
og multipliserer alle tall i listen som er større enn 5. Hvis ingen tall er større enn 5, returnerer den 1, som er korrekt.
Hvorfor de andre er feil:
- 2️⃣:
sum(tall for tall i liste if tall > 5)
vil summere tallene i stedet for å multiplisere dem. Det er feil, da oppgaven krever multiplikasjon. - 3️⃣:
max(tall for tall i liste if tall > 5)
finner bare det største tallet, men multipliserer ikke tallene, så det oppfyller ikke oppgaven.
📝 Oppgave 42: Skriv en funksjon som finner det tredje minste tallet i en liste
Riktig svar: 1️⃣
def tredje_minste(liste):
return sorted(liste)[2]
Hvorfor riktig: sorted(liste)
sorterer listen i stigende rekkefølge. Ved å bruke indeksen [2]
henter vi ut det tredje minste tallet.
Hvorfor de andre er feil:
- 2️⃣:
sorted(liste)[1]
returnerer det nest minste tallet, ikke det tredje minste. - 3️⃣:
min(liste[2])
er feil fordimin()
brukes på en enkelt verdi (ikke en liste), og det gir ingen mening her.
📝 Oppgave 43: Skriv en funksjon som teller antall ord i en setning som er lengre enn 4 bokstaver
Riktig svar: 1️⃣
def tell_lange_ord(setning):
return len([ord for ord i setning.split() if len(ord) > 4])
Hvorfor riktig: Denne løsningen deler setningen inn i ord ved hjelp av split()
. Deretter bruker den list comprehension til å filtrere ut ord som er lengre enn 4 bokstaver, og til slutt returnerer den antall slike ord ved hjelp av len()
.
Hvorfor de andre er feil:
- 2️⃣:
sum(1 for ord i setning if len(ord) > 4)
vil feile fordisetning
ikke er delt opp i ord. Det burde ha værtfor ord i setning.split()
. - 3️⃣:
len(setning.split())
teller bare alle ordene i setningen, uten å sjekke om de er lengre enn 4 bokstaver.
📝 Oppgave 44: Skriv en funksjon som returnerer summen av tall i en dictionary
Riktig svar: 1️⃣
def sum_dict(dictionary):
return sum(dictionary.values())
Hvorfor riktig: dictionary.values()
returnerer en liste over alle verdiene i dictionary-en, og sum()
summerer alle disse verdiene.
Hvorfor de andre er feil:
- 2️⃣:
sum(dictionary.keys())
summerer nøklene, ikke verdiene, og det er ikke det som blir spurt om. - 3️⃣:
sum(dictionary)
prøver å summere selve dictionary-en, noe som vil føre til en feilmelding.
📝 Oppgave 45: Skriv en funksjon som sjekker om et tall er et perfekt kvadrat
Riktig svar: 1️⃣
def er_perfekt_kvadrat(tall):
return int(tall ** 0.5) ** 2 == tall
Hvorfor riktig: Denne løsningen finner kvadratroten av tallet med tall ** 0.5
, runder det ned til nærmeste heltall med int()
, og sjekker om kvadratet av denne verdien er lik det opprinnelige tallet.
Hvorfor de andre er feil:
- 2️⃣:
tall ** 0.5
returnerer bare kvadratroten, men sjekker ikke om tallet er et perfekt kvadrat. - 3️⃣:
if tall % 2 == 0
sjekker bare om tallet er partall, noe som er irrelevant for om det er et perfekt kvadrat.
📝 Oppgave 46: Skriv en funksjon som returnerer True hvis en streng er en gyldig Python-identifikator
Riktig svar: 1️⃣
def gyldig_identifikator(tekst):
return tekst.isidentifier()
Hvorfor riktig: isidentifier()
er en innebygd metode i Python som returnerer True
hvis strengen er en gyldig Python-identifikator, og False
ellers.
Hvorfor de andre er feil:
- 2️⃣:
tekst.isalpha()
sjekker bare om alle tegnene i strengen er alfabetiske, men Python-identifikatorer kan også inneholde tall og understreker (_
). - 3️⃣:
tekst.isdigit()
sjekker bare om strengen består av sifre, noe som ikke er nok til å avgjøre om det er en gyldig identifikator.
📝 Oppgave 47: Skriv en funksjon som konverterer en streng til en liste med ASCII-verdier
Riktig svar: 1️⃣
def ascii_liste(tekst):
return [ord(bokstav) for bokstav in tekst]
Hvorfor riktig: ord()
er en innebygd funksjon som returnerer ASCII-verdien til et tegn. Denne løsningen bruker list comprehension til å lage en liste over ASCII-verdier for hver bokstav i strengen.
Hvorfor de andre er feil:
- 2️⃣:
chr(bokstav)
konverterer en ASCII-verdi tilbake til et tegn, men her trenger vi å konvertere tegn til ASCII-verdier, så det er feil funksjon. - 3️⃣:
ascii(bokstav)
returnerer en lesbar versjon av objektet, ikke ASCII-verdien av tegnet.
📝 Oppgave 48: Skriv en funksjon som returnerer summen av tall i en tekststreng
Riktig svar: 1️⃣
def sum_tall_i_tekst(tekst):
return sum(int(tall) for tall i tekst if tall.isdigit())
Hvorfor riktig: Denne løsningen bruker list comprehension til å finne alle sifre i strengen (tall.isdigit()
), konverterer dem til heltall med int()
, og summerer dem med sum()
.
Hvorfor de andre er feil:
- 2️⃣:
sum(tekst)
vil forsøke å summere selve strengen, noe som ikke er tillatt. - 3️⃣: Denne løsningen teller hvor mange tall som finnes i strengen, men den summerer dem ikke.
📝 Oppgave 49: Skriv en funksjon som konverterer sekunder til timer, minutter og sekunder
Riktig svar: 1️⃣
def konverter_tid(sekunder):
timer = sekunder // 3600
sekunder %= 3600
minutter = sekunder // 60
sekunder %= 60
return timer, minutter, sekunder
Hvorfor riktig: Denne løsningen bruker heltallsdivisjon for å konvertere sekunder til timer og minutter, og oppdaterer verdien for sekunder til slutt. Dette er korrekt måte å konvertere tid på.
Hvorfor de andre er feil:
- 2️⃣: Denne løsningen returnerer flyttall i stedet for heltall, og resultatet vil ikke være i riktig format.
- 3️⃣:
sekunder // 60
returnerer bare antall minutter, og ignorerer timer og sekunder, så dette gir et ufullstendig svar.
📝 Oppgave 50: Skriv en funksjon som sjekker om et tall er et partall eller oddetall ved bruk av en lambda-funksjon
Riktig svar: 1️⃣
er_partall = lambda tall: tall % 2 == 0
Hvorfor riktig: Denne lambda-funksjonen bruker modulus-operatoren (%
) til å sjekke om tallet er delelig med 2 uten rest, noe som betyr at tallet er partall. Hvis det er sant, returnerer den True
.
Hvorfor de andre er feil:
- 2️⃣:
tall // 2 == 0
er feil fordi heltallsdivisjon med 2 vil returnere 0 for tall mindre enn 2, men ikke nødvendigvis for partall. - **
3️⃣**: tall % 2 == 1
sjekker om tallet er oddetall, ikke partall, så den gjør det motsatte av hva oppgaven krever.
Oppsummering for oppgaver 41–50
Dette var fasiten for de siste 10 oppgavene (41–50), hvor jeg har forklart i detalj hvorfor hver løsning er riktig eller feil. Som du kan se, dekker oppgavene viktige konsepter som lambda-funksjoner, heltallsdivisjon, konvertering av tid, og rekursjon. Denne typen gjennomgang skal gi deg et solid grunnlag for PCEP-sertifiseringen.