Dies ist die Support Website des Buches:: Das Python Praxisbuch Der große Profi-Leitfaden für Programmierer Farid Hajji Addison Wesley / Pearson Education ISBN 978-3-8273-2543-3 (Sep 2008), 1298 Seiten. **************** 7. Dictionarys **************** Dictionary-Literale =================== Dictionarys abfragen und verändern ================================== Was tun bei nicht-existierenden Einträgen? ------------------------------------------ Wie verändert man Dictionarys? ------------------------------ Skizze: * `Wie sieht unsere komplexe Datenstruktur compdir aus? `_ Dictionarys mit Default-Initialwerten (setdefault) -------------------------------------------------- Dictionarys durchlaufen ======================= Screenshots: * `Folgende Methoden bietet der dict-Datentyp an `_ Dictionarys effizient durchlaufen --------------------------------- Dictionarys kopieren ==================== Skizzen: * `Zuweisung von Dictionary-Variablen `_ * `Eine flache Kopie (shallow copy) von Dictionarys `_ * `Probleme bei der flachen Kopie `_ * `Das Problem der geminsamen Referenzen bei flacher Kopie `_ * `Tiefe Kopie (deep copy) von Dictionarys mit copy.deepcopy `_ Anwendung: word count ===================== Zu indizierende Eingabedatei: .. literalinclude:: ../att/dictionaries/wordcount.dat `wordcount.dat `_ mit folgendem Programm: .. literalinclude:: ../att/dictionaries/wordcount.py `wordcount.py `_ Iteratoren und Generatoren ========================== Was ist ein Iterator? --------------------- Einen eigenen Iterator schreiben -------------------------------- Die Klasse ``TimerIterator``:: import time class TimerIterator(object): def __init__(self, interval=1): self.interval = interval def next(self): time.sleep(self.interval) return int(time.time()) # Return current time Die Klasse ``Timer``:: class Timer(object): def __init__(self, interval=1): self.the_iterator = TimerIterator(interval) def __iter__(self): return self.the_iterator Eine Klasse mit integriertem Iterator ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Die Klasse ``Timer2``:: class Timer2(object): class TimerIterator(object): def __init__(self, interval=1): self.interval = interval def next(self): time.sleep(self.interval) return int(time.time()) # Return current time def __init__(self, interval=1): self.the_iterator = Timer2.TimerIterator(interval) def __iter__(self): return self.the_iterator Die Klasse ``Timer3``:: class Timer3(object): def __init__(self, interval=1): self.interval = interval def __iter__(self): return self def next(self): time.sleep(self.interval) return int(time.time()) # Return current time Die Klasse ``Timer4``:: class Timer4(object): def __init__(self, interval=1): self.interval = interval self.ticks = -1L def __iter__(self): return self def next(self): time.sleep(self.interval) self.ticks = self.ticks + 1L return self.ticks, int(time.time()) Generatoren ----------- Die Klasse ``SortedDictIterable``:: class SortedDictIterable(object): def __init__(self, thedict={}): self.thedict = thedict def __iter__(self): self.thekeys = self.thedict.keys() self.thekeys.sort() self.index = -1 return self def next(self): self.index = self.index + 1 if self.index >= len(self.thekeys): raise StopIteration return self.thekeys[self.index] Es geht einfacher mit Generatoren:: def sorted_dict_generator(aDict): thekeys = aDict.keys() thekeys.sort() for key in thekeys: yield key Generator-Ausdrücke ^^^^^^^^^^^^^^^^^^^ Die unbegrenzte Funktion ``urange``:: def urange(start=0L): "Unlimited range generator" index = start while True: yield index index = index + 1L Zusammenfassung ===============