Föreläsning 13 Datalogi 1 DA2001 Hashtabeller Särfall (exception) klasser En hashtabell kan ses som en lista där programmeraren associerar egna nycklar (index) till varje element som ska läggas i tabellen : Nycklar: 5 1 12 Element: maj jan dec 1/16 Skapa hashtabell Skapa med måsvingar och par av nyckel och värde, enligt nedan: ht={1: jan, 12: dec, 5: maj } Skapa med dict(): ht=dict() ht[1]= jan ht[12]= dec ht[5]= maj 2/16 1
Identifiera element Element identifieras med nyckelobjekt, men det måste finnas ett objekt lagrat med given nyckel: print (ht[1]) print (ht[5]) print (ht[15]) Vad skrivs ut av ovanstående? 3/16 Kontrollerad åtkomst Alternativ 1: Kontrollera förekomst innan åtkomst. if 15 in ht: x = ht[15] Alternativ 2: Använd get() med defaultvärde: x = ht.get(15, FINNS EJ! ) y = ht.get(15) Vad får x och y för värde om 15 inte finns i tabellen? 4/16 Skapa hashtabell från listor Hashtabell kan skapas från två listor som att dra ihop ett blixtlås: keys= [1,12,5] values=[ jan, dec, maj ] parvis=zip(keys,values) ht=dict(parvis) zip 1 12 jan dec 5 maj 5/16 2
Listor med nycklar och värden en keys() returnerar en lista med alla nycklar en values() returerar en lista med alla värden keylist = list(ht.keys()) vallist = list(ht.values()) 6/16 Ytterligare operationer Antalet element i tabellen: len(ht) Ta bort element: del ht[12] Kopiera hela tabellen: htcopy = ht.copy() 7/16 Exception try och except är reserverade ord som används för hantering av exekveringsfel. plista= ['s','v','m','mp','fp','c','kd'] try: i=input( Ange index: ) i=int(i) parti=plista[i] except: print ( Nagot fel intraffade ) 8/16 3
Syntax try: Kod som kan orsaka något typ av exekveringsfel except: Kod som exekveras om och endast om det blir något fel i kodblocket efter try 9/16 Så här går det till Kod i blocket mellan try: och except: börjar exekvera, men så fort ett fel uppstår i någon rad avbryts exekveringen direkt, resterande rader i blocket exekveras inte och koden som finns i blocket efter except: börjar exekvera i stället. 10/16 Mer detaljerad plista= ['s','v','m','mp','fp','c','kd'] try: i=input('ange index: ') i=int(i) parti = plista[i] except IndexError: print ( ogilltigt index ) except ValueError: print ( index måste var ett tal except: print ( uppstod något okänd fel! ) 11/13 4
Typ IOError IndexError KeyError TypeError ValueError Olika typ av fel Beskrivning uppstår när man vill öppna en fil som inte finns. Uppstår vid tillgång till ett index i en lista som inte finns Uppstår när en nyckel inte finns i uppsalgslista Uppstår när en inbyggd operation eller funktion tillämpas på ett objekt av olämplig typ Uppstår när funktion används med ett parameter med korrekt typ men fel värde ZeroDivisionError Uppstår när divisor i en division är 0 12/13 Klass och instans (objekt) En klass är en mall för ett objekt t.ex. bil, konto Ett objekt är en instans av en klass t.ex. den röda bilen, mitt lönekonto Klass och instans Fördela följande till klasser och objekt a) En bok b) Boken Java från grunden c) Min kopia av Java från grunden d) Min hund e) Bilden av min hund medan han biter postmannen f) En bil g) En Chrysler 5
av en klass class Kurs(object): pass k1 = Kurs() k1.bet = prgi13 print (k1.bet) k2 = Kurs() k2.bet= datae12 print (k2.bet) er har samma syntax som funktioner med den skillnaden att de definieras i en klass. Tre metodtyper: en Instansmetoder hör till instansen. Klassmetoder hör till klassen och delas av ALLA instanser. 6
Konstruktor metod en init är konstruktor-metoden som skapar objekt av klassen. Konsruktorer är till för initiering av instansvariabler på ett smidigt sätt. En konstruktor definieras enligt nedan: def init (self, namn, beteckning): self.namn = namn self.bet = beteckning self self är en referensvariabel som refererar inifrån instansen till själva instansen. Ett objekt init (self,namn, ) Skapa klass class Kurs(object): totantalstuds= 0 def init (self, namn, beteckning): self.namn = namn self.bet = beteckning self.antal=0 def sattantalstudenter(self,a): self.antal=a Kurs.totAntalStuds += a 7
Skapa klass forts def genamn(self): return self.namn def gebeteckning(self): return self.bet def geantal(self): return self.antal @staticmethod def getotalantal(): return Kurs.totAntalStuds Använd klassen k1 = Kurs( DD1310, prgo15 ) k2 = Kurs( DD1343, datae08 ) print ( Antal studenter i \ kursen,k1.gebeteckning(), är,k1.geantal()) print ( Kursen, k2.gebeteckning(), har \ kurskoden,k2.gekod()) k2.sattantalstudenter(120) k1.sattantalstudenter(160) print(k1.getotalantal()), är väldigt lämplig för snabba sökningar try, except används för att hantera exekverings fel. Med hjälp av klasser höjer vi abstraktionsnivån 23/13 8