Föreläsningsöversikt Fö 1.1 - 1.3¶
IntroduktionKursadminLinux och datorer- Python interaktivt och som skript
- Rättningsskriptet
- Programmeringskoncept
- Literaler och datatyper
- Satser och uttryck
- Programflöde — funktioner
- Strängar, listor och tupler
- Moduler
- Programflöde — villkor och sanningsuttryck
Scream if you want to go faster¶
Fallskärm: Korta videos om Python¶
- Inspelade av Jody Foo, som höll den här kursen fram till och med VT2023.
- https://liuonline.sharepoint.com/sites/Lisam_TDDE44_2026VT_SP/Lists/Pythonvideos
- Abelson and Sussman, Structure and Interpretation of Computer Programs aka The Wizard Book. (Kursbok fram till och med 2018 innan vi bytte undervisningsspråk till Python.)
Pattern of rules?¶
- Ett deklarativt perspektiv.
- Vi sätter upp en uppsättning regler som processen ska följa, och sedan lämnar vi upp till datorn att genomföra processen genom följa de reglerna.
- Lite som att sätta upp ett komplicerat ekvationssystem, och sedan låta datorn lösa det.
"Computer program, detailed plan or procedure for solving a problem with a computer; more specifically, an unambiguous, ordered sequence of computational instructions necessary to achieve such a solution. "
Ordered sequence of instructions?¶
- Ett imperativt perspektiv.
- Vi beskriver, steg för steg, de operationer som processen skall utföra för att genomföra processen.
- Lite som att skriva ett detaljerat recept som någon annan sedan får genomföra.
- (Om det ringer en klocka nu så är det nog för att du var på min föreläsning om datalogiskt tänkande och programmering i TFYY51 Ingenjörsprojekt i höstas.)
Oavsett deklarativt eller imperativt perspektiv behöver vi ett sätt att uttrycka reglerna eller instruktionerna.¶
Naturligt språk¶
Först gör [...], sedan gör [...], sedan [...]
eller
Lösningen skall ha egenskaperna att [...]
Notation för matematik och logik?¶
$$ A = \{1, 2, 3\}\\ B = \{3, 4, 5\}\\ A \cup B = \{x| x \in A \lor x \in B \} \\ A \cup B = C \\ $$Mer datornära kanske?¶

