1 of 59

Föreläsning 7

Repetition föreläsning 1-6, extra fokus på klasser

1

2 of 59

Dagens agenda

  1. Datorprovet - repetition föreläsning 1-6
    1. Namngivning av identifierare
    2. Styrstrukturer
    3. Användarvänlig utdata
    4. Filöverföring
    5. Interaktiva program
  2. Skapa en klass
  3. Skapa objekt från en klass
  4. Datorprovet - repetition föreläsning 6
    1. Sammansatta datatyper och klasser
    2. Dela upp ett program
  5. Att lära sig tillsammans

2

Vi kan byta ordning, vill ni börja med klasser och objekt?

3 of 59

Övningsdatorprovet

3

Länk från vecka 46!

4 of 59

Namngivning av identifierare

Föreläsning 1, 4 & 6

Möbius: kapitel: 1, kapitel 5 & kapitel 9

5 of 59

Övningsdatorprov

Fråga 1-3

5

6 of 59

Menti

6

7 of 59

Identifierare

Identifierare är alla delar av koden som du döper själv. Dessa infattar:

  • Variabler
  • Konstanter
  • Funktioner och metoder
  • Attribut (som är en typ av variabel)
  • Klasser

7

Bra identifierarnamn ska vara tydliga!

De ska beskriva vad det är för typ av värde so sparas i dem!

8 of 59

Regler för variabler

  • Börja med liten bokstav
  • Skrivna i snake_case eller camelCase
  • Får bara bestå av bokstäver, siffror och understräck_
  • Beskriver värdet som är sparat i variabeln – tydliga!
    • Undantag: räknare i slingor! Dessa kan ofta heta i, j, k, l, m, n…

8

”Variabler” som inte kan variera/byta värde kallas konstanter. Dessa skrivs med stora bokstäver!

9 of 59

Regler för övriga identifierare

  • Skrivna i snake_case eller camelCase
  • Får bara bestå av bokstäver, siffror och understräck_
  • Beskriver värdet som är sparat i variabeln – tydliga!

Funktioner och metoder

  • Beskriver vad de gör, börjar gärna med ett verb

Klasser

  • Börjar med stor bokstav!
  • Döpta i singularis – beskriver ETT objekt

9

Attribut döps på samma sätt som variabler

10 of 59

Variabler i for-slingor!

10

grönsaker = [’gurka’, ’tomat’, ’majs’]

for i in grönsaker:

print(i)

grönsaker = [’gurka’, ’tomat’, ’majs’]

for grönsak in range(len(grönsaker)):

print(grönsak)

Vad kommer att skrivas ut?

Vad kommer att skrivas ut?

NOOOO!!!!!

11 of 59

Bättre variabler i for-slingor!

11

grönsaker = [’gurka’, ’tomat’, ’majs’]

for grönsak in grönsaker:

print(grönsak)

grönsaker = [’gurka’, ’tomat’, ’majs’]

for i in range(len(grönsaker)):

print(i)

Nu är det mycket lättare att se om du vill skriva ut (printa) ett index eller själva elementet i listan.

12 of 59

Styrstrukturer – if/else, while & for

12

Föreläsning 2 & 3

Möbius: kapitel: 2 & kapitel 3

13 of 59

Övningsdatorprov

Fråga 4-6

13

14 of 59

Menti

14

15 of 59

if-elif-else

tal = 5

print("talet är", end=" ")

if tal > 7:

print("större än 7.")

elif tal > 4:

print("större än 4.")

elif tal == 5:

print("5.")

else:

print("4 eller mindre.")

Vad kommer att skrivas ut?

Komihåg:

Python läser koden uppifrån och ner!

16 of 59

while

counter = 0

while counter < 5:

counter += 1

print("Current count:", counter)

if counter == 5:

break

Vad kommer att skrivas ut?

Komihåg att hålla koll på när slingan avslutas

17 of 59

for-slingor

for i in range(1,4):

for j in range(1,4):

print(i*j, end = " ")

print()

Vad händer här?

Resultat:

1 2 3

2 4 6

3 6 9

Komihåg: Vi kan ha:

  • for element in listan:
  • for element in range(len(listan))
  • for i, element in enumerate(listan)

18 of 59

Användarvänlig utdata

18

Kopplat till användning av print och input

19 of 59

