Till detta moment finns en sida med lösningsförslag och videoklipp.
Den tidigare versionen av moment02, hittar du här.
I detta moment kommer vi börja arbeta med grunderna i Python. Du får lära dig att skriva ut text på skärmen, kommentera din kod, använda speciella tecken i utskrifter (så kallade escapetecken), skapa variabler och arbeta med olika datatyper. Vi avslutar med att titta på olika sätt att skriva ut text tillsammans med variabler. Målet är att du ska förstå hur man bygger upp de enklaste programmen och hur datorn tolkar din kod.
2.1 Introduktion
I detta avsnitt bekantar vi oss med våra allra första Python-program. Vi börjar med att skriva ut text på skärmen och lär oss sedan använda några specialtecken för att formatera utskriften.
2.1.1 Första programmet
Ett datorprogram består av instruktioner som datorn följer steg för steg. Vi börjar med det enklaste programmet: att skriva ut en text på skärmen.
Kodexempel: utskrift
print("Hello World")
Utskrift
Hello World
print() är en funktion som används för att skriva ut information. Allt inom parentesen skrivs ut på skärmen.
Text i Python kallas för en sträng och markeras med citattecken ("..." eller '...'). Så print('Hello World') kommer ge samma utskrift.
2.1.2 Escapetecken
Ibland vill vi skriva ut specialtecken eller formatera texten på ett speciellt sätt. Då använder vi escapetecken. Några vanliga är:
\n = radbrytning
\t = tab (indrag)
\\ = ett omvänt snedstreck (backslash)
\" = citattecken
Kodexempel: escapetecken
print("Hej\nVärlden") # Skriver ut på två rader
print("En\tTvå\tTre") # Tabbar mellan orden
print("C:\\Users\\Anna") # Skriv ut sökvägar
print("Hon sa: \"Hej!\"") # Skriver ut text med citattecken
Utskrift
Hej
Världen
En Två Tre
C:\Users\Anna
Hon sa: "Hej!"
Övning 1
Skapa ett program som skriver ut följande saker;
Skriv ut ditt namn.
Skriv ut orden "Ett", "två" och "tre" på tre rader med hjälp av en print() och \n.
Skriv ut en tom rad. Det har jag inte visat, så fundera lite själv hur det kan göras.
Skriv ut en mening om en känd person som har ett smeknamn. Använd citattecken i meningen. Exempel: Peter "Foppa" Forsberg var en duktig hockeyspelare.
2.2 Kommentarer
När du programmerar är det bra att skriva kommentarer som förklarar vad koden gör. Kommentarerna körs inte av datorn, de är bara till för oss människor.
Kodexempel: kommentarer
# Detta är en kommentar
print("Hej") # Denna rad skriver ut texten Hej
"""
Detta är en flerradig kommentar.
Den kan användas för längre förklaringar.
"""
# gör resten av raden till en kommentar.
""" ... """ kan användas för att skriva längre förklaringar på flera rader.
Hur mycket kommentarer behöver du skriva i din kod? Grundtanken är att kommentarer skall hjälpa dig och andra att förstå koden. Att skriva en kommentar för varje rad som utför något enkelt kommando gör att koden snabbt blir överkommenterad. Jag brukar ha två saker som riktmärke för kommentarer:
Kommentera de delar som är nya och som du tränar på i just detta momentet.
Om du av någon anledning inte kodade en rad på tre månader och fick se en gammal kod du har skrivit, då skall den vara så välkommenterad så att du själv direkt förstår, och kommer ihåg, vad koden gör och hur du skall rätta den ifall det behöver göras.
Allt eftersom du blir duktigare på att koda så kommer det bli naturligt för dig hur mycket du skall kommentera. Håller du dig till de två riktlinjerna ovan så kommer du och de som ser din kod få den hjälp som ni behöver.
Övning 2
Gå tillbaka till den kod du skrev i övning 1 och:
Lägg till en kommentar överst i programmet där du skriver ditt namn.
Kommentera varje rad i programmet så att du själv förstår vad som händer.
Uppblandat med övningar kommer ibland lite större uppgifter där du får möjlighet att visa att du behärskar de delar som du precis har arbetat med. Denna första övningen behandlar utskrifter, kommentarer och escapetecken.
Uppgift: m02u01
Skapa programkoden som skapar följande utskrift.
Utskrift
Jag heter <mitt namn> och jag läser programmering på Alströmergymnasiet.
Jag tycker att det verkar "kul" med programmering.
Dessa tre rader
har jag skrivit med
en enda print().
Följande saker har jag kommenterat i min kod:
* Hur jag skrev ut dubbelfnuttarna på andra raden
* Hur jag kunde skriva ut tre rader med en print().
* Hur jag använde mig av tab, för att göra denna listan.
Saker att notera
<ditt namn> skall bytas ut mot ditt för och efternamn.
Tabbarna i slutet av utskriften kan vara olika långa beroende på inställningar, men det är tabb och inte mellanslag som du skall använda.
Du får endast använda trippla dubbelfnuttar (""") när du skapar kodhuvudet (se nästa punkt), ingen annan gång i denna uppgiften.
Innan du är klar så skapar du ett kommentarsblock längst upp i filen och där skriver du ditt namn, din klass, vilken uppgift det är du har löst och gärna ett datum då du blev färdig. Ta för vana att skapa detta huvud för varje uppgift, det måste du ha när du senare lämnar in en uppgift och då skall du dessutom skriva en kort utvärdering av uppgiften.
Uppgifter av denna typen skall inte lämnas in. När du är färdig så kika gärna i mitt hjälpavsnitt och jämför din lösning med min och reflektera över likheter och eventuella skillnader. Det viktigaste när vi programmerar är att vi skaffar oss flera olika verktyg som vi sedan kan använda när vi löser våra uppgifter.
2.3 Variabler
En variabel fungerar som en låda där vi sparar information. Varje gång vi vill använda informationen kan vi hämta den från variabeln.
Kodexempel: variabler
namn = "Anna" # en sträng
ålder = 16 # ett heltal (int)
längd = 1.72 # ett decimaltal (float)
2.3.1 Namngivningskonventioner
För att skriva kod som är lätt att förstå och underhålla behöver vi följa vissa regler och riktlinjer när vi väljer namn på våra variabler.
Variabelnamn får inte börja med en siffra eller innehålla mellanslag.
Tillåtna tecken är bokstäver (a–ö, A–Ö), siffror (0–9) och underscore _.
Bra namn beskriver vad variabeln innehåller: omkrets är bättre än o, ålder är bättre än a.
I Python är det rekommenderade sättet att använda snake_case: mitt_variabelnamn.
Andra varianter du kan se: camelCase och PascalCase. Även kebab-case används inom vissa programmeringsspråk men det är ej godkänt i Python. Oavsett vilken modell som används så är det viktigaste att vara konsekvent.
Välj också konsekvent språk: blanda inte engelska och svenska i samma program.
I Python kan du använda svenska tecken som å, ä och ö i variabelnamn. Det fungerar, men i många andra programmeringsspråk är det inte tillåtet. Därför är det ofta enklare och mer framtidssäkert att hålla sig till engelska variabelnamn. I praktiken blir det oftast enklast att använda engelska namn – då matchar variabelnamn bättre mot dokumentation, bibliotek och exempel ni hittar online. Det blir också lättare att få hjälp av fler om du kodar på ett sätt som fler förstår.
Använd inte namn som redan finns i Python (t.ex. list, str, sum, input, print) – det kallas att skugga inbyggda namn och leder lätt till svårtolkade fel. Välj hellre egna, beskrivande namn.
Om ett värde inte ska ändras i programmet kan du markera det som konstant genom att skriva med versaler, t.ex. MAX_SPEED = 120.
Övning 3
Skapa variabler med bra namn för: en persons namn, födelseår och nuvarande ålder.
Skriv ut variablernas värde med print().
2.4 Datatyper
Python använder olika datatyper beroende på vilken sorts information som lagras. En styrka i Python är att datatyperna är dynamiska: du behöver inte tala om i förväg vilken typ det ska vara, Python håller reda på det åt dig.
Fördelar: enkelt att skriva kod snabbt.
Nackdelar: lättare att göra misstag, t.ex. försöka räkna ihop text och tal.
2.4.1 Vanliga datatyper i Python
Det finns många olika inbyggda datatyper i Python, men vi börjar med de allra vanligaste och lägger till fler senare i kursen.
Datatyp
Förklaring
Exempel
str
Textsträng
namn = "Anna"
int
Heltal
ålder = 16
float
Decimaltal
pi = 3.14
bool
Sanningsvärde
klar = True
Varför spelar datatyper roll?
Operatorn + adderar tal, men konkatenerar text: 2 + 2 blir 4, medan "2" + "2" blir "22".
Operatorn * multiplicerar tal och text: 3 * 2 blir 6, medan 3 * "2" blir "222".
Blandar du text och tal utan konvertering får du fel, t.ex. print("Ålder: " + 16) → TypeError.
Kodexempel: type()
# Vanlig fallgrop: blanda text och tal
age = 16 # int
print("Ålder: " + str(age)) # OK
print("Ålder: " + age) # TypeError: can only concatenate str (not "int") to str
2.4.2 type() – kolla datatypen
Ibland är det viktigt att veta vilken datatyp en viss variabel innehåller. Med funktionen type() kan vi kontrollera datatypen. Detta kan till exempel vara användbart när du försöker räkna ihop tal och text av misstag – Python behöver veta om du menar siffror eller strängar.
Kodexempel: type()
namn = "Anna"
print(type(namn)) #
ålder = 16
print(type(ålder)) #
pi = 3.14
print(type(pi)) #
pi = "3.14"
print(type(pi)) #
Övning 4
Skapa variabler med bra namn för: en persons namn, ålder och favoritfärg.
Skriv ut variablernas värde med print().
Skriv sedan ut de olika variablernas datatyp på lämpligt sätt.
2.5 Aritmetik
Python kan användas som en miniräknare. Med variabler och datatyper blir det möjligt att räkna på olika sätt.
2.5.1 Vanliga operatorer
+ addition
- subtraktion
* multiplikation
/ division (ger alltid ett decimaltal)
// heltalsdivision (avrundar nedåt)
% modulo (resten vid division)
** upphöjt till
Ett viktigt begrepp när vi räknar i Python är prioritet mellan operatorer. Python följer samma regler som i matematiken: multiplikation och division görs före addition och subtraktion. Vill du vara säker på ordningen kan du alltid använda parenteser.
Vi kan också kombinera operatorer med tilldelning:
Kodexempel: operatorer med tilldelning
a = 10
a += 2 # a = a + 2
print(a) # 12
Andra varianter: -=, *=, /=, //=, %=, **= fungerar på samma sätt.
Övning 5
Skapa två variabler med heltal och räkna ut summan, skillnaden, produkten och kvoten.
Testa att använda // och % för att förstå skillnaden.
Skapa en variabel pi = 3.14 och räkna ut arean på en cirkel med radien 5. (formel: area = pi * r ** 2)
Uppgift: m02u02
Skapa fyra variabler, ge dem följande namn och värde;
a får värdet 9
b får värdet 2
f får värdet "4 komma 0"
namn tilldelas <ditt namn>
Beräkna a multiplicerat med b, skriv ut svaret och sedan datatypen.
Beräkna a multiplicerat med f, skriv ut svaret och sedan datatypen.
Beräkna a dividerat med b, skriv ut svaret och datatypen. Skriv en kommentar varför du tror att datatypen blir den som den blir.
Skriv ut ditt namn och sedan datatypen.
Beräkna heltalsdivisionen mellan a och b, skriv ut svaret och sedan datatypen.
Beräkna resten mellan a och b, skriv ut svaret och sedan datatypen.
Kommentera uppgift 6 & 7, varför blir svaret och datatypen som den blir?
Beräkna roten ur a, skriv ut svaret och sedan datatypen.
Beräkna kvadraten av b, skriv ut svaret och sedan datatypen.
Beräkna kvadraten av f, skriv ut svaret och sedan datatypen.
Kommentera uppgift 9, 10 & 11, varför blir svaret och datatypen som den blir?
Addera slutligen b till a enligt det korta skrivsättet. Skriv sedan ut detta svar.
2.6 Utskrifter – olika sätt
Nu när vi har variabler kan vi kombinera dem med text på flera olika sätt. Du kommer stöta på flera varianter i guider på nätet, men vi fokuserar mest på f-strings eftersom de är enklast och mest flexibla.
Kodexempel: olika sätt att skriva ut variabler
namn = "Anna"
ålder = 16
# kommaseparerat – varje del separeras automatiskt med mellanslag
print(namn, "är", ålder, "år gammal.")
# konkatenering – sätter ihop textsträngar, allt måste vara strängar
print(namn + " är " + str(ålder) + " år gammal.")
# "öppen print" utan radbrytning (end="")
print(namn, "är ", end="")
print(ålder, "år gammal.")
# format-metoden – äldre men fortfarande fungerande sätt
print("{} är {} år gammal.".format(namn, ålder))
# f-string – modernt och tydligt sätt (rekommenderad metod)
print(f"{namn} är {ålder} år gammal.")
# bygga strängen i en variabel innan utskrift
text = f"{namn} är {ålder} år gammal."
print(text)
Alla sätten ovan fungerar, men de är olika smidiga:
, i print() är snabbt och enkelt men ger ofta extra mellanslag.
+ kan sätta ihop text, men fungerar bara om båda delarna är strängar.
Öppen print är användbar när vi bara vill skriva en del av en sträng just nu och fylla på med mer text alldeles strax. Särskilt användbart när det gäller selektioner och loopar, vilket vi kikar på i senare moment.
.format() används ibland i äldre exempel.
f-strings är den metod vi kommer använda mest eftersom de är tydliga och kraftfulla.
Bygga strängen i en variabel, väldigt användbart om vi i flera steg vill bygga på en variabel innan utskrift.
Varför f-string är att föredra i de flesta fall, med f-strings kan du:
Blanda text och variabler på ett läsbart sätt.
Styra formateringen, t.ex. antal decimaler.
Skriva kortare och tydligare kod.
Kodexempel: tydlighet med f-string
namn = "Anna"
ålder = 16
# Exempel på f-string med flera variabler och beräkning
print(f"{namn} är {ålder} år gammal och om 5 år är {ålder + 5}.")
Det blir direkt begripligt vad som kommer att skrivas ut.
Styra radslut och separator i print()
Som standard lägger print() ett mellanslag mellan varje värde och avslutar raden med en radbrytning. Med parametrarna sep (separator) och end (radslut) kan du själv styra både mellanrummet och vad som skrivs sist.
Kodexempel: end="" och sep=""
print("A", "B", "C", sep=" | ") # A | B | C
print("Hej", end="...") # Hej... (ingen radbrytning)
Övning 6
Skapa variabler för namn, ålder och längd.
Skriv ut en mening som innehåller alla tre uppgifter med hjälp av en f-string.
Testa att avrunda ett decimaltal till 2 decimaler med f-string.
2.6.1 Ytterligare formatering
Med f-strings kan vi också formatera tal. Här styr vi antal decimaler och ibland även fältbredd.
:.2f betyder: två decimaler (f = float, decimalformat).
:7.2f betyder: totalt 7 tecken brett fält, med två decimaler. Bra om flera tal ska visas under varandra.
:.0f betyder: inga decimaler (avrundas till heltal).
Kodexempel: Avrundning med f-strings
pi = 3.14159265359
print(f"Pi med två decimaler: {pi:.2f}") # 3.14
print(f"Pi utan decimaler: {pi:.0f}") # 3
print(f"Pi i ett fält med bredd 7: {pi:7.2f}") # ' 3.14'
2.6.2 Utskrift med formatering – två kolumner
Ibland vill vi skriva ut data snyggt i två kolumner. Ett tips är att man kan tilldela flera variabler på samma rad genom att använda kommatecken som avskiljare:
|Anna |Alingsås |1200000 kr|
| Bo | Ås | 24000 kr|
| Carl| Västra yttre skogen| 600000kr|
Uppgift: m02u03
I denna uppgift tränar du på att skapa variabler, göra beräkningar och presentera resultatet på ett tydligt sätt med utskrifter.
Scenario
Du handlar i en affär: 3 pennor kostar 4 kr/st och ett äpple väger 200 g. Äpplen kostar 19 kr/kg.
Krav (basnivå – f-string)
Skapa variabler för antal pennor, pris per penna, äpplets vikt i gram och äppelpris per kilo.
Beräkna delsummor: pennor_summa och äpple_summa (tänk på att 200 g = 0.2 kg).
Beräkna totalsumman.
Skriv ut exakt följande rad med en f-string och två decimaler på pengabelopp:
Utskrift
Jag handlade 3 pennor för 12kr och 1 äpple för 3.80kr vilket totalt blev 15.80kr.
Utökning (frivillig)
I en tidigare version av denna uppgiften så var uppgiften att jämföra de olika utskriftsvarianterna. Så lösningen på uppgiften, både i kod och filmad, innehåller alla varianter nedan, men start uppifrån och f-stringmetoden sist.
Testa att skriva ut samma rad med flera metoder och kommentera skillnader:
Kommaseparerat: print(a, b, c)
Konkatenering med + (kom ihåg str() vid tal)
Bygg strängen i en variabel innan utskrift
"Öppen print" utan radbrytning (end="")
.format()-metoden
Utökning (frivillig)
Börja skissa på hur ett kvitto skulle kunna se ut med en rad för varje vara och tydliga kolumner.
2.6.4 Reflektion på uppgiften
Troligtvis har du märkt att beräkningar av datatypen float kan ge lite slumpmässigt felaktiga utskrifter. När vi förväntar oss ett värde med två decimaler så blir istället svaret två korrekta decimaler följt av en mängd nollor innan det slutligen finns ett, som det verkar, slumpmässigt tal. För er som har läst en hel del matematik verkar ju detta helt ologiskt, men det finns naturligtvis en förklaring på detta fenomen. Vi skall kika på en film där orsaken behandlas.
Floating point numbers - Computerphile
Där har du förklaringen, du behöver inte kunna den utantill men du måste förhålla dig till den. I de uppgifter vi jobbar med i denna kursen så spelar det inte så stor roll om den 6:e, 8:e eller 10:e decimalen är lite felaktig men det kan vara viktigt i andra sammanhang. Det finns alltid lösningar om det måste vara exakt och det gås igenom i slutet av filmklippet.
2.7 Input
Hittills har vi bara använt färdiga variabler i våra program. Med funktionen input() kan vi låta användaren skriva in data när programmet körs.
Kodexempel: inmatning
# funktionen input skriver ut strängen och väntar sedan på en inmatning
namn = input("Ange ditt namn: ")
print(f"Hej {namn}")
Utskrift
Lägg märke till att alla inmatningar gör du i konsollen, alltså den delen där du ser hur själva programmet körs.
När du använder input() blir resultatet alltid en sträng (text), även om användaren skriver in siffror. Vill du räkna på värdet behöver du konvertera det till int eller float.
Kodexempel: inmatning av heltal
ålder = int(input("Hur gammal är du? "))
print(f"Om fem år är du {ålder + 5} år gammal.")
Kodexempel: inmatning av decimaltal
pris = float(input("Ange pris i kronor: "))
print(f"Priset är {pris:.2f} kr")
Övning 7
Fråga användaren efter namn och ålder.
Skriv ut en mening som presenterar personen och hur gammal hen är.
Beräkna och skriv ut hur gammal personen är om tio år.
Uppgift: m02u04
Du skall jobba vidare med uppgift m02u03 så att den blir mer användbar. Tidigare har du givit variablerna för antalet pennor och äpplen fasta värden i din kod, detta kallas att hårdkoda in värden. Nu skall du istället fråga användaren hur många äpplen och pennor hen vill köpa och ta emot de inmatningar som görs från konsollen.
Kommentera de delar som du ändrar i koden.
Tips
Innan du börjar med denna uppgiften så tar du en kopia av den gamla uppgiften så att du vidareutvecklar kopian och inte originalet. Att ha kvar en fungerande version är alltid att föredra, ibland tänker man så fel att det är enklare att börja om än att felsöka och backa.
Utbyggnad 1 (klicka för att visa uppgiften)
Du skall i påbyggnadsuppgiften också fråga efter priset / st för pennorna och priset / kg för äpplen. Istället för att fråga efter antalet äpple skall du fråga efter vikten på de äpplen du vill köpa. Skriv ut detta på lämpligt sätt.
Utbyggnad 2 (klicka för att visa uppgiften)
Nu vill vi att du dessutom skall skriva ut dina handlade varor som ett kvitto enligt exemplet nedan (eller annan lämplig utskrift).
Utskrift
Penna, 5st á 3kr 15.00 kr
Äpplen, 550g á 22.90 kr 12.60 kr
-----------------------------------
Summa 27.60 kr
Innan du är klar så vill jag att du reflekterar över vilka fel som kan uppstå i ditt program som inte är av typen körtidsfel (fel som kraschar programmet) utan av typen logiska fel. Vi skall prata mer om olika typer av fel senare i kursen.
2.8 Stränghantering i Python
Att kunna hantera strängar är en grundläggande färdighet inom programmering. Strängar används för att representera text, och i många program behöver vi bearbeta och analysera textdata. I detta avsnitt kommer vi att utforska varför stränghantering är viktigt, lära oss några viktiga funktioner i Python för att manipulera strängar, och avsluta med en uppgift där du får tillämpa dessa kunskaper.
2.8.1 Varför är stränghantering viktigt?
Interaktion med användaren: Många program tar emot inmatning från användaren i form av text. För att förstå och reagera på denna inmatning behöver vi kunna bearbeta strängar.
Datahantering: Mycket data lagras och överförs som text. För att extrahera information från denna data behöver vi kunna söka, dela upp och modifiera strängar.
Felhantering: Användare kan mata in oväntade eller felaktiga data. Genom att hantera strängar effektivt kan vi validera och sanera inmatningar för att förhindra fel i programmet.
2.8.2 Viktiga strängfunktioner i Python
Här är några grundläggande strängfunktioner och metoder i Python som är användbara att känna till:
Längd på en sträng med len(): Returnerar antalet tecken i strängen.
Kodexempel: len()
text = "Hej världen"
print(len(text)) # Output: 11
Åtkomst till tecken med index:
En sträng kan ses som en sekvens av tecken där varje tecken har en position, kallad index. Indexeringen börjar från 0 för det första tecknet, 1 för det andra, och så vidare. Man kan också använda negativa index för att räkna baklänges från slutet av strängen (-1 för sista tecknet, -2 för näst sista, osv).
Kodexempel: index
text = "Python"
print(text[0]) # Output: P (första tecknet)
print(text[1]) # Output: y (andra tecknet)
print(text[-1]) # Output: n (sista tecknet)
print(text[-2]) # Output: o (näst sista tecknet)
Ändra mellan versaler och gemener med str.lower(), str.upper(), str.capitalize(), str.title():
str.lower(): Konverterar alla bokstäver till små bokstäver.
str.upper(): Konverterar alla bokstäver till stora bokstäver.
str.capitalize(): Gör första bokstaven stor och resten små.
str.title(): Gör första bokstaven i varje ord stor och resten små.
Kodexempel: versaler och gemener
text = "heJ vÄrLdEn"
print(text.lower()) # Output: hej världen
print(text.upper()) # Output: HEJ VÄRLDEN
print(text.capitalize()) # Output: Hej världen
print(text.title()) # Output: Hej Världen
str.strip(): Tar bort inledande och avslutande blanksteg.
Kodexempel: strip()
text = " hej "
print(text.strip()) # Output: "hej"
print(text.lstrip()) # Output: "hej ", tar bort på vänster sida
print(text.rstrip()) # Output: " hej", tar bort på höger sida
str.replace(old, new): Ersätter en del av strängen med något annat.
Kodexempel: replace()
text = "Jag älskar programmering"
print(text.replace("älskar", "gillar")) # Output: Jag gillar programmering
str.find(substring): Söker efter en delsträng och returnerar dess startposition (index). Index börjar på 0. Hittas inget returneras -1.
Kodexempel: find()
text = "Hej världen"
position = text.find("världen")
print(position) # Output: 4
Observera
Strängar i Python är oföränderliga (eng. immutable).
Det betyder att en metod som .strip(), .replace() eller .lower()inte ändrar den ursprungliga strängen, utan returnerar en ny version.
Därför behöver du ofta skriva tillbaka resultatet, t.ex.:
Kodexempel: skriva tillbaka resultatet
text = text.strip()
Om du inte gör det kommer den ursprungliga variabeln att behålla sitt gamla värde.
2.8.3 Kedjade metoder (method chaining)
Det är vanligt att bearbeta text i flera steg på samma rad. I Python kan vi kedja metod-anrop: resultatet från en metod blir direkt underlag till nästa.
Exempel: normalisera ett ja/nej-svar
svar = input("Vill du köra igen (j/n)? ") # t.ex. " JA "
svar = svar.strip().upper() # "JA" – tar bort mellanslag + gör versaler
första_tecknet = svar[0] # "J"
print("Normerat svar:", första_tecknet) # -> "J"
# Allt i en rad (utan mellanvariabler):
första = input("Köra igen (j/n)? ").strip().lower()[0] # t.ex. "j" eller "n"
# Bara versal/gemen, utan att plocka ut första tecknet:
normerat = input("Svara ja/nej: ").strip().upper() # "JA", "NEJ", "J", "N"
Om du använder [0] så blir det fel om strängen är tom men det får vi leva med för tillfället, i nästa moment löser vi det problemet.
Nu när du har läst om några av de vanligaste strängmetoderna i Python är det dags att testa dem i praktiken.
Genom att experimentera med korta program blir det lättare att förstå hur metoder som len(),
.lower() och .strip() fungerar och när de är användbara.
Börja med att köra exemplen nedan och observera hur resultatet förändras beroende på vad du skriver in.
Övning 2.8a
Kopiera och kör programmet nedan. Testa olika inmatningar och skriv egna kommentarer som förklarar vad som händer.
Grundkod: Övning 2.8a
text = input("Skriv en kort mening: ")
print("Gemener:", text.lower())
print("Versaler:", text.upper())
print("Stor första bokstav:", text.capitalize())
print("Antal tecken:", len(text))
print("Text utan mellanslag i början/slutet:", text.strip())
Kör programmet och skriv olika meningar.
Prova med extra mellanslag och blandade stora/små bokstäver.
Lägg till kommentarer i koden som beskriver vad varje metod gör.
Lösningsförslag
text = input("Skriv en kort mening: ")
# Skriver ut texten med små bokstäver
print("Gemener:", text.lower())
# Skriver ut texten med stora bokstäver
print("Versaler:", text.upper())
# Gör första bokstaven stor och resten små
print("Stor första bokstav:", text.capitalize())
# Skriver ut antalet tecken i texten
print("Antal tecken:", len(text))
# Tar bort eventuella mellanslag i början och slutet
print("Text utan mellanslag i början/slutet:", text.strip())
2.8.4 Exempel: Bearbeta en mening
Låt oss använda några av dessa funktioner i ett sammanhang. Antag att vi har följande sträng:
Kodexempel: Mening att bearbeta
mening = " Hej och välkommen till programmeringskursen! "
Vi vill bearbeta denna sträng på flera sätt:
Ta bort extra blanksteg:
Kodexempel: strip()
mening = mening.strip()
print(mening) # Output: Hej och välkommen till programmeringskursen!
Konvertera till versaler:
Kodexempel: upper()
versaler = mening.upper()
print(versaler) # Output: HEJ OCH VÄLKOMMEN TILL PROGRAMMERINGSKURSEN!
Ersätta ord:
Kodexempel: replace()
ny_mening = mening.replace("programmeringskursen", "Python-kursen")
print(ny_mening) # Output: Hej och välkommen till Python-kursen!
Åtkomst till enskilda tecken:
Kodexempel: använda index
första_tecken = mening[0]
sista_tecken = mening[-1]
print(f"Första tecknet: '{första_tecken}', Sista tecknet: '{sista_tecken}'")
# Output: Första tecknet: 'H', Sista tecknet: '!'
Övning 2.8b
Bygg vidare på övning 2.8a eller skapa en helt ny lösning. I denna övning tränar du på att söka och ersätta text i en sträng.
Grundkod: Övning 2.8b
text = "Jag älskar programmering i Python"
# Hitta var ett ord börjar i texten
print("Position för ordet 'Python':", text.find("Python"))
# Ersätt ett ord med ett annat
print("Text efter ersättning:", text.replace("Python", "Java"))
Testa att söka efter ord som inte finns i texten. Vad returnerar find() då?
Testa att ersätta ordet älskar med något annat.
Skriv en egen mening och prova samma metoder.
Tips: Lägg till egna utskrifter med f-string för att visa resultatet på ett snyggt sätt.
Lösningsförslag
text = "Jag älskar programmering i Python"
# Hitta var ett ord börjar i texten
position = text.find("Python")
print("Position för ordet 'Python':", position)
# Testa att söka efter ett ord som inte finns
position = text.find("Java")
print("Position för ordet 'Java':", position) # -1 betyder att ordet inte hittades
# Ersätt ett ord med ett annat
ny_text = text.replace("älskar", "gillar")
print("Text efter ersättning:", ny_text)
# Eget exempel – byt språk
egen_mening = "Python är ett kraftfullt programmeringsspråk"
print("Egen mening:", egen_mening)
print("Ersatt språk:", egen_mening.replace("Python", "Java"))
# Extra: använd f-string för snyggare utskrift
print(f"'{text}' innehåller {len(text)} tecken.")
Nu har du fått testa flera vanliga strängmetoder och sett hur de kan användas för att analysera och ändra text.
I nästa uppgift ska du ta det ett steg vidare och kombinera flera av dessa metoder i ett och samma program.
Du kommer att arbeta med inmatad text, bearbeta den och presentera resultatet på ett tydligt sätt.
Uppgift: m02u05
Grunduppgift:
Skriv ett program som:
Tar emot en mening från användaren.
Tar bort eventuella inledande och avslutande blanksteg.
Räknar antalet tecken i meningen (efter att blanksteg tagits bort).
Skriver ut meningen med första bokstaven i varje ord versal (stor bokstav).
Exempel på körning:
Exempel på körning
Ange en mening: jag lär mig att programmera i python!
Antal tecken i meningen: 37
Meningen med stor bokstav i varje ord:
Jag Lär Mig Att Programmera I Python!
Tips för uppgiften:
Använd input() för att ta emot inmatning från användaren.
Använd str.lower() för att jämföra strängar oavsett om de är skrivna med stora eller små bokstäver.
Funktionen len() kan användas för att räkna antalet tecken.
Använd str.title() för att göra första bokstaven i varje ord stor.
Fördjupning
Utöka programmet så att det även:
Frågar användaren efter ett ord att ersätta och vilket nytt ord det ska ersättas med.
Ersätter alla förekomster av det angivna ordet med det nya ordet i meningen.
Skriver ut den nya meningen.
Exempel på körning:
Kodexempel: Exempel på körning
Ange en mening: Jag älskar att programmera. Att programmera är kul!
Ange ordet du vill ersätta: programmera
Ange det nya ordet: koda
Den nya meningen är:
Jag älskar att koda. Att koda är kul!
Uppgift: m02u06
Detta är en extrauppgift för dig som vill träna på flera strängmetoder samtidigt. Du ska skapa ett program som analyserar en e-postadress och skriver ut information om hur den är uppbyggd. Uppgiften är en lämplig förberedelse för det som kommer i nästa moment.
Instruktion
Skriv ett program som:
Läser in en e-postadress från användaren.
Räknar hur många @ som finns.
Tar reda på var @ finns i texten.
Kontrollerar om det finns en punkt (.) efter@
med email.find(".", at_index + 1). at_index är då det index där @ finns.
Skriver ut en liten rapport till användaren.
Exempel på körning
Ange e-post: test@example.com
E-postadress: test@example.com
Antal @: 1
@-tecknet finns på position: 4
Det finns en punkt efter @ på position: 12
2.8.5 Sammanfattning
Stränghantering är en viktig del av programmering som låter oss bearbeta och analysera textdata. Genom att behärska grundläggande strängfunktioner kan vi skapa mer interaktiva och robusta program. Uppgiften ovan ger dig möjlighet att öva på dessa färdigheter i praktiken.
2.9 Syntaxfel
Nu samlar vi ett praktiskt arbetssätt för att hitta och åtgärda de fel som ni troligen redan mött i momentet. Målet här är snabb förståelse: vilka fel är vanliga och hur löser du dem steg för steg. Vi fokuserar på de fel som dyker upp när man jobbar med utskrift, variabler, typer, aritmetik och inmatning.
2.9.1 Grundläggande felsökningsstrategi
Läs felmeddelandet noggrant. Det anger ofta feltyp och radnummer.
Titta på raden som anges. Kontrollera stavning, parenteser och citationstecken.
Sök efter närliggande fel. Ibland är problemet en rad innan den som pekas ut.
Använd PyCharms färgmarkering och körtips. De visar ofta problem direkt.
Testa små förändringar och kör ofta. Mindre ändringar gör det lättare att hitta orsaken.
2.9.2 Vanliga feltyper och exempel (som ni kan stöta på)
Här går jag igenom de vanligaste feltyperna, ofta är de utskrivna i samband med att felet visas.
2.9.2.1 SyntaxError
Orsak: fel i språkets struktur – t.ex. saknat citattecken, parentes eller kolon.
Åtgärd: läs raden, räkna parenteser och kontrollera citattecken.
2.9.2.2 NameError
Orsak: du försöker använda en variabel som inte är definierad (stavat fel eller deklarerad senare).
Kodexempel: NameError
print(namn) # NameError om 'namn' inte finns
namm = "Anna"
print(namm) # stavfel ger NameError om du skrev 'namn' tidigare
Åtgärd: kontrollera stavning och att variabeln skapats innan användning.
2.9.2.3. TypeError
Orsak: du använder en operation på en olämplig typ, t.ex. försöker lägga ihop str och int.
Kodexempel: TypeError
print("Ålder: " + 16) # TypeError: kan inte lägga ihop str och int
print("Ålder: " + str(16)) # Rätt – konvertera tal till str
Åtgärd: kontrollera typer med type() och konvertera med str(), int(), float().
2.9.2.4 ValueError
Orsak: felaktigt värde vid typkonvertering, t.ex. int("hej").
Kodexempel: ValueError
x = int("fem") # ValueError: invalid literal for int()
Åtgärd: se till att input är ett nummer innan konvertering, eller fånga felet (senare moment).
2.9.2.5 ZeroDivisionError
Orsak: division med noll.
Kodexempel: ZeroDivisionError
x = 10
y = 0
print(x / y) # ZeroDivisionError
Åtgärd: kontrollera att nämnaren inte är 0 innan division.
2.9.3 Felsökningsexempel – steg för steg
Kör koden och kopiera felmeddelandet. Läs vilken rad och vilken feltyp det är.
Öppna filen i PyCharm och titta på den angivna raden.
Om det är en SyntaxError, kontrollera: citattecken, parenteser, kolon (:) i block, och indentering.
Om det är en NameError, sök efter stavfel eller om variabeln deklarerats i en annan funktion/block.
Om det är en TypeError/ValueError, skriv ut type() för de inblandade variablerna för att se vad de innehåller.
Skriv små testutskrifter (t.ex. print(type(x))) för att isolera problemet.
2.9.4 Tips att ge eleverna när de fastnar
Kommentera ut delar av koden (#) för att isolera problemet.
Dela upp en svår rad i flera rader – enklare att hitta felet.
Läs feltexten högt – ibland blir det tydligare.
Jämför med ett fungerande exempel (kopiera en enkel version, kör, och bygg upp stegvis).
Uppgift: m02u07
Ta nedanstående kod och klistra in i en ny fil och lös sedan felen så att du får en fungerande applikation. Kommentera alla fel du hittar i koden och även lösningen som du genomför.
Vissa rader kan vara utan fel och några rader har flera fel. Du är klar när programmet går att köra.
Vill du ha tips på hur många fel det är så klicka här.
8 fel är inplanterade i koden. Men du behöver inte räkna alla fel, när programmet fungerar som det är tänkt så är du färdig med rättningen.
Kodexempel: Rätta felaktig kod
# Skriv en kommentar för varje fel du identifierar och löser.
# Beskriv vad som var fel och hur du har löst det.
exchange_rate dollar_to_sek = 8,82
print(Detta är ett program där vi kan växla mellan SEK & dollar)
1sek = input("Hur många SEK vill du växla till dollar: )
dollar = 1sek / exchange_rate_dollar_to_sek
print("Du ville växla {0} SEK vilket blir {1} dollar.".format(1sek, dollar)
Tips
Följande saker är bra att tänka på när du felsöker kod;
Lös ett problem i taget.
Kör din kod och försök leta efter det syntaxfel som meddelas i konsollen.
Du kommer oftast meddelas ett fel i taget, upprepa proceduren tills programmet fungerar som det var tänkt och alla fel är rättade.
Vill du provköra en del av programmet så kommentera bort den kod som du inte vill köra. Då kan du också välja att göra utskrifter av variablers innehåll för att se att det du tror händer verkligen händer.
2.10 Avrundning av momentet
Detta moment avslutas med två diagnoser som säkerställer att du har förstått grunderna:
En teoretisk diagnos i form av en quiz med 10 frågor på de viktigaste begreppen.
En praktisk diagnos där du får skriva kod och lösa en eller flera uppgifter med fokus på det du lärt dig i momentet.
Syftet är att både kontrollera dina kunskaper och ge dig en chans att öva på provliknande situationer.