TDDE44 Programmering, grundkurs
Föreläsning 2.1-2.2
Jody Foo, jody.foo@liu.se
Översikt FÖ 2.1-2.2
⁃ Kursadmin: Laboration 2 och jobba på egen dator
⁃ Programmeringsparadigm
⁃ Anropsstacken
⁃ Scope: lokala och globala variabler
⁃ Kontrollstrukturer
Villkorsatser: sanningsvärden, jämförelseoperatorer, logiska operatorer Loopar: while- och for-loopen
⁃ Felsökning
⁃ Introduktion till programabstraktion Dela upp ett problem i delproblem
Bygga upp ett program med hjälp av funktioner
⁃ Textbaserade filformat
⁃ Introduktion till att läsa från fil
Laboration 2
⁃ Del 1: Görs individuellt i LiUs Linuxmiljö (Pythonuppgifter 2)
⁃ Del 2: Autocomplete görs i par.
⁃ Del 3: Autocorrect (frivillig)
⁃ Extra lektion, tors 4 feb om man vill ha hjälp med att komma igång med Python och VSCode på egen dator.
⁃ Lektion 2, mån 8/2 - övningar om filläsning inför Del 2
Skriva kod tillsammans på distans: Två alternativ
⁃ Alternativ 1 (rekommenderas) - installera på egen dator:
Python 3 (minst en i gruppen)
Visual Studio Code + Live share (båda)
Fördelar: lättare för båda att vara aktiva och skriva kod.
Nackdelar: installation på egen dator behövs
⁃ Alternativ 2
En student loggar in via ThinLinc/RDP och delar skärm.
Fördelar: Inga extra installationer behövs.
Nackdelar: Endast en i gruppen kan skriva kod.
Programmera tillsammans på distans med Visual Studio Code
⁃ Installera Visual Studio Code och tillägget Live Share
⁃ Går ej att köra Live Share via ThinLinc.
⁃ https://www.ida.liu.se/~TDDE44/kursmaterial/vscode/
⁃ Båda autentisera genom att logga in med Microsoft-konto (liuid@student.liu.se) eller github-konto
⁃ Personen som har filerna
öppnar mappen med filerna (workspace) startar en session som host
⁃ Andra gruppmedlemmen ansluter via URL
Extra handledningstillfälle för installationer
Nu på torsdag, 4 februari kl. 10.15
Programmeringsparadigm
Vad handlar
programmeringsparadigm om?
⁃ Olika sätt att strukturera ett program
⁃ Olika programmeringsspråk har olika språk-konstruktioner som gör olika programmeringsparadigm tillgängliga
Programmeringsparadigm
⁃ Procedurell programmering
⁃ Objektorienterad programmering
⁃ Funktionell programmering
⁃ Logikprogrammering
Funktionell programmering
⁃ Ett program består av funktioner
⁃ Funktioner tar ett tillstånd som argument och returnerar ett annat tillstånd
⁃ När ett program körs kan vi se det som en flöde mellan olika tillstånd
⁃ Tillstånd ändras inte, varje tillstånd är ett nytt separat tillstånd
⁃ f : A → B
⁃ Exempel på renodlade funktionell språk:
LISP, Haskell, Clojure
Objektorienterad programmering
⁃ Ett alternativ till att använda funktioner för att strukturera kod: Objekt istället för abstrakt datatyp
⁃ Bättre sätt att organisera större projekt - återanvändning
⁃ Istället för ett flöde från ett tillstånd till ett annat manipuleras objekt som tillsammans representerar programmets nuvarande tillstånd
⁃ C++, Objective-C, C# och Java är exempel på OO programmeringsspråk
Programmeringsparadigm och Python
⁃ Funktionell programmering
⁃ Procedurell programmering
⁃ Objektorienterad programmering
Funktioner och scope
Tips: http://pythontutor.com/
Anropsstacken (eng. call
stack)
Programflöde - funktionsanrop
⁃ Ett pythonprogram tolkas sekvetiellt av pythontolken.
⁃ Vi tänker oss att vi har en körmarkör som pekar på vad det som ska utföras näst
⁃ När pythontolken ser ett funktionanrop görs följande 1. eventuella argument i funktionsanropet beräknas
2. eventuella argument skickas till den anropade funktionen
3. den anropade funktionens funktionskropp utförs sekventiellt - körmarkören flyttas till funktionskroppen
4. körmarkören flyttas tillbaka dit anropet påträffades och funktionens returvärde "ersätter" funktionsanropet
Anropsstacken (eng. call stack)
⁃ (denna förklaring är mer konceptuell än teknisk)
⁃ När en funktion, fn1, anropas:
en ny frame, FR1, som kommer att användas för att lagra lokala variabler.
⁃ FR1 läggs på anropsstacken.
⁃ Om vi anropar en annan funktion, fn2, från fn1
en ny frame, FR2, som kommer att användas för att lagra lokala variabler.
⁃ FR2 läggs på anropsstacken.
⁃ osv
FR1
Anropsstacken (eng. call stack)
⁃ (denna förklaring är mer konceptuell än teknisk)
⁃ När en funktion, fn1, anropas:
en ny frame, FR1, som kommer att användas för att lagra lokala variabler.
⁃ FR1 läggs på anropsstacken.
⁃ Om vi anropar en annan funktion, fn2, från fn1
en ny frame, FR2, som kommer att användas för att lagra lokala variabler.
⁃ FR2 läggs på anropsstacken.
⁃ osv
FR1 FR2
Anropsstacken (eng. call stack)
⁃ När fn2 är klar, tas FR2 bort från stacken och fn2 returnerar sitt värde
⁃ fn1 fortsätter från anropet till fn2 med returvärdet från fn2.
FR1
Demonstration
Sagan om pojken som inte ville gå till skolan
⁃ Det var en gång en pojke som var förfärligt lat. Han ville inte gå till skolan. Då gick mamman till riset och sa:
– Ris, slå pojken för pojken vill inte gå till skolan.
– Nej, sa riset.
⁃ Då gick mamman till elden och sa:
– Eld, bränn riset för riset vill inte slå pojken och pojken vill inte gå till skolan.
– Nej, sa elden.
⁃ Då gick mamman till vattnet och sa:
– Vatten, släck elden för elden vill inte bränna riset och riset vill inte slå pojken och pojken vill inte gå till skolan.
⁃ ...
Sagan om pojken som inte ville gå till skolan
⁃ ...
⁃ Då gick mamman till katten och sa:
– Katt, ta råttan för råttan vill inte gnaga av repet och repet vill inte hänga slaktaren och slaktaren vill inte slakta oxen och oxen vill inte dricka upp
vattnet och vattnet vill inte släcka elden och elden vill inte bränna riset och riset vill inte slå pojken och pojken vill inte gå till skolan.
– Nej, sa katten.
– Men om du får lite grädde då?
– Mja, då kan jag väl göra det.
⁃ Och så blev det katten på råttan, och råttan på repet, och repet på slaktaren, och slaktaren på oxen, och oxen på vattnet, och vattnet på elden, och elden på riset, och riset på pojken och pojken gick till skolan!
http://pythontutor.com
Programflöde - funktionsanrop och returvärden
def show_greeting(name):
print("Hello " + name + "!") def add_values(v1, v2):
return v1 + v2 friend = "Ada"
show_greeting(friend)
print("3 plus 4 är", add_values(3, 4)) print("Nu är programmet slut.")
Scope
⁃ Termen "scope" i programmering har att göra med i vilka kontexter saker är giltiga.
⁃ Ibland pratar man om olika frames där varje frame definierar ett scope.
⁃ Ett pythonprogram som körs har en global frame.
program1.py
# i detta program är a, b och c symboler som är definierade i det
# globala scopet a = 5
b = "hejsan"
def c(value1, value2):
return value1 + value2 a
b
c(5, 7)
print("Nu är programmet slut.")
Funktionsanrop - lokala variabler
⁃ När en funktion anropas skapas en ny frame för just det funktionsanropet (eng. function call).
⁃ Alla variabler som definieras när funktionen körs tillhör funktionsaropets frame.
⁃ Dessa kallas för lokala variabler - variabler som tillhör en icke-global frame.
⁃ När körmarkören hoppar från en körande funktion till dess anrop (return), förstörs den frame som hörde ihop med
funktionsanropet.
program1.py
# i detta program är a, b och c symboler som är definierade i det
# globala scopet a = 5
b = "hejsan"
def c(value1, value2):
# när denna funktion körs skapas en frame
# funktionens argument är lokala variabler som finns i # funktionsanropets frame
return value1 + value2 a
b
c(5, 7)
print("Nu är programmet slut.")
program1b.py
# i detta program är a, b och c symboler som är definierade i det
# globala scopet a = 5
b = "hejsan"
def c(value1, value2):
# när denna funktion körs skapas en frame
# funktionens argument är lokala variabler som finns i # funktionsanropets frame
return value1 + value2 a
b
c(5, 7)
# kommer detta att fungera?
print(value1)
print("Nu är programmet slut.")
program2.py
# lokala variabler finns endast när en funktion körs
# samma variabelnamn kan användas i olika frames
# när Python ska slå upp värdet på en variabel letar Python först
# lokalt
def add_values(x, y):
z = x + y return z
r = add_values(1, 2)
# Vad har x, y, z och r för värden här?
x = 3 y = 4 z = 5
r = add_values(6, 7)
# Vad har x, y, z och r för värden här?
program3.py
# lokala variabler finns endast när en funktion körs
# samma variabelnamn kan användas i olika frames
# när Python ska slå upp värdet på en variabel letar Python först
# lokalt
# om variabeln inte finns globalt letar Python globalt
def add_values(x):
# vilket värde på y kommer användas här?
z = x + y return z x = 3
y = 4 z = 5
r = add_values(6)
# Vad har x, y, z och r för värden här?
Styra flöde med villkor
Villkor
⁃ Vi kan använda villkorssatser för att styra flödet i ett program.
⁃ En villkorssats behöver ett villkor som är antingen sant eller falskt och ett block som ska utföras om villkoret är sant.
if <villkor>:
sats1 sats2 sats3 ...
Sanningsvärden
⁃ Datatyper vi stött på: int (heltal), float (flyttal)
⁃ Ny datatyp: sanningsvärde; eng boolean, Python bool
⁃ Finns två sanningsvärden: True och False.
⁃ Om andra datatyper än sanningsvärden används tolkar python värdena enligt följande:
alla värden förutom None, 0, [] och "", ses som sanna
Villkorssatser
⁃ Bestämma villkor för när kod ska köras.
if <uttryck som beräknas till ett sanningsvärde>:
sats1 sats2 sats3 ...
⁃ När villkorets sanningsvärde är True körs satserna i blocket som hör till if-satsen.
⁃ När sanningsvärdet är False hoppar pythontolken över blocket som hör till if-satsen.
Exempel
# kom ihåg: De enda värden som tolkas som falska är: 0, False och None det_regnar = False
det_snöar = True
def testfunktion1():
return False
def testfunktion2():
return "False"
def testfunktion3():
print(True) if True:
print("Det är sant.") if False:
print("Det är falskt.") if det_regnar:
print("Det regnar!") if det_snöar:
print("Det snöar!") if 30-30:
print("Jag kan räkna med heltal.") if testfunktion1():
print("Test 1 OK.") if testfunktion2():
print("Test 2 OK.") if testfunktion3():
print("Test 3 OK.")
Jämförelser
(jämförelseoperatorer)
⁃ Jämförelseoperatorer är operatorer vars beräknade värde alltid är ett sanningsvärde, dvs. True eller False.
⁃ Jämförelseoperatorer i Python lika med: ==
inte lika med: !=
större än: >
mindre än: <
större eller lika med: >=
mindre eller lika med: <=
⁃ Exempel
x == 5
mätvärde >= maxvärde
Exempel
# villkor med jämförelser
if mina_poäng > dina_poäng:
print("Jag vann!")
if mina_poäng == dina_poäng:
print("Oavgjort!")
if dina_poäng > mina_poäng:
print("Ett fel har uppstått och programmet kommer avslutas.") if len(meddelande) > 140:
print("Meddelandet är för långt.") if finns_i_ordlista(ord):
print("Draget är giltigt.")
Logiska operatorer
⁃ Logiska operatorer används för att kombinera eller negera ett sanningsvärden.
⁃ Uttryck med logisk operator beräknas alltid till ett sanningsvärde, dvs antingen True eller False.
and: True om båda operander är sanna
or: True om minst en av operanderna är sanna
not: True om operanden är False, False om operanden är
True
⁃ Exempel
mätvärde1 > 100 and mätvärde2 <= 10
Exempel
# villkor med logiska operatorer temperatur = -6.2
nederbörd = True
if temperatur < 0 and nederbörd:
print("Jag tror att det snöar.") if temperatur < 0 and not nederbörd:
print("Det snöar i alla fall inte.") if temperatur < -100 or temperatur > 100:
print("Jag tror att vi är på en annan planet.")
Flera möjliga förgreningar
Olika mönster av villkorssatser
⁃ Blocket tillhörande if-satsen utförs om villkoret i if-satsen är sann.
if sanningsvärde:
satser
⁃ Exempel
if sensor_value < 150:
output = 0
if-sats tillsammans med else- sats
⁃ else-satsen kan användas tillsammans med en if-sats. else- satsens block utförs om villkorssatsen är falsk.
if sanningsvärde:
satser else:
satser
if-sats tillsammans med else- sats
⁃ Exempel
if sensor_value < 150:
output = 0 else:
output = 1
if-sats tillsammans med en eller flera elif-satser
⁃ Om sanningsvärde1 är sant, utförs blocket tillhörande if-
satsen. Inga elif-satser utvärderas i anslutning till if-satsen utvärderas.
⁃ Om if-satsens sanningsvärde1 är falskt, utvärderas närmaste elif-sats och dess block utförs om dess sanningsvärde är
sant. Övriga elif/else-satser hoppas över.
if sanningsvärde1:
satser
elif sanningsvärde2:
satser
# fler elif-satser kan följa
if-sats tillsammans med en eller flera elif-satser
⁃ Exempel
if sensor_value < 100:
output = 0
elif sensor_value >= 100 and sensor_value < 200:
output = 1
elif sensor_value >= 200 and sensor_value < 300:
output = 2
if-sats med elif-satser och avslutande else-sats
⁃ Om varken if-satsen eller någon av dess elif-satser hade ett sanningsvärde som var sant, utförs det block som hör ihop med else-satsen.
if sanningsvärde:
satser
elif sanningsvärde:
satser
# fler satser med elif kan följa else:
satser
if-sats med elif-satser och avslutande else-sats
⁃ Exempel
if sensor_value < 75:
output = 0
elif sensor_value >= 75 and sensor_value < 150:
output = 1
elif sensor_value >= 150 and sensor_value < 225:
output = 2 else:
output = 3
Sekvenser av värden
I Python
Sekvenser i Python.
Exempel: strängar
⁃ En sträng är en sekvens av tecken.
mitt_namn = "Pikachu"
mitt_namn[0] -> "P"
mitt_namn[1:3] -> "ik"
"Mr. " + mitt_namn = "Mr. Pikachu"
mitt_namn + "Mr. " -> "PikachuMr. "
Sekvenser i Python.
Exempel: listor
⁃ En lista är sekvens av värden (t.ex. heltal, flyttal, strängar).
⁃ En lista är också ett värde, dvs en lista kan också innehålla andra listor.
godis1 = ["söt", "grön", "mjuk", "kletig"]
godis1[0] -> "söt"
godis1[1:3] -> ["grön", "mjuk"]
["god"] + godis1 -> ["god", "söt", "grön", "mjuk", "kletig"]
godis1 + ["god"] -> ["söt", "grön", "mjuk", "kletig", "god"]
Bearbeta sekvenser
programmatiskt
Vem är längst?
A B C
Vem är längst?
A B C
120 100 160
Vem är längst?
A B C D E F G H I
1 2 3 4
5
6
Vem är längst?
A B C D E F G H I
1 1 2 71 6 56 5 57 55 84
2 17 89 13 31 22 30 34 65 61
3 69 3 2 62 68 86 8 23 67
4 14 7 2 32 7 11 63 60 16
5 32 2 70 89 3 72 68 59 15
6 53 7 24 8 26 28 67 54 64
Från datorns perspektiv
⁃ Har datorn en översiktsbild? Kan datorn titta på en hel lista på en gång?
⁃ Datorn kan "titta" på ett element i taget
⁃ Vi måste tillhandahålla arbetsminne
⁃ Datorn kommer inte ihåg något "automatiskt"
Vad behövs för att bearbeta en sekvens av data?
⁃ något sätt att gå igenom sekvensen
⁃ något sätt att beskriva regler för vad som göras beroende på vad för värden vi har i sekvensen
Nya komponenter
⁃ villkor
⁃ sanningsvärden (ny datatyp)
⁃ jämförelser
⁃ logiska operatorer
⁃ loopar
⁃ Vi kan använda dessa, inte bara för att bearbeta sekvenser, utan för att styra programflöde
while-loopen
... som en if-sats fast blocket utförs om och om
igen så länge som dess villkor är sant.
while-loopen
⁃ Satserna i blocket som tillhör while-loopen upprepas tills while-satsens villkor blir falskt.
⁃ Efter sista satsen i blocket börjar loopen om från blockets första sats.
while <uttryck som beräknas till ett sanningsvärde>:
sats1 sats2 ...
Exempel
# räkna upp till 10 count = 0
while count <= 10:
print(count) count += 1
# evig loop x = 0
while x <= 10:
print("En dator blir aldrig uttråkad.") print(x)
Avbryta en loop, eller gå till nästa iteration i en loop
⁃ iteration: varv
⁃ Nyckelordet break användas för att avbryta en loop.
⁃ Nyckelordet continue används för att hoppa över resten av blocket och börja om igen från början
Exempel på break och continue
print("Innan loopen.") count = 0
while count < 10:
if count == 3 or count == 5:
count += 1 continue
print("count: " + str(count))
if count > 8:
print("Nu orkar jag inte mer.") break
elif count > 3:
print("Är vi framme snart?") else:
print("Det här är roligt!") count += 1
print("Efter loopen.")
Bearbetning av strängar och
listor med while-loop
Skriva ut alla värden i en lista
namn = ["Ada", "Beata", "Cecilia", "Diana"]
index = 0
# så länge som index är mindre än längden på namn while index < len(namn):
print(namn[index])
# öka index med 1 - om vi missar detta i denna loop kommer # loopen aldrig ta slut
index += 1
Skriva ut alla värden i en lista som funktion
def print_all_values(values):
index = 0
while index < len(values):
print(values[index]) index += 1
namn = ["Ada", "Beata", "Cecilia", "Diana"]
print_all_values(namn)
print_all_values(["Hej", "Hopp"])
Leta efter en bokstav i en sträng
def char_exists_in_word(word, character):
index = 0
while index < len(word):
if word[index] == character:
return True index += 1
return False
def check_name(name):
if char_exists_in_word(name, "j") or char_exists_in_word(name, "J"):
print("You have a nice name.") else:
print("Your name is ok.")
check_name("Jojo") check_name("Lollo")
for-loopen
(glöm inte bort att ni kan testa i Pythontutor)
for-loopen, syntax
for element in a_sequence:
statement1 statement2 statement3 ...
⁃ for-loopen loopar över en sekvens
⁃ Vid varje iteration tilldelas variabeln element nästa värde i sekvensen a_sequence
⁃ OBS! variablerna behöver inte heta element och a_sequence
Skriva ut alla värden i en lista
names = ["Adam", "Bethany", "Chris"]
# gå igenom alla element i names. det aktuella elementet
# refereras till via variabeln name i loopen.
for name in names:
# skriv ut det aktuella elementet i listan names print(name)
Gå igenom en sträng med for
word = "fantastisk"
# gå igenom alla tecken i word. det aktuella tecknet
# refereras till via variabeln char i loopen.
for char in word:
# skriv ut det aktuella tecknet i strängen word print(char)
Leta efter en bokstav i en sträng
def char_exists_in_word(word, character):
for char in word:
if char == character:
return True return False
def check_name(name):
if char_exists_in_word(name, "j") or char_exists_in_word(name, "J"):
print("You have a nice name.") else:
print("Your name is ok.")
check_name("Jojo") check_name("Lollo")
Byt ut bokstäver
word = "fantastisk"
new_word = ""
for char in word:
# lägg till "i" istället för "a"
if char == "a":
new_word += "å"
elif char == "s":
new_word += "l"
else:
new_word += char print(new_word)
Funktionen range()
range()
⁃ Skapar en "virtuell lista med heltal" (en generator) som man kan använda som en vanlig lista med heltal.
⁃ range(stop): Börja från 0, öka med 1 och fortsätt generera heltal så länge som heltalet är mindre än stop
⁃ range(start, stop): Börja från start, öka med 1 och fortsätt generera heltal så länge som heltalet är mindre än stop
⁃ range(start, stop, step): Börja från start, öka med
step och fortsätt att generera heltal så länge som heltalet är mindre än stop
range()
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(4,6)) [4, 5]
>>> list(range(10, 101, 10))
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
>>> list(range(10, 110, 10))
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
>>> list(range(10, 0, -2)) [10, 8, 6, 4, 2]
>>> list(range(10, 3, -2)) [10, 8, 6, 4]
for med range()
# Skriv ut siffrorna 0 till 9 (10 siffror) for i in range(10):
print(i)
for med range()
names = ["Adam", "Bethany", "Chris"]
# Skriv ut elementen i listan names for i in range(len(names)):
print(names[i])
Felsökning
Olika typer av fel
⁃ Syntaxfel: Pythontolken förstår inte koden. Programmet kör inte överhuvudtaget.
⁃ Runtime-fel: Fel som uppstår vid körning och resulterar i en krasch. Programmet försökte göra något som inte gick.
⁃ Logiska fel: Programmet kraschar inte, men gör inte det den ska.
Spårutskrifter
⁃ Utskrift av variabelvärden
⁃ Utskrift av text för att visa var i koden pythontolken befinner sig
Felsökning av olika typer av fel
⁃ Syntaxfel: kontrollera syntax, antal blanksteg, parenteser, kolon etc
⁃ runtime-fel: tolka felmeddelandet, lägg till spårutskrifter
⁃ Logiska fel i programmet: försök att isolera felet, på vilka ställen i koden används variabeln/funktionen som har med felet att göra? Lägg till spårutskrifter.
⁃ När har svårt att hitta felet: det är bättre att vara noggrann och dubbelkolla med spårutskrifter än göra antaganden.
Programabstraktion
dela upp ett problem/program i mindre delar genom att skapa funktioner som löser
delproblem
Dela upp ett problem i delproblem
⁃ Samma grundidé som i många andra delar av ingenjörskonsten
⁃ Lättare att lösa ett mindre och avgränsat problem än ett stort, komplext problem
⁃ Exempel
all konstruktion...
hus bilar
telefoner datorer
Program- och dataabstraktion
⁃ Programabstraktion
nedbrytning av uppgifter och processer
⁃ Dataabstraktion
nedbrytning av hur information är strukturerad
Bygga upp ett program med hjälp av funktioner
⁃ Istället för att ha en funktion som gör allt
identifiera mönster
deluppgifter som förekommer på flera olika ställen i ett program
⁃ Skriv en funktion för varje deluppgift
⁃ Uppdelningen kan vara hierarkisk:
Problem A består av delproblemen B och C Problem B består av delproblemen E, F och G Problem C består av delproblemen H, E och I ...
Exempel (skiss)
def ta_emot_kommando():
satser
return kommando def kommando1():
satser
def kommando2():
satser
def utför_kommando(kommando):
satser def main():
while True:
kommando = ta_emot_kommando() utför_kommando(kommando)
Exempel (skiss)
def ladda_ordlistor():
satser
def ladda_ordlista(ordlista):
satser
def autocomplete_strategi1():
satser
def autocomplete_strategi2():
satser
def autocomplete(strategi, ord, ordlistor) satser
def välj_strategi():
satser
def main():
ordlistor = ladda_ordlistor() strategi = välj_strategi() while True:
ord = input("Skriv ett ord: ") if ord != "q":
kompletterat_ord = autocomplete(strategi, ord, ordlistor) print(kompletterat_ord)
Textbaserade filformat
Textfiler
⁃ Filer där varje enhet data ska tolkas som ett tecken
⁃ Olika teckentabeller och teckenkodningar
teckentabell: olika "skiffer", "A" = 65
teckenkodning: olika sätt att lagra teckenvärdena
⁃ ASCII, 128 tecken
Teckentabell för ASCII (7-bitar)
⁃ 128 värden, 128 kodpunkter i tabellen
Unicode
⁃ Teckentabell med 143 859 tecken (mars 2020)
⁃ Idag tekniskt sett plats för 1 112 064 olika tecken
⁃ Teckenkodningar: UTF-8, UTF-16 m.fl.
olika sätt att koda kodpunktsvärden för lagring t.ex. på fil
⁃ Diverse skriftsystem
latinska bokstäver, kyrilliska, kinesiska, arabiska, runskrift, kilskrift, hieroglyfer, m. fl.
⁃ Diverse andra tecken/glyfer
emoji, pilar, matematiska symboler
Textbaserade filformat
⁃ Data lagrad som text med en systematisk struktur. T.ex.
⁃ ett värde per rad
⁃ flera värden per rad där varje värde skiljs åt med med ett specifikt tecken, t.ex. csv (comma separated values)
⁃ Strukturerad information (olika nivåer)
XML YAML JSON
Läsa från textfil
Läsa data från textfil
⁃ Läsning sker sekventiellt
⁃ Olika strategier
hela filen som en textsträng
en rad i taget, en rad → en sträng
hela filen som en lista, varje rad blir ett element i en lista
Förberedelser innan läsning
⁃ Filen måste öppnas för läsning
⁃ Liknelse: undersöka innehåll i en låda från en lagerlokal
ange vilken låda - ange sökväg till filen
öppna låda för att plocka ut saker - öppna filen i "läsläge"
plocka fram innehåll - läs från fil
Läsa in information från en fil
Funktionen open() tar in en sträng (namn på fil), och öppnar filen och returnerar den öppna filen (speciell datatyp)
fil1 = open(filnamn) # endast läsning fil2 = open(filnamn, 'r') # endast läsning fil3 = open(filnamn, 'w') # skriva över
fil4 = open(filnamn, 'a') # lägga till
Läsa in information från en fil
Metoden .readlines() läser innehållet i filen och returnerar en lista som innehåller varje rad i filen som en sträng.
(en metod kan ses som en funktion som sitter ihop med ett värde)
fil = open("hemligt.txt") innehåll = fil.readlines()
Stänga fil
⁃ Vi stänger en fil när vi är klara med den (praxis, för att undvika diverse problem)
fil = open("data.csv")
innehåll = fil.readlines() fil.close()
Funktionen repr()
⁃ repr() returnerar sträng även citattecken för att indikera att det är en sträng syns
print(True) print("True")
print(repr(True)) print(repr("True"))
Läsa in information från en fil
⁃ Tre olika sätt att läsa:
alla rader till en lista av rader: .readlines()
allt på en gång: .read()
en rad i taget: .readline()
⁃ Mer på lektionen inför Del 2 av Laboration 2
Dela en sträng -> lista med strängar
⁃ Dela upp en sträng i flera strängar och lägg dem i en lista:
names_as_string = "Ada;Bertil;Cecilia"
# dela upp strängen names_as_string och lägg i lista names_as_list = names_as_string.split(";")
⁃ Givet en lista av strängar, skapa en sträng med alla element åtskilda av ett specifikt tecken
names_as_string = "Ada;Bertil;Cecilia"
names_as_list = names_as_string.split(";")
# slå ihop alla strängar i listan names_as_list till en sträng new_names_as_string = ", ".join(names_as_list)