Moduler Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program. Vi har också ofta behov av att skapa överblick i våra program. Som ett typvärde anges ibland att få människor kan överblicka mer än ett A4 fyllt med programkod. För båda ändamålen har ett hjälpmedel som vi redan har använt några gånger. En modul i är python-programkod som lagts i en egen fil. Typiskt lägger man datastrukturer och funktioner för att bearbeta datastrukturerna eller bara funktioner i filerna. Vi ska se några enkla exempel på hur man kan gå tillväga. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 1 / 19
Moduler... Exempel: Filen upcase.py innehåller följande funktion för att göra en ny teckensträng med bara versaler. Ingen bra metod men den fungerar. def upcase(s): res = for c in s: if c >= a and c <= z : res += chr(ord(c) - ord( a ) + ord( A )) elif c == å : res += Å elif c == ä : res += Ä elif c == ö : res += Ö else: res += c return res DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 2 / 19
Moduler... Följande enkla huvudprogram utnyttjar modulen import upcase while True: try: inp = input( skriv något : ) upc = upcase.upcase(inp) # OBS anropet! print(" ", inp, " efter upcase: ", upc, " ", sep= ) except: print( Hej då! ) break DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 3 / 19
Moduler... Vi kan inkludera delar av en modul så att vi inte behöver använda filnamnet som prefix: from upcase import upcase while True: try: inp = input( skriv något : ) upc = upcase(inp) # OBS anropet! print(" ", inp, " efter upcase: ", upc, " ", sep= ) except: print( Hej då! ) break DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 4 / 19
Moduler klass I finns en sorts modul som kallas klass. En klass kan användas som en slags container för vad som helst. Klassbegreppet finns i många programspråk men är lite speciellt i. Eftersom man kan stoppa vad som helst i en klass kan den användas för att kapsla in både datastrukturer, funktioner och andra klasser. Det är lätt att dra parallellen med andra programspråk som kallas objektorienterade men s klasser är mera som säckar där man kan lägga undan vad som helst. Ex.: Med definitionen >>> class container: pass så har vi skapat en behållare för vad som helst DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 5 / 19
Moduler klass... Nu kan vi skapa ett objekt som fungerar just som en container Först skapar vi objektet: >>> c = container() sedan stoppar vi in något: >>> c.något = skräp >>> c.någotannat = 3 Så kan vi plocka ut det vi lagrat >>> print(c.något) skräp >>> print(c.någotannat) 3 DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 6 / 19
Moduler enkel ordnad lista Antag att vi vill ha en lista som vi vill manipulera på ett speciellt sätt. Det finns ett förutbestämt gränssnitt: full() empty() full(l) insert(e) delete(k) retrieve(k) clear() Lista DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 7 / 19
Moduler enkel ordnad lista... full() ger True om listan är full (vilket den inte kan bli) empty() ger True om listan är tom insert(e) stoppar in e på rätt plats i listan retrieve(k) hämtar ut elementet med nyckel k eller skickar ut None om det inte finns något element med nyckel k delete(k) tar bort elementet med nyckel k från listan (om det finns) member(k) ger True om elementet med nyckel k finns i listan clear() tömmer listan DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 8 / 19
Moduler enkel ordnad lista... class minlista: def key(self, e): return e def init (self, key=none): self. L = [] if key: self. key = key def full(self): return False def empty(self): return len(self. L) == 0 def insert(self, e): self. L.append(e) try: self. L.sort(key=self. key) except: self. L.remove(e) print("kunde inte lägga till: ", e, " ", sep= ) DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 9 / 19
Moduler enkel ordnad lista... Jag gömmer en lista kallad L inne i modulen. Gömmer är nog inte rätta ordet eftersom den går att komma åt utifrån. Observera att alla funktioner har en formell parameter self, den första om det finns mer än den, som måste finnas med. Konventionen säger att den ska heta self men den kan heta vad som helst. Bäst att följa konventionen. Konventionen (inte regel, alltså) säger också att om det finna en funktion som heter init så ska den köras när man skapar ett objekt, se test-huvudprogrammet ett par bilder framåt. Min init -funktion tar dessutom en parameter som inte behöver skickas med (key=none), där None är default och vi kan se i koden att om man skickar med en funktion så kommer den installeras under namnet _key och användas för identifiering och sortering. I övrigt är det bara funktionen insert som är knepig. Jag sätter in och sorterar men om sorteringen inte fungerar tar jag bort det sist insatta elementet. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 10 / 19
Moduler enkel ordnad lista... def delete(self, k): for e in self. L: if self. key(e) == k: self. L.remove(e) return def retrieve(self, k): for e in self. L: if self. key(e) == k: return e def clear(self): while not self.empty(): del self. L[0] def show(self): print(self. L) DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 11 / 19
Moduler enkel ordnad lista... litet testprogram import minlista kmd = [ full?, empty?, insert, delete, retrieve, member?, clear, show, end ] L = minlista.minlista() while True: kommandorad = input( Kommando: ) kommandolista = kommandorad.split( ) kommando = kommandolista[0] if len(kommandolista) > 1: arg = kommandolista[1] if kommando not in kmd: print("okänt kommando: ", kommando, " ", sep= ) elif kommando == end : break elif kommando == full? : print(l.full()) elif kommando == empty? : print(l.empty()) elif kommando == insert : L.insert(arg) elif kommando == delete : L.delete(arg) elif kommando == retrieve : L.retrieve(arg) elif kommando == member? : L.member(arg) elif kommando == clear : L.clear() elif kommando == show : L.show() DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 12 / 19
Moduler enkel ordnad lista... test Man kan testa direkt utan testprogram >>> import minlista >>> def k(e): return e[ key ] >>> L = minlista.minlista(key=k) >>> L.empty() True >>> L.full() False >>> L.insert({ key :23, value : tjugotre }) >>> L.insert({ key :56, value : femtiosex }) >>> L.insert({ key :5, value : fem }) >>> L.show() [{ value : fem, key : 5}, { value : tjugotre, key : 23}, { value : femtiosex, key : 56}] >>> L.insert(3) Kunde inte lägga till: 3 DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 13 / 19
Moduler kö I vissa sammanhang behöver man köa saker och ting, d.v.s. stoppa in dem i en datastruktur tills vidare och sedan hämta dem i samma ordningsföljd för att utföra någon åtgärd. Köer används i många sammanhang, t.ex.: för studium av väntetider, för att lagra händelser i datorn så de kan åtgärdas i tur och ordning, eller för att simulera händelser (tidsnotiser). En kö är en vanlig datastruktur. Man tar alltid ut saker i samma ordning som man stoppar in dem. Det enda man kan göra är stoppa in och ta ut element, eventuellt kolla om kön är tom, eventuellt också kunna tömma kön. enqueue dequeue rear front DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 14 / 19
Moduler kö... class myqueue: Q = None def init (self): self. Q = [] def full(self): return False def empty(self): return len(self. Q) == 0 def enqueue(self, e): if self.empty(): self. Q = [e] else: self. Q.insert(0, e) def dequeue(self): if self.empty(): return None return self. Q.pop() def show(self): print(self. Q) DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 15 / 19
Moduler Kö... I modulen har jag gömt en krok för att hänga en lista på: Q = None och i övrigt innehåller modulen endast det grundläggande för att hantera en kö. OBS! att jag har med en kontroll av om kön är full. Behövs inte men många implementationer av kö har en övre begränsning, så för kompatibilitet med andra, mer begränsade köer, finns kontrollen med. Kanske någon använder den. Det är två viktiga punkter: Kompatibilitet med andra implementationer och minimalitet (gör bara det som behövs inget extra). Man måste kunna lita på att den som gjort modulen har gjort så den fungerar enligt alla specifikationer. Man ska inte behöva titta in i koden för att se efter. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 16 / 19
Moduler... Stack En annan vanligt speciallista är stack. Man stoppar in och tar ut i samma ände. Först in sist ut. Vanliga användningsområden är anropsstack för rekursion och för beräkning av uttryck. push pop top bottom DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 17 / 19
Moduler... Stack Funktioner (och gängse terminologi): push(e) pop() empty() full() stoppa in elementet e i stacken hämta ut det sist instoppade elementet och ta bort det ur stacken återsänder True om stacken är tom True om stacken är full Eventuellt också top(), en funktion för att tjuvtitta på översta elementet. I labb 7 kommer ni vara tvungna att bygga en stack. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 18 / 19
Moduler som finns i som standard levereras med en massa moduler, bl.a.: math cmath array det mesta man behöver för matematik komplexa tal effektiv hantering av matriser och indexerade listor Dessutom hela bibliotek med moduler för olika ändamål, ibland i stor variation för olika tycke och smak, t.ex. för: GUI (Graphical User Interface) Databasaccess Bildhantering Nätverkshantering Se http://wiki.python.org/moin/usefulmodules här finns länkar till det mesta i modulväg som bjuder på DA2001 (Föreläsning 14) Datalogi 1 Hösten 2011 19 / 19