PCEP Python‐opplæring for nybegynnere16 - itnett/FTD02H-N GitHub Wiki

Her er fasiten for oppgavene 11–20 i samme stil som de første 10, med detaljerte forklaringer for å hjelpe deg til å forstå både de riktige og gale løsningene.


📝 Oppgave 11: Skriv en funksjon som reverserer en streng

Riktig svar: 1️⃣

def reverser_streng(tekst):
    return tekst[::-1]

Hvorfor riktig: Denne løsningen bruker Python's slicing-teknikk med [::-1], som betyr at vi tar alle tegnene i strengen fra start til slutt, men reverserer dem. Dette er en enkel og effektiv måte å reversere en streng på i Python.

Hvorfor de andre er feil:

  • 2️⃣: tekst.reverse() vil ikke fungere fordi reverse() er en metode for lister, ikke strenger. Strenger er immutable (kan ikke endres), så vi kan ikke bruke reverse() på dem.
  • 3️⃣: reversed(tekst) returnerer en iterator, ikke en streng. Hvis vi hadde brukt "".join(reversed(tekst)), ville dette fungert, men slik som det er nå, er det ufullstendig.

📝 Oppgave 12: Skriv en funksjon som sjekker om et tall er positivt, negativt eller null

Riktig svar: 1️⃣

def sjekk_tall(tall):
    if tall > 0:
        return "Positivt"
    elif tall < 0:
        return "Negativt"
    else:
        return "Null"

Hvorfor riktig: Denne løsningen dekker alle muligheter: positive tall, negative tall og null. Den bruker if, elif, og else for å sjekke de forskjellige betingelsene.

Hvorfor de andre er feil:

  • 2️⃣: Denne løsningen returnerer "Positivt" også for tallet null, noe som er feil.
  • 3️⃣: Denne løsningen behandler bare tallet null som positivt, noe som er feil.

📝 Oppgave 13: Skriv en funksjon som finner det minste tallet i en liste

Riktig svar: 1️⃣

def minste_tall(liste):
    return min(liste)

Hvorfor riktig: min() er en innebygd funksjon som returnerer det minste elementet i en liste, noe som gjør den til den mest effektive måten å løse oppgaven på.

Hvorfor de andre er feil:

  • 2️⃣: for i in liste: if i < liste[0]: return i vil bare returnere det første tallet i listen, siden loopen vil stoppe etter det første return.
  • 3️⃣: return liste[0] returnerer alltid det første elementet, som ikke nødvendigvis er det minste.

📝 Oppgave 14: Skriv en funksjon som multipliserer alle tall i en liste

Riktig svar: 1️⃣

def produkt_av_liste(liste):
    produkt = 1
    for tall i liste:
        produkt *= tall
    return produkt

Hvorfor riktig: Denne løsningen starter med produkt = 1 og bruker en for-løkke til å multiplisere hvert element i listen med produktet. Dette er nøyaktig det som kreves.

Hvorfor de andre er feil:

  • 2️⃣: produkt = 0 starter med null, og ethvert tall multiplisert med null vil alltid være null, så denne løsningen vil alltid returnere 0.
  • 3️⃣: produkt += tall er feil fordi den legger til tall i stedet for å multiplisere dem.

📝 Oppgave 15: Skriv en funksjon som sjekker om en streng er et palindrom

Riktig svar: 1️⃣

def er_palindrom(tekst):
    return tekst == tekst[::-1]

Hvorfor riktig: Denne løsningen sammenligner strengen med sin reverserte versjon (brukt slicing [::-1]). Hvis strengen er lik den reverserte versjonen, er den et palindrom.

Hvorfor de andre er feil:

  • 2️⃣: return tekst == reversed(tekst) vil ikke fungere fordi reversed() returnerer en iterator, ikke en streng. For at det skal fungere, måtte vi ha brukt "".join(reversed(tekst)).
  • 3️⃣: if tekst[0] == tekst[-1]: return True sjekker kun de to ytterste tegnene, men gjør ingen fullstendig sammenligning av hele strengen.

