Föreläsning 7
Repetition föreläsning 1-6, extra fokus på klasser
1
Dagens agenda
2
Vi kan byta ordning, vill ni börja med klasser och objekt?
Övningsdatorprovet
3
Länk från vecka 46!
Namngivning av identifierare
Föreläsning 1, 4 & 6
Möbius: kapitel: 1, kapitel 5 & kapitel 9
Övningsdatorprov
Fråga 1-3
5
Menti
6
Identifierare
Identifierare är alla delar av koden som du döper själv. Dessa infattar:
7
Bra identifierarnamn ska vara tydliga!
De ska beskriva vad det är för typ av värde so sparas i dem!
Regler för variabler
8
”Variabler” som inte kan variera/byta värde kallas konstanter. Dessa skrivs med stora bokstäver!
Regler för övriga identifierare
Funktioner och metoder
Klasser
9
Attribut döps på samma sätt som variabler
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!!!!!
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.
Styrstrukturer – if/else, while & for
12
Föreläsning 2 & 3
Möbius: kapitel: 2 & kapitel 3
Övningsdatorprov
Fråga 4-6
13
Menti
14
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!
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
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:
Användarvänlig utdata
18
Kopplat till användning av print och input
Övningsdatorprov
Fråga 7-9
19
Vi återkommer till 9, den handlar om klasser och __str__-metoden!
Menti
20
Tydlig utdata för användaren
21
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”
Filöverföring
Föreläsning 5
Möbius: kapitel 7
Övningsdatorprov
Fråga 10-12
24
Menti
25
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
Filöverföring
27
Funktionen open() har flera modes som talar om vad du vill göra med filen. Vi har tittat på:
Om filen inte kan hittas så får du ett:
FileNotFoundError
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]))
Interaktiva program
Föreläsning 5
Möbius: kapitel 7
Övningsdatorprov
Fråga 13-15
30
Menti
31
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:
Användare skriver lätt fel!
Hur ska du hantera det?
Hantera fel…
33
Hjälp användaren med att inte göra fel!
Hantera fel med:
Låt användaren mata in ny input med:
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’.
Uppdelning i funktioner
35
Övningsdatorprov
Fråga 21
36
Vad är en funktion?
Fördelar med funktioner
Delar in koden i mer lätthanterliga delar
Ett kodstycke som:
Funktioner är ett exempel på abstraktion
🡪 vi gömmer funktionalitet i funktioner så att koden blir mer lättläst.
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!
Skapa egna klasser
39
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.
Klasser & Objekt
41
Snigelobjekt1
class Pepparkakssnigel
Skapar snigelobjekt
Snigelobjekt2
Snigelobjekt3
Poängen med klasser är att vi vill skapa objekt!
Attribut och metoder till Pepparkakssnigel
Objekten har olika egenskaper
- Dessa definieras som attribut i klassen!
Pepparkakssnigelns attribut:
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:
Metoder
De funktioner som hör ihop med klasserna kallar vi för metoder.
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
Hur skriver vi för att skapa ett pepparkakssnigelobjekt som har följande egenskaper?
44
Attribut
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")
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.
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
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!
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")
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
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
Att ha flera objekt
51
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]
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
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__.
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?
Övningsdatorprovet
55
Länk från vecka 46!
Övningsdatorprov
Fråga 16-20
56
Lära sig tillsammans
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.
Allmännhandledningen
58
Labb 2
Lösenordskollaren
59
Deadline: Fredag 24/11