Övningsdatorprov

Fråga 7-9

19

Vi återkommer till 9, den handlar om klasser och __str__-metoden!

20 of 59

Menti

20

21 of 59

Tydlig utdata för användaren

  • Förklara vad för typ av värde du vill att användaren ska mata in!
  • Mycket text kan bli svårläst 🡪 lägg in mellanslag och tomma rader

21

22 of 59

Håll koll på raderna i utskriften

22

print() skriver ut en ny rad!

Om du vill att nästa utskrift ska fortsätta på samma rad måste du skriva:

print(end=””)

Och om du vill att nästa utskrift ska fortsätta på samma rad fast efter ett mellanslag så behöver du skriva:

print(end=” ”)

Om du vill lägga till en ny rad i en sträng så skriver du ”\n”

23 of 59

Filöverföring

Föreläsning 5

Möbius: kapitel 7

24 of 59

Övningsdatorprov

Fråga 10-12

24

25 of 59

Menti

25

26 of 59

Exempel

Snyggar till det som har lästs från filen

Spara det inlästa resultatet i en lista

Öppnar filen med open() och talar om vilken fil som ska öppnas

27 of 59

Filöverföring

27

Funktionen open() har flera modes som talar om vad du vill göra med filen. Vi har tittat på:

  • ”r” – read: läs från filen
  • ”w” – write: skriv till filen
    • Om filen redan finns: skriv över det som var i filen innan
    • Om filen inte fans: skapa den och skriv till den
  • ”a” – append: lägg till data till en fil

Om filen inte kan hittas så får du ett:

FileNotFoundError

28 of 59

Läsa från och spara på fil

28

def skapa_telefonbok(filnamn):

telefonbok = {}

with open(filnamn, 'r') as fil:

for rad in fil:

kontakt = rad.split(',')

namn = kontakt[0].strip()

tel = kontakt[1].strip()

pnr = kontakt[2].strip()

kontakt = Kontakt(namn, tel, pnr)

telefonbok[namn] = kontakt

return telefonbok

def spara_telefonbok(filnamn, telefonbok):

with open(filnamn, 'w') as fil:

for nyckel in telefonbok.keys():

fil.write(str(telefonbok[nyckel]))

29 of 59

Interaktiva program

Föreläsning 5

Möbius: kapitel 7

30 of 59

Övningsdatorprov

Fråga 13-15

30

31 of 59

Menti

31

32 of 59

Vad måste vi tänka på när vi tar in användar-input/indata?

32

Funktionen input() läser in ALL indata som strängar!

Om du vill att indatan ska vara av en annan datatyp måste du fixa det själv!

Gör om till:

  • Heltal med int()
  • Decimaltal med float()

Användare skriver lätt fel!

Hur ska du hantera det?

33 of 59

Hantera fel…

33

Hjälp användaren med att inte göra fel!

Hantera fel med:

  • try-except
  • if-else

Låt användaren mata in ny input med:

  • while-slinga!

34 of 59

Vanliga fel vid användarinput

34

TypeError

print(3 + ’fyra’)

ValueError

int(’fyra’)

TypeError uppstår när vi försöker utföra en operation som inte kan utföras med en variabel av den datatypen (eller som här: när olika datatyper blandas)

ValueError uppstår när vi försöker stoppa in en parameter som har fel värde. Vi kan stoppa in strängar i int(), men bara om de kan göras om till heltal. Det gäller inte för strängen ’fyra’.

35 of 59

Uppdelning i funktioner

35

36 of 59

Övningsdatorprov

Fråga 21

36

37 of 59

Vad är en funktion?

Fördelar med funktioner

  • Lättare att undvika kodupprepning.
  • Gör koden mer lättläst.
  • Lättare att felsöka.
  • Minskar risken för fel.

Delar in koden i mer lätthanterliga delar

Ett kodstycke som:

    • Gör en specifik sak
    • Kan återanvändas

Funktioner är ett exempel på abstraktion

🡪 vi gömmer funktionalitet i funktioner så att koden blir mer lättläst.

38 of 59

Dela upp koden i funktioner

def summera(tal1, tal2):

summa = tal1 + tal2

return summa

def main():

summa1 = summera(2, 3)

summa2 = summera(4, 5)

tot_summa = summera(summa1, summa2)

main()