Vad är detta?¶
Programmeringsspråk som Python¶
sul = "ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"
slv = "aeiouyåäö"
slc = ""
for i, l in enumerate("ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"):
if l not in slv.upper():
slc = slc + l.lower()
print(slc)
bcdfghjklmnpqrstvwxz
Ni har testat kommandot python3 i LiUs Linux-miljö¶
- Interaktiv användning, eller REPL (read-eval-print-loop):
$ python3 - Exekvera ett helt skript:
$ python3 filnamn.py - Kombination:
$ python3 -i filnamn.py- Kör skriptet men istället för att återvända till skalet, stanna kvar i Pythons REPL efter att skriptet är färdigt. Allt i skriptet är nu tillgänglig här, t.ex. variabler som vi tilldelat och funktioner som vi definierat.
- Alternativ REPL med syntax highlight:
$ ipython3
Interaktiv användning med REPL¶
Starta en Python-REPL genom att skriva
python3i terminalen.Python ersätter skalprogrammet i terminalen.
Avsluta genom att trycka Ctrl-D eller genom att köra python-kommandot
exit().- Tekniskt sett så anropar vi funktionen
exitutan några argument
- Tekniskt sett så anropar vi funktionen
Bra för att experimentera, testa och felsöka.
Ha en REPL igång i ett terminalfönster eller en terminalpanel i VS Code för att prova saker.
Skriv och kör ett skript¶
- Starta en text-editor (t.ex. VSCode)
- Skriv Python-kod och spara i en fil med exempelvis namnet
hello.py. - Från terminalen, kör programtolken och skicka med sökvägen till textfilen med pythonkoden som argument genom att skriva
python3 hello.py
- All källkod som man vill spara bör ligga i ett skript.
Rättningsskriptet för Pythonuppgifter¶
- Ursprungligen utvecklat av min kollega (och idol), Jody Foo, och vidareutvecklat av mig, inspirerat av en tentabyggare som Jody också utvecklat.
- (Sa jag att Jody är min idol?)
- I terminalen:
- Navigera (med
cd) till katalogen där skriptet för kapitlet ni vill rätta finns. - Kör kommandot
$ /courses/TDDE44/kursmaterial/pyuppg/pytest.sh <kapitel> <kodfil> - Navigera (med
- Demonstration
Värden och litteraler¶
- När vi själva beräknar $1+1$ så vet vi att det är det numeriska värdet 1 som skall adderas till det numeriska värdet 1 och resultatet blir det numeriska värdet 2.
- För datorn är dock
1+1bara en serie tecken. 1är inget värde i sig det är bara hur vi signalerar till Python att det numeriska värdet 1 skall användas.- Den här typen av representationer kallas för litteraler (eng. literals).
- De är den "bokstavliga" beskrivningen av ett värde.
Datatyper¶
- Alla värden i Python har en datatyp.
- Ett värdes datatyp avgör vad vi kan göra med värdet och vad som händer när vi använder det i olika sammanhang.
- En litteral representerar alltså ett specifikt värde, som har en specifik datatyp.
- Vi kommer lära oss att känna igen typen av olika litteraler under de första labbarna, de vi sett hittills är
int— Heltal (eng. integer)float— Flyttal (eng. floating point number), det vanligaste sättet att representera decimaltal digitalt. (Ni kommer höra mycket mer om detta i TANA21/22 Beräkningsmatematik, tills dess kan ni tänka "decimaltal och ofta lite, lite fel")
Sidospår: Objekt och klasser¶
Ibland kommer ni höra objekt istället för värde eller klass istället för datatyp.
Vi kommer återvända till klasser och objekt längre fram i kursen men för tillfället kan vi betrakta dessa som synonymer till datatyp och värde.
Flyttal och heltal?¶
- Pythontolken kommer automatiskt se till att resultatet av att evaluera ett uttryck har rätt datatyp under vissa omständigheter.
- Ofta är det givet: Antag att $x, y \in \mathbb{Z}$, vi vet att
- $x+y \in \mathbb{Z}$
- $x-y \in \mathbb{Z}$
- $x \cdot y \in \mathbb{Z}$
- men vad gäller för $x/y$?
- Eftersom vi inte vet om kvoten mellan $x$ och $y$ är ett heltal kommer Pythontolken ta det säkra före det osäkra och värdet av en division är alltid ett flyttal.
- Detta kallas mer generellt för typinferens.
Uttryck och satser¶
- Sats (eng. statement): En "enhet" kod och den minsta beståndsdelen i ett program.
- Vissa satser är dock sammansatta och kan därför vara ganska stora.
- Uttryck (eng. expression): ett stycke kod som kan evalueras, dvs. beräknas till ett värde
- T.ex. en litteral,
1+1, ett funktionsanrop, etc.
- T.ex. en litteral,
- Alla uttryck är satser, men inte alla satser är uttryck.
- Vi kommer titta på många olika typer av satser och uttryck i den här kursen, men vi börjar med klassiska aritmetiska uttryck.
Fler aritmetiska operatorer?¶
- Potensoperatorn:
**- (Ett vanligt misstag är att använda hatt-operatorn
^som har helt annan betydelse i Python - bitwise XOR för den som kan sin digitalteknik.)
- (Ett vanligt misstag är att använda hatt-operatorn
- Golvdivision, division avrundat nedåt (eng. floor division):
//- (Kallas ofta felaktigt för heltalsdivision då det är ekvivalent med heltalsdivision för positiva heltal, men inte för negativa. Felaktigt beskriven i Skansholm.)
- Modulo, eller "restdivision":
%- Ekvivalent med resten vid en golvdivision.
Tilldelning, inte likhet¶
=-tecknet orsakar ofta förvirring för den som är van vid matematik.- I Python betyder
=-tecknet tilldelning.
answer = 42
- Utläses som tilldela variabeln answer värdet 42
- Mer generellt tilldela variabeln till vänster om
= värdet av uttrycket till höger om=
Variabel som en låda
-
answer = 42 - Vi kan tänka oss att en variabel är en låda.
- När vi gör tilldelningen ovan händer följande:
- Pythontolken skapar en låda och skriver namnet
answerpå framsidan, - och stoppar sedan värdet
42i lådan så att vi kan använda det igen.
- Pythontolken skapar en låda och skriver namnet
Ordningen spelar roll¶
- Vi kan inte vända på en tilldelning som vi kan göra med en matematisk likhet:
answer = 2
answer = answer + 42
print(answer)
44
print(answer = answer+1)
42 = answer
Cell In[7], line 1 42 = answer ^ SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?
Tilldelning är en sats¶
- Tilldelningsoperationen kan inte evalueras till värde i sig.
- Tilldelning är alltså inte ett uttryck.
- Repetition: Alla uttryck är satser, men inte alla satser är uttryck — tilldelning är en sådan sats.
En variabel är verkligen variabel¶
- Det är tillåtet att när som helst ändra värdet av en variabel i Python.
answer = 1.3
answer = 42
answer / 2
21.0
Programflöde¶
Källkoden exekveras rad för rad¶
- Vi kallar detta för programflöde.
- En rad i taget utförs.
- Inte alla rader gör något.
- Vissa rader gör flera saker, men det kommer vi till längre fram.
print("Första raden")
print("Tredje raden")
# print("Fjärde raden")
print("Femte raden")
...
print("Sjunde raden")
pass
print("Nionde raden")
Första raden Tredje raden Femte raden Sjunde raden Nionde raden
Olika sätt att inte göra något¶
- Blankrader
- Kommentarer
- Inleds med
#och allt efter det tecknet och till slutet av raden ignoreras av interpretatorn. - Används för att skriva anteckningar i koden.
- Inleds med
- Placeholders
- Skrivs för att indikera att ett visst stycke kod inte skrivits, eller implementerats, än (eller i kodexempel där irrelevanta detaljer utelämnats).
...: ett uttryck som inte gör någotpass: en sats som inte gör något
Styra programflöde¶
- Vissa konstruktioner kan styra programflödet, dvs. "hoppa till" något annat ställe i koden.
- Vi ska börjar med att titta på funktioner.
Matematisk funktion
- Definition: Låt $A$ och $B$ vara två mängder. En funktion $f$ från $A$ till $B$ är en relation mellan $A$ och $B$, som har egenskapen att för varje $x \in A$ finns precis ett $y \in B$ sådant att $(x, y) \in f$.
- Vi säger saker i stil med $f: A \rightarrow B$, $x \mapsto f(x)$, och om $(x, y) \in f$ så betyder det att $y = f(x)$.
Vi kan också säga
Funktion i Python¶
- Namngivet stycke kod bestående av ett antal satser.
- Mer generellt än operatorer som
+. - Många funktioner finns inbyggda.
- T.ex.
printsom skriver ut något på skärmen
- T.ex.
- Vi anropar en funktion genom att skriva dess namn följt av parenteser.
- Inom parenteserna kan vi ofta skriva argument, värden som vi vill att funktionen skall använda.
- I funktionsanropet
print(1+1)är uttrycket1+1ett argument till funktionenprint.
- Används till alla möjliga saker, och ni kommer under kursen skriva mängder av egna funktioner (minst en för varje pythonuppgift).
Funktionsdefinition, skapar en ny funktion¶
def my_first_function(an_argument):
variable = an_argument + 2
return variable
print(my_first_function(1))
3
- Nyckelordet
definleder definitionssatsen. - Följs av namnet på funktionen vi definierar (
my_first_function). - Efter det kommer eventuellt en sekvens av parametrar inom parentes (
an_argumenti vårt fall).- Parametrarna är de namn som argumentvärdena kommer ha inne i funktionskroppen.
- Sist kommer ett
:-tecken, som indikerar att det som följer är ett kodblock. - Kodblocket skrivs med 4 mellanslags indentering och kallas för funktionens kropp.
- Kroppen kan bestå av många rader, men här har vi bara en, och den gör ingenting.
Funktionsanrop¶
- En typ av uttryck, då de kan evalueras till någon form av värde.
- Jmf. $f(x)=x^2$, att evaluera $f(a)$ är att beräkna värdet av funktionen i punkten $a$.
- Funktionen
lentar ett objekt som kan sägas ha en längd, t.ex. en sträng eller en lista, och returnerar den längden. - Vi anropar en funktion genom att skriva dess namn följt av parenteser. Mellan parenteserna skriver vi eventuella argument till funktionen.
- Dvs. när funktionsanropet
len(s)evalueras så kommer resultatet vara längden av strängens.
the_length = len('hej')
print(the_length)
3
the_value_of_a_print = print('hej')
print(the_value_of_a_print)
hej None
Exekvering av funktionsanrop¶
- Programflödet flyttar till funktionen.
- Satserna i funktionen exekveras, rad för rad, precis som vanligt.
- Funktionen avslutas och returnerar något värde. (Vi kan se det på samma sätt som att
1+1evalueras till värdet 2.) - Programflödet återvänder till direkt efter funktionsanropet.
print(1)
print(my_first_function(2))
print(3)
1 4 3
Några viktiga inbyggda funktioner¶
str— omvandlar ett objekt till en strängint— omvandlar ett objekt till ett heltalround— avrundar ett talabs— ger beloppet av ett talmin— ger det minsta värdet av två talmax— ger det största värdet av två talsum— ger summan av en samling
Definiera nya funktioner¶
- Vi definierar (skapar) egna funktioner för att
- använda samma kod flera gånger
- dela upp ett problem i mindre delproblem
- göra kod lättare att läsa
- Namngivning av funktioner
- använd namn som beskriver vad de gör
- använd verb-liknande namn
- Exempel:
calculate_average,get_number_of_votes
