• No results found

TDDE44 Programmering, grundkurs

N/A
N/A
Protected

Academic year: 2022

Share "TDDE44 Programmering, grundkurs"

Copied!
102
0
0

Loading.... (view fulltext now)

Full text

(1)

TDDE44 Programmering, grundkurs

Föreläsning 2.1-2.2

Jody Foo, jody.foo@liu.se

(2)

Ö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

(3)

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

(4)

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.

(5)

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

(6)

Extra handledningstillfälle för installationer

Nu på torsdag, 4 februari kl. 10.15

(7)

Programmeringsparadigm

(8)

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

(9)

Programmeringsparadigm

⁃ Procedurell programmering

⁃ Objektorienterad programmering

⁃ Funktionell programmering

⁃ Logikprogrammering

(10)

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

(11)

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

(12)

Programmeringsparadigm och Python

⁃ Funktionell programmering

⁃ Procedurell programmering

⁃ Objektorienterad programmering

(13)

Funktioner och scope

Tips: http://pythontutor.com/

(14)

Anropsstacken (eng. call

stack)

(15)

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

(16)

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

(17)

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

(18)

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

(19)

Demonstration

(20)

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.

...

(21)

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!

(22)

http://pythontutor.com

(23)

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

(24)

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.

(25)

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

(26)

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.

(27)

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

(28)

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

(29)

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?

(30)

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?

(31)

Styra flöde med villkor

(32)

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

(33)

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

(34)

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.

(35)

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

(36)

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

(37)

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

(38)

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

(39)

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

(40)

Flera möjliga förgreningar

(41)

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

(42)

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

(43)

if-sats tillsammans med else- sats

⁃ Exempel

if sensor_value < 150:

output = 0 else:

output = 1

(44)

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

(45)

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

(46)

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

(47)

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

(48)

Sekvenser av värden

I Python

(49)

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

(50)

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

(51)

Bearbeta sekvenser

programmatiskt

(52)

Vem är längst?

A B C

(53)

Vem är längst?

A B C

120 100 160

(54)

Vem är längst?

A B C D E F G H I

1 2 3 4

5

6

(55)

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

(56)

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"

(57)

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

(58)

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

(59)

while-loopen

... som en if-sats fast blocket utförs om och om

igen så länge som dess villkor är sant.

(60)

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

(61)

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)

(62)

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

(63)

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

(64)

Bearbetning av strängar och

listor med while-loop

(65)

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

(66)

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"])

(67)

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

(68)

for-loopen

(glöm inte bort att ni kan testa i Pythontutor)

(69)

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

(70)

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)

(71)

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)

(72)

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

(73)

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)

(74)

Funktionen range()

(75)

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

(76)

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]

(77)

for med range()

# Skriv ut siffrorna 0 till 9 (10 siffror) for i in range(10):

print(i)

(78)

for med range()

names = ["Adam", "Bethany", "Chris"]

# Skriv ut elementen i listan names for i in range(len(names)):

print(names[i])

(79)

Felsökning

(80)

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.

(81)

Spårutskrifter

⁃ Utskrift av variabelvärden

⁃ Utskrift av text för att visa var i koden pythontolken befinner sig

(82)

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.

(83)

Programabstraktion

dela upp ett problem/program i mindre delar genom att skapa funktioner som löser

delproblem

(84)

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

(85)

Program- och dataabstraktion

⁃ Programabstraktion

nedbrytning av uppgifter och processer

⁃ Dataabstraktion

nedbrytning av hur information är strukturerad

(86)

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

(87)

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)

(88)

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)

(89)

Textbaserade filformat

(90)

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

(91)

Teckentabell för ASCII (7-bitar)

⁃ 128 värden, 128 kodpunkter i tabellen

(92)

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

(93)

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

(94)

Läsa från textfil

(95)

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

(96)

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

(97)

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

(98)

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()

(99)

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()

(100)

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

(101)

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

(102)

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)

References

Related documents

Om man trampar på golvet får man gå ner till väggen och göra 5-10 armhävningar, situps eller upphopp innan man får gå ut på banan igen.. Det gäller varje gång man kliver

Ja, men bara om det inte finns någon skylt som säger att man inte får det eller om det inte är eldningsförbud och om man är mycket försiktig och släcker noga efter sig.. Nej,

(2010) föreslår att ett sätt att skapa organisationsengagemang hos medarbetare som vill utvecklas inom organisationen, är att hjälpa dem nå sina karriärmål genom

Vi använde oss av ett målinriktat urval (Bryman 2011) där vi har, utifrån vårt syfte och våra frågeställningar, försökt hitta relevanta intervjupersoner, men vi fick även, på

Faris benämner drömmar i magisk realism som ett verktyg för att vilseleda läsaren: ”Magical realist scenes may seem dreamlike, but they are not dreams, and the text may both

Harry skyddas av den förtrollning som hans mamma lade över honom innan hon dog och detta är anledningen till att Harry varje sommar har tvingats tillbaka till sina släktingar, trots

I resultatdel lyfter de ett flertal gånger fram en önskan att ha ett bredare samarbete med övriga instanser som vissa andra skolor har, som en direkt koppling till BUP

Som vi tidigare har nämnt, visar forskning från bland annat Keareny &amp; Bates (2005), Skolverket (2010) samt Socialstyrelsen (2006) att vikten av samverkan