📝 Oppgave 16: Skriv en funksjon som fjerner duplikater fra en liste

Riktig svar: 1️⃣

def fjern_duplikater(liste):
    return list(set(liste))

Hvorfor riktig: set() er en innebygd funksjon som fjerner duplikater fordi sett i Python kun inneholder unike elementer. Å konvertere en liste til et sett, og deretter tilbake til en liste, er en rask måte å fjerne duplikater på.

Hvorfor de andre er feil:

  • 2️⃣: Denne løsningen er også korrekt, men den er mer kompleks fordi den manuelt legger til elementer i en ny liste. Selv om den fungerer, er den ikke like effektiv som alternativ 1.
  • 3️⃣: Denne løsningen vil kun returnere en liste som inneholder elementer som bare finnes én gang i originalen, noe som ikke nødvendigvis er riktig. Hvis et element forekommer flere ganger, vil det bli utelatt helt.

📝 Oppgave 17: Skriv en funksjon som teller antall ord i en setning

Riktig svar: 1️⃣

def tell_ord(setning):
    return len(setning.split())

Hvorfor riktig: split() deler en streng på mellomrom, og len() gir oss antall ord (deler) i listen som skapes av split(). Dette er den beste måten å telle ord på.

Hvorfor de andre er feil:

  • 2️⃣: return len(setning) returnerer bare lengden på hele strengen (antall tegn), ikke antall ord.
  • 3️⃣: return len([ord for ord in setning]) vil returnere antall tegn, ikke ord, fordi det bruker en løkke over tegnene.

📝 Oppgave 18: Skriv en funksjon som finner gjennomsnittet av tall i en liste

Riktig svar: 1️⃣

def gjennomsnitt(liste):
    return sum(liste) / len(liste)

Hvorfor riktig: Denne løsningen bruker den innebygde funksjonen sum() til å finne summen av alle elementene i listen, og deretter deler den på lengden av listen (len()) for å beregne gjennomsnittet.

Hvorfor de andre er feil:

  • 2️⃣: Denne løsningen bruker // (heltallsdivisjon), som vil runde ned resultatet til nærmeste heltall, noe som kan gi et feilaktig gjennomsnitt.
  • 3️⃣: return sum(liste) / sum(liste) vil alltid returnere 1, fordi summen av en liste delt på seg selv alltid er 1 (med unntak av en tom liste).

📝 Oppgave 19: Skriv en funksjon som konverterer en liste til en streng

Riktig svar: 1️⃣

def liste_til_streng(liste):
    return " ".join(liste)

Hvorfor riktig: join() kombinerer alle elementene i en liste til en streng, med et mellomrom som skiller hvert element. Dette er den korrekte måten å konvertere en liste til en streng på.

Hvorfor de andre er feil:

  • 2️⃣: liste.join() er feil syntaks. join() er en metode som må kalles på en streng, ikke en liste.
  • 3️⃣: return liste + " " vil føre til en feilmelding fordi det forsøker å legge til en streng til en liste, noe som ikke er tillatt i Python.

📝 Oppgave 20: Skriv en funksjon som sjekker om en liste inneholder et bestemt element

Riktig svar: 1️⃣

def inneholder_element(liste, element):
    return element in liste

Hvorfor riktig: Denne løsningen bruker in-operatoren, som er den beste måten å sjekke om et element finnes i en liste. Dette er en svært effektiv løsning.

Hvorfor de andre er feil:

  • 2️⃣: if element == liste: er feil fordi den prøver å sammenligne et enkelt element med en hel liste, noe som aldri vil være likt.
  • 3️⃣: Denne løsningen har feil logikk fordi den sammenligner elementet med hele listen i stedet for hvert individuelle element.

Oppsummering for oppgaver 11–20

Vi har nå gått gjennom oppgavene 11–20, og for hver oppgave har vi sett hvorfor ett alternativ er riktig, og hvorfor de andre er feil eller delvis riktige. Målet har vært å forklare den logiske forskjellen mellom alternativene, slik at du får en dypere forståelse av Python-syntaks og hvordan du skal tilnærme deg lignende oppgaver.