Glöm inte att anropa main()!

En funktion kan ta indata: parametrar.

Du måste skicka med dem när du kallar på funktionen.

Om en funktion har ett returvärde så måste du spara det!

39 of 59

Skapa egna klasser

39

40 of 59

Klassen Pepparkakssnigel

40

Attribut

Den data som hör ihop med en klass kallar vi för attribut

En klass kan ses som en mall för det den beskriver.

Metoder

De funktioner som hör ihop med klasserna kallar vi för metoder

41 of 59

Klasser & Objekt

41

Snigelobjekt1

class Pepparkakssnigel

Skapar snigelobjekt

Snigelobjekt2

Snigelobjekt3

Poängen med klasser är att vi vill skapa objekt!

42 of 59

Attribut och metoder till Pepparkakssnigel

Objekten har olika egenskaper

- Dessa definieras som attribut i klassen!

Pepparkakssnigelns attribut:

  • Storlek
  • Brändhetsgrad
  • Glasyr
  • Hatt

42

Attribut

Den data som hör ihop med en klass kallar vi för attribut

Vi kan göra olika saker med objekten

- Det vi kan göra med objekten definieras som metoder.

Pepparkakssnigelns metoder:

  • Grädda
  • Glasera
  • Byt_hatt

Metoder

De funktioner som hör ihop med klasserna kallar vi för metoder

43 of 59

Definiera klassen Pepparkassnigel med attribut

43

class Pepparkakssnigel:

def __init__(self, storlek, brändgrad, hatt = None):

self.storlek = storlek

self.brändhetsgrad = brändgrad

self.glasyr = False

self.hatt = hatt

Vi skapar en klass genom att skria class

I __init__ listar vi alla attribut som klassen ska ha.

Konstruktorn: __init__

snigel = Pepparkakssnigel("Medium", 2)

Objekt

44 of 59

Hur skriver vi för att skapa ett pepparkakssnigelobjekt som har följande egenskaper?

44

Attribut

  • Storlek: ”Liten”
  • Brändhetsgrad: 2
  • Glasyr: False
  • Hatt: ”Stråhatt”

class Pepparkakssnigel:

def __init__(self, storlek, brändgrad, hatt = None):

self.storlek = storlek

self.brändhetsgrad = brändgrad

self.glasyr = False

self.hatt = hatt

Komhihåg klassdefinitionen!

snigel = Pepparkakssnigel("Liten", 2,"Stråhatt")

45 of 59

Metoder

45

class Pepparkakssnigel:

def glasera(self):

self.glasyr = True

def __init__(self, storlek, brändgrad, hatt = None):

self.storlek = storlek

self.brändhetsgrad = brändgrad

self.glasyr = False

self.hatt = hatt

def grädda(self):

self.brändhetsgrad += 2

def byt_hatt(self, ny_hatt):

self.hatt = ny_hatt

Alla metoder måste ha parametern self. self ger bla tillgång till alla attribut i klassen.

46 of 59

Attribut

46

class Pepparkakssnigel:

def glasera(self):

self.glasyr = True

def __init__(self, storlek, brändgrad, hatt = None):

self.storlek = storlek

self.brändhetsgrad = brändgrad

self.glasyr = False

self.hatt = hatt

def grädda(self):

self.brändhetsgrad += 2

def byt_hatt(self, ny_hatt):

self.hatt = ny_hatt

Du kommer åt attributen genom att skriva self.attributnamn

47 of 59

Att komma åt attributen

47

class Pepparkakssnigel:

def __init__(self, storlek, brändgrad, hatt = None):

self.storlek = storlek

self.brändhetsgrad = brändgrad

self.glasyr = False

self.hatt = hatt

snigel = Pepparkakssnigel("Liten", 2,"Stråhat")

snigelns_hatt = snigel.hatt

Vi kommer åt snigelns hatt genom att skriva namnet på objektet följt av .attributnamn!

48 of 59

Att kalla på en metod

48

class Pepparkakssnigel:

def __init__(self, storlek, brändgrad, hatt = None):

self.storlek = storlek

self.brändhetsgrad = brändgrad

self.glasyr = False

self.hatt = hatt

def grädda(self):

self.brändhetsgrad += 2

def glasera(self):

self.glasyr = True

def byt_hatt(self, ny_hatt):

