TDDE44 Programmering, grundkurs¶

Föreläsning 1.2¶

Johan Falkenjack, johan.falkenjack@liu.se¶

Föreläsningsöversikt Fö 1.1 - 1.3¶

  • Introduktion
  • Kursadmin
  • Linux 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¶

  • Idag kommer det vara mycket terminologi, en del teori, extremt överdriven noggranhet blandat med överslätande ungefärliga beskrivningar.
    • Målet är att ni ska tänka "Vänta lite, svamlade inte Johan nåt om det där på föreläsningen?" när ni fastnar på en Pythonuppgift.
  • Det här är sjätte gången jag håller den här föreläsningen.
    • Och första gången jag inte gjort om den helt från grunden.
  • Blandningen är baserad på feedback från tidigare studenter kring vad som är lätt, vad som är svårt, vad som är tillräckligt tydligt, och vad som kan få vara lite otydligt.

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
SICP_cover.jpg
"We are about to study the idea of a computational process. Computational processes are abstract beings that inhabit computers. As they evolve, processes manipulate other abstract things called data. The evolution of a process is directed by a pattern of rules called a program. People create programs to direct processes. In effect, we conjure the spirits of the computer with our spells."

- 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. "

- Encyclopædia Britannica

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 [...]

  • Otympligt och sällan garanterat konsekvent. Alla har vi något olika tolkningar och idéer om vad ett påstående betyder, och om vi har hundra påståenden lär det vara omöjligt att hitta två personer i världen som är helt överens.

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 \\ $$
$$ C = \{1, 2, 3, 4, 5\} $$
  • Jätteexakt, men sällan lättläst och ofta svårt att formulera processer i ren matematik.

Mer datornära kanske?¶

By United States. Dept. of the Air Force - Operation and Maintenance of Diesel-electric Locomotives, Public Domain, Link
  • Någon som gjorde sitt Ingenjörsprojekt i LabVIEW? Inte helt olikt kopplingsscheman (schematan).

Noter¶

By en:User:Prof.rick - author's "own edition and arrangement", Public Domain, Link

Någon som känner igen?¶

By WillowW - Own work, CC BY 3.0, Link

Noter, fast för?¶

By Huster - Own work, Public Domain, Link

Vad är detta?¶

Knitting-pattern-charts-tutorial-779f598.webp

Sista jämförelsen (jag lovar)¶


↑↑↓↓←→←→BA¶

Programmeringsspråk som Python¶

In [3]:
sul = "ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"
slv = "aeiouyåäö"
slc = ""
for i, l in enumerate("ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"):
    if l not in slv.upper():
        slc = slc + l.lower()

print(slc)
bcdfghjklmnpqrstvwxz
  • Verkligen jättedumma variabelnamn, gör inte så här.
    • sul = Swedish Uppercase Letters
    • slv = Swedish Lowercase Vowels
    • slc = Swedish Lowercase Consonants

Statuskontroll¶

mentimeter_qr_code_status_post_le1.png

Alternativt menti.com och använd koden 3466 0165.

Ni har testat kommandot python3 i LiUs Linux-miljö¶

  1. Interaktiv användning, eller REPL (read-eval-print-loop): $ python3
  2. Exekvera ett helt skript: $ python3 filnamn.py
  3. 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.
  4. Alternativ REPL med syntax highlight: $ ipython3
  • Side note: Vi skriver python3 för att på LiUs system så fanns länge en del gamla grejer som förutsatte att python pekade på Python 2.x. Dessa ska nu vara helt konverterade till Python 3, men under en övergångsperiod existerar inte kommandot python alls för att upptäcka eventuella missade program som fortfarande försöker använda Python 2.x.