Her er fasiten for oppgavene 21–30, med detaljerte forklaringer for hvert alternativ, slik at du får innsikt i både de riktige og gale løsningene:


📝 Oppgave 21: Skriv en funksjon som finner den største verdien i en dictionary

Riktig svar: 1️⃣

def storste_verdi(dictionary):
    return max(dictionary.values())

Hvorfor riktig: dictionary.values() returnerer en liste over alle verdier i dictionary-en, og max() finner den største verdien blant dem.

Hvorfor de andre er feil:

  • 2️⃣: max(dictionary.keys()) returnerer den største nøkkelen, ikke verdien. Siden oppgaven spesifikt ber om den største verdien, er dette feil.
  • 3️⃣: dictionary[max(dictionary.keys())] prøver å bruke den største nøkkelen for å hente en verdi, men dette gir ikke nødvendigvis den største verdien. Nøkkel og verdi trenger ikke å være relatert på denne måten.

📝 Oppgave 22: Skriv en funksjon som returnerer indeksen til et element i en liste

Riktig svar: 1️⃣

def finn_indeks(liste, element):
    if element in liste:
        return liste.index(element)
    else:
        return -1

Hvorfor riktig: Først sjekker funksjonen om elementet er i listen med if element in liste. Hvis det er der, bruker den index() for å returnere indeksen. Hvis ikke, returnerer den -1.

Hvorfor de andre er feil:

  • 2️⃣: for i in liste: if i == element: return liste.index(i) ser ut til å fungere, men det vil stoppe etter den første iterasjonen uansett om elementet er funnet eller ikke, fordi return avslutter løkken.
  • 3️⃣: return liste.index(element) or -1 vil returnere -1 bare hvis liste.index(element) er null, noe som ikke er en korrekt måte å returnere -1 for manglende elementer.

📝 Oppgave 23: Skriv en funksjon som returnerer den lengste strengen i en liste

Riktig svar: 1️⃣

def lengste_streng(liste):
    return max(liste, key=len)

Hvorfor riktig: max() kan bruke en nøkkelparameter (her key=len) for å finne den lengste strengen basert på lengde.

Hvorfor de andre er feil:

  • 2️⃣: max(liste) vil returnere den alfabetisk siste strengen, ikke nødvendigvis den lengste.
  • 3️⃣: for streng in liste: if len(streng) > 5: return streng vil returnere den første strengen som er lengre enn 5 tegn, men det garanterer ikke at den er den lengste.

📝 Oppgave 24: Skriv en funksjon som teller antall vokaler i en streng

Riktig svar: 1️⃣

def tell_vokaler(tekst):
    vokaler = "aeiou"
    return sum(1 for bokstav in tekst if bokstav.lower() in vokaler)

Hvorfor riktig: Denne løsningen teller hvor mange av tegnene i strengen som er vokaler (inkludert store bokstaver, ved å bruke lower()), ved å bruke en list comprehension med sum().

Hvorfor de andre er feil:

  • 2️⃣: vokaler = "aeiou" mangler funksjonen lower() for å håndtere store bokstaver. Dessuten returneres kun et delresultat, fordi bare små bokstaver blir tatt med.
  • 3️⃣: Denne løsningen teller bare "a", "e", og "i", og ignorerer de andre vokalene.

📝 Oppgave 25: Skriv en funksjon som fjerner alle mellomrom fra en streng

Riktig svar: 1️⃣

def fjern_mellomrom(tekst):
    return tekst.replace(" ", "")

Hvorfor riktig: replace() erstatter alle forekomster av mellomrom med en tom streng, noe som effektivt fjerner alle mellomrom fra strengen.

Hvorfor de andre er feil:

  • 2️⃣: tekst.strip() fjerner bare mellomrom fra starten og slutten av strengen, men ikke fra midten.
  • 3️⃣: return tekst[1:-1] vil fjerne det første og siste tegnet i strengen, uavhengig av om de er mellomrom eller ikke.