self.hatt = ny_hatt

snigel = Pepparkakssnigel("Liten", 2,"Stråhatt")

Hur kan vi kalla på metoden byt_hatt() för objektet snigel för att snigeln ska få en keps?

snigel.byt_hatt("Keps")

49 of 59

Skriva ut ett helt objekt

49

class Pepparkakssnigel:

def __init__(self, storlek, brändgrad, hatt = None):

self.storlek = storlek

self.brändhetsgrad = brändgrad

self.glasyr = False

self.hatt = hatt

snigel = Pepparkakssnigel("Liten", 2,"Stråhatt")

print(snigel)

<__main__.Pepparkakssnigel object at 0x10479e4e0>

Typ så här kommer det se ut om vi försöker skriva ut snigelobjektet

50 of 59

Vi behöver en __str__ metod!

50

__str__ talar om hur objektet ska se ut när det skrivs ut.

__str__ MÅSTE returnera en sträng. Det är en fördefinerad metod som ska bete sig på samma sätt i alla klasser.

class Pepparkakssnigel:

def __init__(self, storlek, brändgrad, hatt = None):

self.storlek = storlek

self.brändhetsgrad = brändgrad

self.glasyr = False

self.hatt = hatt

def __str__(self):

sträng = "Snigeln har storlek " + self.storlek

return sträng

def glasera(self):

self.glasyr = True

def byt_hatt(self, ny_hatt):

self.hatt = ny_hatt

Vi kommer aldrig kalla på __str__-metoden, den kallas automatiskt när vi försöker printa objektet eller konvertera det till en sträng

__str__ måste returnera en sträng

51 of 59

Att ha flera objekt

51

52 of 59

Spara fler objekt

52

För att kunna komma åt objekten senare måste vi så klart spara dem.

Ofta är det bra att göra detta i en lista eller ett dictionary!

snigel1 = Pepparkakssnigel("Liten", 2,)

snigel2 = Pepparkakssnigel("Stor", 2, "Topphat")

snigel3 = Pepparkakssnigel("Gigantisk", 3, "Slöja")

snigel4 = Pepparkakssnigel("Mellan", 4)

snigel_lista = [snigel1, snigel2, snigel3, snigel4]

53 of 59

Komma åt objekt i en lista

53

snigel1 = Pepparkakssnigel("Liten", 2,)

snigel2 = Pepparkakssnigel("Stor", 2, "Topphat")

snigel3 = Pepparkakssnigel("Gigantisk", 3, "Slöja")

snigel4 = Pepparkakssnigel("Mellan", 4)

snigel_lista = [snigel1, snigel2, snigel3, snigel4]

snigel_lista = [snigel1, snigel2, snigel3, snigel4]P

print(snigel_lista[2].storlek)

Vad kommer skrivas ut här?

Utskrift: Gigantisk

54 of 59

Jämföra objekt

54

För att kunna sortera våra objekt behöver vi definiera hur de kan jämföras. Det kan vi göra med hjälp av de inbyggda funktionerna __lt__, __gt__ och __eq__.

  • __lt__ - less than
  • __gt__ - greater than (behövs inte om vi har __lt__)
  • __eq__ - equal, använder vi för att tala om när objekt är lika

def __lt__ (self, other):

if self.brändhetsgrad < other.brändhetsgrad:

return True

else:

return False

När kan det vara bra att kunna jämföra objekt?

  • Användbart i olika villkor som krävs för programmets logik.
  • Nödvändigt för att kunna sortera objekten!

55 of 59

Övningsdatorprovet

55

Länk från vecka 46!

56 of 59

Övningsdatorprov

Fråga 16-20

56

57 of 59

Lära sig tillsammans

  • Ni får inte skicka era labblösningar till någon annan eller visa hela er läsning och förklara den.
  • Ni får prata om hur ni löser labben och visa delar av koden.
    • Visa mycket hellre kod som inte fungerar.
  • Ni får inte redigera i varandras kod

57

Målet är att ni ska lära er!

När du är klar med en labb borde du kunna göra den igen på betydligt kortare tid.

Det brukar vara svårt om en inte tagit sig igenom många av de jobbiga buggarna själv.

58 of 59

Allmännhandledningen

58

59 of 59

Labb 2

Lösenordskollaren

59

Deadline: Fredag 24/11