Programmeringskanon
Programmeringskanon för 729G46
Den här sidan agerar kanon (som i religiös eller litterär kanon, inte en sådan man skjuter med) för vilka koncept som introduceras i respektive tema. Det är inte tillåtet för vare sig examinator, assistenter eller studenter att använda koncept utanför denna kanon eller längre fram i denna kanon än där användandet sker. Dvs. det är till exempel inte tillåtet att använda sig av loopar för att lösa uppgifter som tillhör Tema 1 eftersom dessa introduceras först under Tema 2, osv. Varje tema bygger dock vidare på vad som kommit tidigare och det är alltså självklart tillåtet att använda koncept från Tema 1 i Tema 2, och så vidare.
Denna begränsning är till för att stegvis utöka din konceptuella verktygslåda och dina språkkunskaper i Python. Detta har två huvudsakliga syften:
- Det begränsar mängden nya koncept du behöver lära dig för att angripa uppgifterna du ska lösa utan att bli allt för överväldigad. Det kommer vara väldigt mycket nytt ändå men detta begränsar “sökmängden” av möjliga saker du kan göra i de inledande delarna av kursen.
- Det tvingar dig att lösa problem med de verktyg du har till hands, och inte sträcka dig efter mer avancerade verktyg förrän du behärskar de mer grundläggande verktygen. Ingen spikpistol förrän du behärskar hammaren, så att säga.
Tema 1
Programflöde
- Ett python-program utförs rad för rad, uppifrån och ned.
- Funktionsanrop innebär ett hopp till funktionskroppen, som körs rad för rad, men vi återvänder sedan till samma plats i koden där funktionsanropet skedde, och funktionsanropet omvandlas till funktionens returvärde (substitution).
- Villkorssatsen
if
låter programmet välja en av flera olika vägar. Villkoren förif
och eventuellaelif
-klausuler testas uppifrån och ned, och den första klausulen vars villkor är sant kommer utföras, och inga andra. En eventuellelse
-klausul fångar de fall där inget villkor var sant. - Kommentarer inleds med
#
och ignoreras av programmet, används för förklaringar och minnesanteckningar i koden. (Nej, det är INTE hashtags.)
Värden, datatyper och literaler
Alla program bearbetar någon form av värden, och alla värden i Python måste ha en datatyp. Vi kan representera värden i vår kod som literaler, som är den “bokstavliga” representation av värdet.
Literaler kommer i texten på den här sidan alltid uttryckas i ett monospace
-typsnitt medan när jag refererar till motsvarande värde använder jag det vanliga typsnittet. Vi kan nästan alltid tänka på dessa som samma sak, men det är viktigt att komma ihåg att en literal bara är en textuell representation av det underliggande värdet. Ett sätt att säga till python att använda motsvarande värde.
- Heltal (integer) torde vara självförklarande.
2
är en heltalsliteral och representerar heltalet 2.
- Flyttal (floating point number) är det vanligaste sättet att representera decimaltal i en dator.
3.141592
är en flyttalsliteral och representerar en approximation av talet $\pi$.
- Sträng (string) är en typ av sekvens som används för att representera text, inklusive enskilda tecken (python har till skillnad från många andra programmeringsspråk ingen separat datatyp för enskilda tecken).
"hej"
och'tjenare'
är strängliteraler och vi kan använda antingen enkla eller dubbla citattecken, men vi måste välja samma tecken för en sträng ('tja"
är alltså inte en tillåten strängliteral). Notera att"2"
och'3.141592'
är strängar, inte tal, eftersom de omges av citattecken.
- Lista (list) är en typ av sekvens och en typ av samling som innehåller flera andra värden av vilken datatyp som helst.
- Hakparenteserna
[
och]
används för att skapa listliteraler och är speciella eftersom vi kan ha andra literaler mellan hakparenteserna.
- Hakparenteserna
True
ochFalse
är de två enda sanningsvärdesliteralerna. Notera att de inte är strängar och att de måste skrivas med versal i början.- Alla andra värden i python har ett motsvarande sanningsvärde, och det är nästan alltid sant. För datatyperna vi sett hittills är de enda undantagen heltalet 0 (motsv. literalen
0
), flyttalet 0 (motsv. literalen0.0
), tomma strängen (motsv. literalen''
eller""
) och tomma listan (motsv. literalen[]
).
- Alla andra värden i python har ett motsvarande sanningsvärde, och det är nästan alltid sant. För datatyperna vi sett hittills är de enda undantagen heltalet 0 (motsv. literalen
Variabler och tilldelning
Variabler kan ses som lådor i vilka vi lagt ett visst värde och de flesta värden vi bearbetar ligger oftast i sådana variabler. I verklig kod använder vi förhållandevis få literaler, utan vi jobbar oftast med variabler.
Vi “lägger ett värde i en låda” genom att använda tilldelningsoperatorn =
. Variabeln som tilldelas står alltid till vänster om =
-tecknet, och värdet som lagras i variabeln står till höger. Värdet kan representeras av literaler, andra variabler, eller uttryck.
|
|
Uttryck och substitution.
Ett uttryck är något som kan beräknas och omvandlas till ett värde. Vi kan tänka att när uttrycket beräknas så ersätts, substitueras, det av sitt värde. Uttrycket 1 + 1
kan t.ex. substitueras av värdet 2. Uttryck kan vara hur långa som helst och vi kan indikera ordningen av beräkningarna med vanliga parenteser, (
och )
, precis som i matematiken, och vi kan substituera sådana deluttryck “inifrån och ut”. T.ex. 10 - (7 - 3)
kan substitueras av 10 - 4
som i sin tur kan substitueras av 6
. En av de vanligaste typerna av uttryck i praktiken är funktionsanrop.
Funktioner
Funktionsdefinition, parametrar och returvärde:
|
|
Parametrar är en typ av variabler som tilldelas när funktionen anropas och som bara existerar inne i funktionskroppen.
Funktionsanrop och argument:
|
|
Först binds argumenten, argument1
och argument2
, till parametrarna parameter1
respektive parameter2
. Vi kan tänka på det som tilldelningar där parameter1 = argument1
osv. Själva argumentet kan vara vilket uttryck som helst, t.ex. en literal, en variabel, ett aritmetiskt uttryck eller till och med ett annat funktionsanrop.
Funktionskroppen utförs sedan uppifrån och ned, och vi kan tänka på det som att funktionsanropet omvandlas till funktionens returvärde.
Konstruktorer
Vi kan också skapa värden med hjälp av konstruktorer, som är en typ av funktioner.
Konstruktorn int
skapar ett nytt heltal och anropet int()
returnerar heltalet 0. Genom att skicka med ett argument kan vi skapa andra heltal. Vi kan skapa t.ex. heltalet 1 genom att skriva int(1)
, men eftersom heltalsliteralen 1
redan representerar heltalet 1 så skippar vi normalt sett konstruktorn i dessa fall. Mer relevant är att konvertera värden av andra datatyper till heltal. T.ex. int('5')
tar strängen som uttrycks av strängliteralen '5'
och returnerar heltalet 5.
Vi kan också konstruera:
- Flyttal med konstruktorn
float
float()
utan argument returnerar flyttalet 0, motsv. flyttalsliteralen0.0
.
- Strängar med
str
str()
utan argument returnerar den tomma strängen, motsv. flyttalsliteralerna''
och""
.
- Listor med
list
list()
utan argument returnerar den tomma listan, motsv. listliteralen[]
.
- Sanningsvärden med
bool()
bool()
utan argument returnerar falskt, motsv. sanningsvärdesliteralenFalse
Inte alla datatyper och värden kan konverteras hur som helst, och python kommer säga ifrån om vi försöker göra en förbjuden konvertering.
Operatorer
- Aritmetiska operatorer:
- De fyra räknesätten:
+
,-
,*
,/
- Fungerar som man förväntar sig för taltyper, bortsett från lite kluriga typkonverteringar som man ibland kan snubbla på. T.ex. är kvoten av två heltal alltid ett flyttal, även om divisionen “går jämt ut”,
4 / 2
blir alltså flyttalet 2.0. +
och*
kan också användas för konkatenering, sammanfogning, av sekvenser.
- Fungerar som man förväntar sig för taltyper, bortsett från lite kluriga typkonverteringar som man ibland kan snubbla på. T.ex. är kvoten av två heltal alltid ett flyttal, även om divisionen “går jämt ut”,
- Ytterligare tre räknesätt:
**
, potensoperatorn, dvs. “upphöjt till”.2**3
är alltså hur vi skriver $2^3$ i python.//
, “nedrundningsdivision”, ofta felaktigt kallat heltalsdivision (t.ex. av Skansholm) eftersom den beter sig som heltalsdivision för positiva värden. Fungerar som vanlig division avrundat nedåt och är ofta den första typen av division man lär sig i grundskolan innan man lär sig räkna med decimaler.14 // 4
blir alltså heltalet 3.%
, modulo eller resten vid en nedrundningsdivision,14 % 4
blir alltså heltalet 2.- Den matematiskt lagde kan tänka sig att
//
och%
förhåller sig till varandra enligt formelnb * (a // b) + a % b == a
.
- De fyra räknesätten:
- Jämförelseoperatorer:
==
,!=
,<
,<=
,>=
,>
==
, testar om två värden är lika!=
, testar om två värden är olika<
,<=
,>=
,>
, mindre än, mindre än eller lika med, större än eller lika med, och större än eller lika med- En jämförelse är alltid ett uttryck och beräknas alltid till, och kan substitueras av, ett sanningsvärde, sant eller falskt (motsv. literalerna
True
ochFalse
). - Fungerar mestadels som man tänker sig, men man kan behöva hålla tungan i rätt mun med datatyperna ibland, t.ex. är
1 == 1.0
sant, men1 == '1'
är falskt.
- Logiska operatorer:
or
,and
,not
- Opererar på andra sanningsvärden (dvs. på alla andra värden eftersom dessa kan tolkas som sanningsvärden) och beräknas alltid till, och kan substitueras av, ett sanningsvärde.
- Uttrycket
a or b
är sant om minst ett av värdena ia
ochb
är sant, annars falskt. - Uttrycket
a and b
är sant endast då bådea
ochb
innehåller sanna värden, annars falskt. - Uttrycket
not a
är sant dåa
är falskt och falskt dåa
är sant.
in
-operatorn kontrollerar om ett visst värde finns i en samling eller i en sekvens
Villkorssatser och klausuler
|
|
Själva villkoren kan vara vilka uttryck som helst eftersom alla värden i Python kan konverteras till, och alltså substitueras av, antingen sant eller falskt.
Specialfunktioner
Funktionen print
returnerar ingenting och substitueras därför bara av det speciella värdet None
som representerar just “inget värde” (som dock kan tolkas som sanningsvärdet falskt, eftersom alla värden kan tolkas som ett sanningsvärde, sista gången jag säger det, jag lovar). Funktionen print
används för att skriva ut något i terminalen medan programmet körs. Det är dock väldigt viktigt att inse att en sådan utskrift bara är till för programmeraren eller användaren, för python är en utskrift lika betydelselös som en kommentar.
Funktionen random.randint
, som vi får tillgång till genom att skriva import random
längst upp i filen eller i pythons interaktiva läge, används för att generera slumpade heltal. Anropet random.randint(0, 1)
kommer att returnera antingen heltalet 0 eller heltalet 1. Anropet random.randint(3, 6)
kommer att returnera något av heltalen 3, 4, 5 eller 6.
Tema 2
Rekursion, upprepning med funktionsanrop
Generell iteration med while
Iteratorer och sekvenser med for
Filer och kontexthanterare
Mängder och mängdoperationer
Strikt nästlade strukturer
Tema 3
Muterbarhet, föränderliga värden
Objekt och metoder
Namespaces och scope
Associationstabeller, dict
Godtyckligt nästlade strukturer och multirekursion
Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2025-07-01