Grundläggande datalogi - Övning 2 Björn Terelius November 7, 2008
Klasser skapas med nyckelordet class Klasser Konstruktorer och destruktorer Undantagshantering class MyClass: Docstring and doctests for the class def MemberFunction1(self):... def MemberFunction2(self, arg):... Klassen kan sedan instansieras och användas x = MyClass() x.memberfunction1() x.memberfunction2(15)
Klasser Konstruktorer och destruktorer Undantagshantering När ett objekt konstrueras körs metoden init () När ett object destrueras körs metoden del () I Python skapar man normalt medlemsvariabler i init () class FileHandle: def init (self, filename): self.file = open(filename) def del (self): self.file.close()
Klasser Konstruktorer och destruktorer Undantagshantering En exception kastas på följande sätt raise ExceptionTyp('Felmeddelande') och fångas med try:... except ExceptionTyp, namn... Exceptions används främst för att hantera fel som uppstår då programmet exekveras
En stack kan implementeras som en länkad lista av noder class Node: def init (self, item, next): "The constructor initializes member varibles" self.item = item self.next = next Själva stacken innehåller bara en referens till den första noden class Stack: A concrete implementation of an ADT stack def init (self): self.top = None
def empty(self): Returns True if the queue is empty and False otherwise return self.top==none def push(self, item): Puts an element on the top of the stack self.top = Node(item, self.top)
def pop(self): Removes an element from the top of the stack and returns the removed element. Raises an exception if the stack was empty if self.empty(): raise Exception("Empty stack") top_item = self.top.item self.top = self.top.next return top_item
Partitionera en lista Vända på en kö En RPN kalkylator Stackar används ofta för att spara temporära resultat. def partition_list(l, pivot): small=stack() large=stack() for x in l: if x<pivot: small.push(x) else: large.push(x) for i in range(len(l)-1, -1, -1): if not large.empty(): l[i] = large.pop() else: l[i] = small.pop() return l
Partitionera en lista Vända på en kö En RPN kalkylator Sista elementet som sätts in i en stack är det första som kommer tas ut. Detta kan användas för att vända på ordningen i andra datastrukturer. def reverse_queue(q): Takes a queue q as input and reverses it s = Stack() while not q.empty(): s.push(q.dequeue()) while not s.empty(): q.enqueue(s.pop()) return q
Partitionera en lista Vända på en kö En RPN kalkylator from stack import Stack def tokenize(s): Returns a list of tokens t = s.split() return t
Partitionera en lista Vända på en kö En RPN kalkylator def eval_postfix(tokens): operands = Stack() for t in tokens: if t in "+-*/": operand2 = operands.pop() operand1 = operands.pop() result = compute(t, operand1, operand2) operands.push(result) else: operands.push(float(t)) result = operands.pop() if not operands.empty(): raise Exception("Too few operators") return result
Partitionera en lista Vända på en kö En RPN kalkylator def compute(op, lhs, rhs): if op=='+': return lhs+rhs elif op=='-': return lhs-rhs elif op=='*': return lhs*rhs elif op=='/': return lhs/rhs else: raise Exception("Invalid operator")
Partitionera en lista Vända på en kö En RPN kalkylator def rpn_calculator(): while True: s = raw_input("input> ") if not s: break try: result = eval_postfix(tokenize(s)) print result except Exception, e: print "Illegal syntax:", e
Partitionera en lista Vända på en kö En RPN kalkylator >>> from rpn import * >>> rpn_calculator() Input> 1 2 / 3 + 3.5 Input> 3 1.2 3.8 + * 15.0 Input> 3 4 + - Illegal syntax: Empty stack Input> 5 6 7 + Illegal syntax: Too few operators Input> >>> ^D