📝 Oppgave 26: Skriv en funksjon som returnerer et nytt sett med felles elementer fra to lister

Riktig svar: 1️⃣

def felles_elementer(liste1, liste2):
    return set(liste1).intersection(liste2)

Hvorfor riktig: intersection() returnerer elementer som finnes i begge sett. Dette er en effektiv måte å finne felles elementer på.

Hvorfor de andre er feil:

  • 2️⃣: list(set(liste1) + set(liste2)) vil legge sammen begge listene og konvertere dem til et sett, men det gir ikke bare felles elementer.
  • 3️⃣: Denne løsningen vil fungere, men den returnerer en liste, ikke et sett som oppgaven spør om.

📝 Oppgave 27: Skriv en funksjon som konverterer en liste med strenger til store bokstaver

Riktig svar: 1️⃣

def til_store_bokstaver(liste):
    return [streng.upper() for streng in liste]

Hvorfor riktig: Denne løsningen bruker list comprehension til å iterere gjennom hver streng i listen og konverterer hver streng til store bokstaver med upper().

Hvorfor de andre er feil:

  • 2️⃣: liste.upper() prøver å bruke upper() på hele listen, noe som ikke er tillatt, fordi upper() kun kan brukes på strenger, ikke på lister.
  • 3️⃣: liste.capitalize() vil prøve å kapitalisere hele listen, som er ugyldig syntaks. capitalize() brukes på strenger, ikke på lister.

📝 Oppgave 28: Skriv en funksjon som finner det nest største tallet i en liste

Riktig svar: 1️⃣

def nest_storste(liste):
    liste.sort()
    return liste[-2]

Hvorfor riktig: Etter å ha sortert listen, vil det nest største tallet være det nest siste elementet, som kan hentes med liste[-2].

Hvorfor de andre er feil:

  • 2️⃣: Denne løsningen vil returnere det nest minste tallet fordi den henter elementet på indeks 1, som er det andre minste etter sortering.
  • 3️⃣: max(liste) returnerer det største tallet, ikke det nest største.

📝 Oppgave 29: Skriv en funksjon som bytter verdiene til to variabler

Riktig svar: 1️⃣

def bytt_verdier(a, b):
    a, b = b, a
    return a, b

Hvorfor riktig: Denne løsningen bruker en Python-spesifikk funksjon for å bytte verdier mellom to variabler uten en midlertidig variabel. a, b = b, a er den mest effektive måten å bytte verdier på i Python.

Hvorfor de andre er feil:

  • 2️⃣: Denne løsningen setter begge variablene lik b, noe som betyr at de ender opp med samme verdi.
  • 3️⃣: Denne løsningen bytter riktignok verdiene ved hjelp av en midlertidig variabel, men returnerer bare midlertidig variabel i stedet for både a og b.

📝 Oppgave 30: Skriv en funksjon som returnerer summen av n første tall (rekursjon)

Riktig svar: 1️⃣

def sum_n_tall(n):
    if n == 0:
        return 0
    else:
        return n + sum_n_tall(n-1)

Hvorfor riktig: Dette er en korrekt rekursiv løsning som summerer de første n tallene. Den stopper når n == 0 (base case), og ellers returnerer den summen av n pluss summen av alle tall før n.

Hvorfor de andre er feil:

  • 2️⃣: n + sum_n_tall(n+1) vil føre til en uendelig løkke fordi n øker ved hvert kall i stedet for å reduseres, slik det skal.
  • 3️⃣: n * sum_n_tall(n-1) vil multiplisere i stedet for å summere tallene.

Oppsummering for oppgaver 21–30

Her har vi gått gjennom de neste 10 oppgavene (21–30) med fokus på detaljert forklaring av hvorfor én løsning er riktig og de andre feil eller delvis riktige. Jeg har også fremhevet bruk av viktige Python-konsepter som list comprehensions, rekursjon, og sett-operasjoner, som er sentrale temaer i PCEP-sertifiseringen.