Interaktiv användning med REPL¶

  • Starta en Python-REPL genom att skriva python3 i 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 exit utan några argument
  • 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¶

  1. Starta en text-editor (t.ex. VSCode)
  2. Skriv Python-kod och spara i en fil med exempelvis namnet hello.py.
  3. 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:
    1. Navigera (med cd) till katalogen där skriptet för kapitlet ni vill rätta finns.
    2. Kör kommandot
    $ /courses/TDDE44/kursmaterial/pyuppg/pytest.sh <kapitel> <kodfil>
  • Demonstration
  • Foo är för övrigt ett jättebra efternamn för en programmerare då foo är en så kallad "metasyntaktisk variabel". Dvs. en variabel vi använder för abstrakta exempel som visar hur något fungerar men inte är tänkt att lösa ett verkligt problem.

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+1 bara 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.
  • Det finns ingen dold klurighet här, men det är lätt att röra till det för sig själv och tro att det måste finnas det.
  • "They literally mean what they say."
  • Formellt sett kommer ordet från att det är den textuella (jmf. "literatur") representationen 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")
  • Datatyper avgör t.ex. vad +-operatorn gör. Visa för tal resp. strängar, resp. felet som uppstår när man blandar.

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.

  • I Python, till skillnad från vissa andra språk som t.ex. C/C++ eller Java, så är alla värden objekt.
  • Alla objekt tillhör en viss klass och alla datatyper i Python är formellt sett klasser.

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.
  • 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.
In [ ]:
1 + 1 # En sats och ett uttryck med värdet 2
a = 2 # En sats (tilldelningssats för att vara exakt)
b = 1 + 1 # En tilldelningssats där högerledet är ett 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.)
  • 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

variable_noreference.svg
  • 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 answer på framsidan,
    • och stoppar sedan värdet 42 i lådan så att vi kan använda det igen.

Ordningen spelar roll¶

  • Vi kan inte vända på en tilldelning som vi kan göra med en matematisk likhet:
In [6]:
answer = 2
answer = answer + 42
print(answer)
44
In [ ]:
print(answer = answer+1)
In [7]:
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.
In [ ]:
answer = 1.3
In [10]:
answer = 42
answer / 2
Out[10]:
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.
In [11]:
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.
  • 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ågot
    • pass: 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

square_function_xy.svg
$f: A \rightarrow B$
  • 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

No description has been provided for this image

Funktion i Python¶

  • Namngivet stycke kod bestående av ett antal satser.
  • Mer generellt än operatorer som +.
  • Många funktioner finns inbyggda.
    • T.ex. print som skriver ut något på skärmen
  • 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 uttrycket 1+1 ett argument till funktionen print.
  • 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¶

In [19]:
def my_first_function(an_argument):
    variable = an_argument + 2
    return variable

print(my_first_function(1))
3
  • Nyckelordet def inleder definitionssatsen.
  • Följs av namnet på funktionen vi definierar (my_first_function).
  • Efter det kommer eventuellt en sekvens av parametrar inom parentes (an_argument i 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 len tar 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ängen s.
In [24]:
the_length = len('hej')
print(the_length)
3
In [25]:
the_value_of_a_print = print('hej')
print(the_value_of_a_print)
hej
None

Exekvering av funktionsanrop¶

  1. Programflödet flyttar till funktionen.
  2. Satserna i funktionen exekveras, rad för rad, precis som vanligt.
  3. Funktionen avslutas och returnerar något värde. (Vi kan se det på samma sätt som att 1+1 evalueras till värdet 2.)
  4. Programflödet återvänder till direkt efter funktionsanropet.
In [22]:
print(1)
print(my_first_function(2))
print(3)
1
4
3
In [ ]:
def my_first_function(an_argument):
    print("Detta kommer skrivas ut innan värdet av an_argument returneras.")
    return an_argument

Några viktiga inbyggda funktioner¶

  • str — omvandlar ett objekt till en sträng
  • int — omvandlar ett objekt till ett heltal
  • round — avrundar ett tal
  • abs — ger beloppet av ett tal
  • min — ger det minsta värdet av två tal
  • max — ger det största värdet av två tal
  • sum — 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