v Inhalt Teil 1 Grundlagen 1 1 Erste Schritte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Die Programmierumgebung einrichten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Python 2 und 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Python-Codeausschnitte ausführen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hello World! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 4 5 Python auf verschiedenen Betriebssystemen . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Python unter Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Python unter OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Python unter Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Fehlersuche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Python-Programme im Terminal ausführen . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Unter Linux und OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Unter Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2 Variablen und einfache Datentypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Was bei der Ausführung von hello_world.py wirklich geschieht . . . . . . . . . . 21 Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Variablen benennen und verwenden . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Fehler bei Variablennamen vermeiden . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Groß- und Kleinschreibung mithilfe von Methoden ändern . . . . . . . . . Strings verketten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Weißraum hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Weißraum entfernen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Syntaxfehler bei der Stringverarbeitung vermeiden . . . . . . . . . . . . . . . . Die Print-Anweisung in Python 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 26 27 28 29 30 32 vi Inhalt Zahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fließkommazahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Typisierungsfehler mithilfe der Funktion str() vermeiden . . . . . . . . . . . . Integer in Python 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 33 34 34 35 Kommentare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Wie werden Kommentare geschrieben? . . . . . . . . . . . . . . . . . . . . . . . . . 37 Was für Kommentare sind sinnvoll? . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 The Zen of Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3 Eine Einführung in Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Was sind Listen? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elemente in einer Liste ansprechen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Indizes beginnen bei 0, nicht bei 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einzelne Werte aus einer Liste verwenden . . . . . . . . . . . . . . . . . . . . . . . 41 42 43 43 Elemente ändern, hinzufügen und entfernen . . . . . . . . . . . . . . . . . . . . . . . . . Elemente in einer Liste ändern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elemente zu einer Liste hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elemente aus einer Liste entfernen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 45 45 47 Listen ordnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listen mit sort() dauerhaft sortieren . . . . . . . . . . . . . . . . . . . . . . . . . . . Listen mit der Funktion sorted() vorübergehend sortieren . . . . . . . . . . . Listen in umgekehrter Reihenfolge ausgeben . . . . . . . . . . . . . . . . . . . . . Die Länge einer Liste ermitteln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 52 52 53 54 Indexfehler vermeiden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4 Mit Listen arbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Eine komplette Liste durchlaufen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Schleife im Detail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Weitere Aufgaben in einer for-Schleife erledigen . . . . . . . . . . . . . . . . . . Aktionen nach der for-Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 60 61 63 Einrückungsfehler vermeiden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vergessene Einrückung der ersten Zeile in einer Schleife . . . . . . . . . . . . Vergessene Einrückung nachfolgender Zeilen . . . . . . . . . . . . . . . . . . . . Unnötige Einrückung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Unnötige Einrückung nach einer Schleife . . . . . . . . . . . . . . . . . . . . . . . Vergessener Doppelpunkt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 64 65 65 66 67 Inhalt vii Numerische Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Funktion range() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Numerische Listen mithilfe von range() aufstellen . . . . . . . . . . . . . . . . . Einfache Statistiken für numerische Listen . . . . . . . . . . . . . . . . . . . . . . Listennotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 68 69 70 71 Teillisten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einen Slice erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einen Slice in einer Schleife durchlaufen . . . . . . . . . . . . . . . . . . . . . . . . Listen kopieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 72 74 75 Tupel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Tupel definieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Werte in einem Tupel durchlaufen . . . . . . . . . . . . . . . . . . . . . . . . . Tupel überschreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 78 79 79 Code formatieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Gestaltungsrichtlinien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einrückung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zeilenlänge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Leerzeilen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 80 81 81 82 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 5 if-Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Ein einfaches Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Bedingungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prüfung auf Gleichheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Groß- und Kleinschreibung bei der Prüfung auf Gleichheit . . . . . . . . . . Prüfung auf Ungleichheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Numerische Vergleiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prüfung auf mehrere Bedingungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prüfung auf Vorhandensein eines Werts in einer Liste . . . . . . . . . . . . . . Prüfung auf Abwesenheit eines Werts in einer Liste . . . . . . . . . . . . . . . . Boolesche Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 86 87 88 89 90 91 91 92 if-Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einfache if-Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . if-else-Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die if-elif-else-Kette . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mehrere elif-Blöcke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den else-Block weglassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mehrere Bedingungen prüfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 93 94 95 97 97 98 viii if-Anweisungen für Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prüfung auf besondere Elemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prüfung auf nicht leere Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mehrere Listen verwenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inhalt 101 101 102 103 if-Anweisungen gestalten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 6 Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Ein einfaches Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Umgang mit Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zugriff auf die Werte in einem Dictionary . . . . . . . . . . . . . . . . . . . . . . Schlüssel-Wert-Paare hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein leeres Dictionary als Ausgangspunkt . . . . . . . . . . . . . . . . . . . . . . . Werte in einem Dictionary ändern . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schlüssel-Wert-Paare entfernen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Dictionary aus ähnlichen Objekten . . . . . . . . . . . . . . . . . . . . . . . . 108 109 110 110 111 113 113 Dictionaries in einer Schleife durchlaufen . . . . . . . . . . . . . . . . . . . . . . . . . . Alle Schlüssel-Wert-Paare durchlaufen . . . . . . . . . . . . . . . . . . . . . . . . Alle Schlüssel in einem Dictionary durchlaufen . . . . . . . . . . . . . . . . . . Die Schlüssel in einem Dictionary geordnet durchlaufen . . . . . . . . . . . Alle Werte in einem Dictionary durchlaufen . . . . . . . . . . . . . . . . . . . . 116 116 118 120 121 Verschachtelung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dictionaries in einer Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listen in einem Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dictionaries in einem Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 123 126 128 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 7 Benutzereingaben und while-Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Die Funktion input() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Klar verständliche Eingabeaufforderungen schreiben . . . . . . . . . . . . . Verwendung von int() für numerische Eingaben . . . . . . . . . . . . . . . . . Der Modulo-Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Benutzereingaben in Python 2.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 132 133 135 136 while-Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . while-Schleifen in Aktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programmbeendigung durch den Benutzer . . . . . . . . . . . . . . . . . . . . . Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Schleife mit break verlassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 136 137 139 140 Inhalt ix Die Anweisung continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 Endlosschleifen vermeiden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 while-Schleifen für Listen und Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . Elemente von einer Liste in eine andere verschieben . . . . . . . . . . . . . . Alle Vorkommen eines Wertes aus einer Liste entfernen . . . . . . . . . . . Ein Dictionary mit Benutzereingaben füllen . . . . . . . . . . . . . . . . . . . . 143 144 145 145 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 8 Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Funktionen definieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Informationen an eine Funktion übergeben . . . . . . . . . . . . . . . . . . . . . 150 Argumente und Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Argumente übergeben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Positionsabhängige Argumente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schlüsselwortargumente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Standardwerte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gleichwertige Funktionsaufrufe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Argumentfehler vermeiden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 152 154 155 156 157 Rückgabewerte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einen einfachen Wert zurückgeben . . . . . . . . . . . . . . . . . . . . . . . . . . . Optionale Argumente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Dictionary zurückgeben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funktionen in einer while-Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 159 159 161 162 Eine Liste übergeben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Eine Liste mithilfe einer Funktion ändern . . . . . . . . . . . . . . . . . . . . . . 165 Die Änderung einer Liste in einer Funktion verhindern . . . . . . . . . . . . 168 Beliebig viele Argumente übergeben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Positionsabhängige Argumente und Argumente beliebiger Anzahl kombinieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Beliebig viele Schlüsselwortargumente übergeben . . . . . . . . . . . . . . . . 171 Funktionen in Modulen speichern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein komplettes Modul importieren . . . . . . . . . . . . . . . . . . . . . . . . . . . Einzelne Funktionen importieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Funktion mit »as« umbenennen . . . . . . . . . . . . . . . . . . . . . . . . . Ein Modul mit »as« umbenennen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Alle Funktionen eines Moduls importieren . . . . . . . . . . . . . . . . . . . . . 173 173 174 175 176 176 Funktionen formatieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 x Inhalt 9 Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 Eine Klasse erstellen und verwenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Die Klasse Dog erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Eine Instanz einer Klasse anlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Mit Klassen und Instanzen arbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Klasse Car . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einen Standardwert für ein Attribut festlegen . . . . . . . . . . . . . . . . . . . Attributwerte bearbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 187 188 189 Vererbung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Methode __init__() für eine Kindklasse . . . . . . . . . . . . . . . . . . . . . Vererbung in Python 2.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Attribute und Methoden der Kindklasse definieren . . . . . . . . . . . . . . . Methoden der Elternklasse überschreiben . . . . . . . . . . . . . . . . . . . . . . Instanzen als Attribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Reale Objekte modellieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 193 195 195 196 197 199 Klassen importieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine einzelne Klasse importieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mehrere Klassen in einem Modul speichern . . . . . . . . . . . . . . . . . . . . Mehrere Klassen aus einem Modul importieren . . . . . . . . . . . . . . . . . Ein gesamtes Modul importieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Alle Klassen eines Moduls importieren . . . . . . . . . . . . . . . . . . . . . . . . Ein Modul in ein Modul importieren . . . . . . . . . . . . . . . . . . . . . . . . . Ihren eigenen Arbeitsablauf finden . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 201 203 204 205 205 206 207 Die Standardbibliothek von Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 Klassen formatieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 10 Dateien und Ausnahmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 Aus Dateien lesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine gesamte Datei lesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dateipfade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zeilenweises Lesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Liste aus den Zeilen einer Datei erstellen . . . . . . . . . . . . . . . . . . . Dateiinhalte verarbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Große Dateien: eine Million Stellen . . . . . . . . . . . . . . . . . . . . . . . . . . . Ist Ihr Geburtsdatum in Pi enthalten? . . . . . . . . . . . . . . . . . . . . . . . . . 212 212 214 215 216 217 218 219 In Dateien schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 In eine leere Datei schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Inhalt xi Mehrere Zeilen schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Text an eine Datei anhängen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Ausnahmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Division durch null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . try-except-Blöcke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Abstürze mithilfe von Ausnahmen verhindern . . . . . . . . . . . . . . . . . . . Der else-Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Datei nicht gefunden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Text analysieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Umgang mit mehreren Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fehler stillschweigend übergehen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Welche Fehler sollten Sie melden und welche nicht? . . . . . . . . . . . . . . 223 224 224 225 226 227 228 230 231 232 Daten speichern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . json.dump() und json.load() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Benutzergenerierte Daten speichern und lesen . . . . . . . . . . . . . . . . . . . Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 234 235 237 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 11 Code testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Funktionen testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 Unit Tests und Testfälle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Ein bestandener Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Ein nicht bestandener Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 Was tun bei einem nicht bestandenen Test? . . . . . . . . . . . . . . . . . . . . . 248 Neue Tests hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 Klassen testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verschiedene Zusicherungsmethoden . . . . . . . . . . . . . . . . . . . . . . . . . Eine Beispielklasse zum Testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Klasse AnonymousSurvey testen . . . . . . . . . . . . . . . . . . . . . . . . . . Die Methode setUp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 251 252 254 256 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Teil 2 Projekte 259 Alien Invasion – ein Python-Spiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 Datenvisualisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 Webanwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 xii Inhalt Projekt 1: Alien Invasion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 12 Das eigene Kampfschiff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 Das Projekt planen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 Pygame installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Python-Pakete mit pip installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pygame unter Linux installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pygame unter OS X installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pygame unter Windows installieren . . . . . . . . . . . . . . . . . . . . . . . . . . 265 265 267 269 269 Das Spielprojekt beginnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Pygame-Fenster anlegen und auf Benutzereingaben reagieren . . . . Die Hintergrundfarbe festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Klasse für Einstellungen anlegen . . . . . . . . . . . . . . . . . . . . . . . . . 270 270 272 272 Das Bild eines Raumschiffs hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Die Klasse Ship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 Das Schiff auf den Bildschirm zeichnen . . . . . . . . . . . . . . . . . . . . . . . . 277 Refactoring des Moduls game_functions . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 Die Funktion check_events() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 Die Funktion update_screen() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Das Schiff bewegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Auf Tastenbetätigungen reagieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kontinuierliche Bewegung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bewegung nach rechts und links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Geschwindigkeit des Schiffes anpassen . . . . . . . . . . . . . . . . . . . . . Den Bewegungsbereich des Schiffes einschränken . . . . . . . . . . . . . . . . Refactoring von check_events() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 281 282 284 285 287 288 Zwischenstand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . alien_invasion.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . settings.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . game_functions.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ship.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 289 289 289 289 Geschosse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einstellungen für Geschosse hinzufügen . . . . . . . . . . . . . . . . . . . . . . . Die Klasse Bullet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Geschosse in Gruppen speichern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Geschosse abfeuern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Alte Geschosse löschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 290 290 292 294 295 Inhalt xiii Die Anzahl der Geschosse begrenzen . . . . . . . . . . . . . . . . . . . . . . . . . . 296 Die Funktion update_bullets() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 Die Funktion fire_bullet() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 13 Die Außerirdischen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 Überblick über das Projekt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 Das erste Invasionsschiff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Klasse Alien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Instanz von Alien erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Invasionsschiff auf den Bildschirm zeichnen . . . . . . . . . . . . . . . . . 303 304 304 305 Die Invasionsflotte erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wie viele Invasionsschiffe passen in eine Reihe? . . . . . . . . . . . . . . . . . Reihen von Invasionsschiffen erstellen . . . . . . . . . . . . . . . . . . . . . . . . Die Flotte erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Refactoring von create_fleet() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Reihen hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 306 307 308 310 311 Die Flotte in Bewegung setzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Invasoren nach rechts bewegen . . . . . . . . . . . . . . . . . . . . . . . . . . . Einstellungen für die Flugrichtung der Flotte . . . . . . . . . . . . . . . . . . . . Auf Randberührungen prüfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sinken und Flugrichtung ändern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 315 316 316 317 Invasoren abschießen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kollisionen von Geschossen erkennen . . . . . . . . . . . . . . . . . . . . . . . . . Größere Geschosse zu Testzwecken . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Flotte auffüllen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Geschosse beschleunigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Refactoring von update_bullets() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 319 320 321 322 323 Spielende . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kollisionen zwischen Invasoren und dem eigenen Schiff erkennen . . . Auf Kollisionen zwischen Invasoren und dem eigenen Schiff reagieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wenn Invasoren den unteren Bildschirmrand erreichen . . . . . . . . . . . . Game over! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 324 325 328 329 Welche Teile des Spiels müssen ausgeführt werden? . . . . . . . . . . . . . . . . . . . 329 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 xiv Inhalt 14 Das Wertungssystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Eine Play-Schaltfläche hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Klasse Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Schaltfläche auf den Bildschirm zeichnen . . . . . . . . . . . . . . . . . . . Das Spiel starten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Spiel zurücksetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Play-Schaltfläche deaktivieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Mauszeiger ausblenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 332 334 335 336 338 338 Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 Die Geschwindigkeitseinstellungen ändern . . . . . . . . . . . . . . . . . . . . . 340 Die Geschwindigkeit zurücksetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 Die Punktwertung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Punktestand anzeigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Anzeigetafel erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Punktestand bei jedem Abschuss erhöhen . . . . . . . . . . . . . . . . . . Alle Treffer berücksichtigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Punktwert erhöhen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Punktestand runden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Highscore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Level anzeigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Anzahl der verfügbaren Schiffe anzeigen . . . . . . . . . . . . . . . . . . . . 342 343 344 346 348 348 349 351 354 357 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 Projekt 2: Datenvisualisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 15 Daten generieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 Die Bibliothek matplotlib installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Unter Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Unter OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Unter Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . matplotlib testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die matplotlib-Galerie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 366 367 367 368 368 Einfache Liniendiagramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beschriftung und Linienstärke ändern . . . . . . . . . . . . . . . . . . . . . . . . . Das Diagramm korrigieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einzelne Punkte mit scatter() darstellen und gestalten . . . . . . . . . . . . . Eine Folge von Punkten mit scatter() ausgeben . . . . . . . . . . . . . . . . . . Daten automatisch berechnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 369 370 371 373 374 Inhalt xv Die Umrandungen der Punkte entfernen . . . . . . . . . . . . . . . . . . . . . . . Eigene Farben festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Colormap verwenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagramme automatisch speichern . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 375 376 377 Zufallsbewegungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Klasse RandomWalk() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Richtungen wählen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Zufallspfad als Diagramm ausgeben . . . . . . . . . . . . . . . . . . . . . . Mehrere Zufallspfade erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Pfad gestalten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Punkte färben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Start- und Endpunkte anzeigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Achsen entfernen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Datenpunkte hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Größe an den Bildschirm anpassen . . . . . . . . . . . . . . . . . . . . . . . . 377 378 379 380 381 382 382 383 384 384 386 Würfeln mit Pygal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pygal installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Pygal-Galerie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Klasse Die . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Würfeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Ergebnisse analysieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Histogramm erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ergebnisse bei zwei Würfeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Würfel unterschiedlicher Flächenzahl . . . . . . . . . . . . . . . . . . . . . . . . . 387 387 388 388 388 389 390 391 393 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 16 Daten herunterladen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 Das Dateiformat CSV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CSV-Spaltenköpfe analysieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Spaltenköpfe und ihre Position ausgeben . . . . . . . . . . . . . . . . . . . Daten entnehmen und lesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Daten in einem Temperaturdiagramm darstellen . . . . . . . . . . . . . . . . . Das Modul datetime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Datumsangaben im Diagramm darstellen . . . . . . . . . . . . . . . . . . . . . . Ein Diagramm für einen längeren Zeitraum . . . . . . . . . . . . . . . . . . . . Eine zweite Datenreihe darstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einen Diagrammbereich einfärben . . . . . . . . . . . . . . . . . . . . . . . . . . . Fehlerprüfung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398 398 400 400 402 403 404 405 406 408 409 xvi Globale Daten im JSON-Format visualisieren . . . . . . . . . . . . . . . . . . . . . . . Daten zur Weltbevölkerung herunterladen . . . . . . . . . . . . . . . . . . . . . Relevante Daten entnehmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Strings in numerische Werte umwandeln . . . . . . . . . . . . . . . . . . . . . . . Zweistellige Ländercodes ermitteln . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Weltkarte zeichnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Numerische Daten auf einer Weltkarte darstellen . . . . . . . . . . . . . . . . Eine vollständige Karte der Weltbevölkerung . . . . . . . . . . . . . . . . . . . Länder nach der Bevölkerungszahl gruppieren . . . . . . . . . . . . . . . . . . Weltkarten in Pygal gestalten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Farbpalette aufhellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inhalt 412 412 412 414 415 417 419 420 422 424 425 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427 17 APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 Web-APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Git und GitHub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Daten über einen API-Aufruf anfordern . . . . . . . . . . . . . . . . . . . . . . . Das Paket requests installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . API-Antworten verarbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Antwort-Dictionary verarbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Überblick über die höchstbewerteten Repositories . . . . . . . . . . . . Grenzwerte für die API-Aufrufrate . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 430 430 431 432 433 435 436 Repositories mit Pygal visualisieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pygal-Diagramme verbessern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eigene Tooltips hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Beschreibungen als Tooltips ausgeben . . . . . . . . . . . . . . . . . . . . . . Aktive Links zu dem Diagramm hinzufügen . . . . . . . . . . . . . . . . . . . . 437 439 441 442 444 Die API von Hacker News . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 Projekt 3: Webanwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 18 Erste Schritte mit Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 Ein Projekt einrichten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Spezifikation schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine virtuelle Umgebung erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Paket virtualenv installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die virtuelle Umgebung aktivieren . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 452 452 453 454 Inhalt xvii Django installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Projekt in Django erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Datenbank erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Projekt anzeigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454 455 455 456 Eine App anlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modelle definieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modelle aktivieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Admin-Site von Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Modell für die Einträge definieren . . . . . . . . . . . . . . . . . . . . . . . . Das Modell Entry in die Datenbank aufnehmen . . . . . . . . . . . . . . . . . Das Modell Entry auf der Admin-Site registrieren . . . . . . . . . . . . . . . . Die Django-Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458 458 460 461 464 465 465 466 Seiten erstellen: die Startseite von Learning Log . . . . . . . . . . . . . . . . . . . . . Eine URL zuordnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Ansicht schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eine Vorlage schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 469 471 472 Weitere Seiten erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473 Vererbung bei Vorlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474 Die Seite Topics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476 Einzelne Fachgebietsseiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 Die Vorlage für eine Fachgebietsseite . . . . . . . . . . . . . . . . . . . . . . . . . . 481 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483 19 Benutzerkonten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485 Dateneingabe durch die Benutzer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Neue Fachgebiete hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Neue Einträge hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einträge bearbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 486 491 495 Benutzerkonten einrichten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die App users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Anmeldeseite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Abmelden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Registrierungsseite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 499 500 503 505 Die Benutzer als Besitzer ihrer eigenen Daten . . . . . . . . . . . . . . . . . . . . . . . Den Zugriff mit @login_required beschränken . . . . . . . . . . . . . . . . . . Daten mit Benutzern verknüpfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Zugriff auf die Fachgebiete auf die zuständigen Benutzer einschränken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508 509 511 514 xviii Inhalt Die Fachgebiete eines Benutzers schützen . . . . . . . . . . . . . . . . . . . . . . 515 Die Seite edit_entry schützen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 Neue Fachgebiete dem aktuellen Benutzer zuordnen . . . . . . . . . . . . . . 516 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518 20 Eine App gestalten und bereitstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 Learning Log gestalten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die App django-bootstrap3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Learning Log mit Bootstrap gestalten . . . . . . . . . . . . . . . . . . . . . . . . . Änderungen an base.html . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Startseite mit einem Jumbotron gestalten . . . . . . . . . . . . . . . . . . . Das Anmeldeformular gestalten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Seite new_topic gestalten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Seite Topics gestalten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einträge auf den Fachgebietsseiten gestalten . . . . . . . . . . . . . . . . . . . . 520 520 521 522 526 527 528 529 530 Learning Log bereitstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Heroku-Konto anlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Heroku Toolbelt installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die erforderlichen Pakete installieren . . . . . . . . . . . . . . . . . . . . . . . . . Eine Paketliste mit der Datei requirements.txt erstellen . . . . . . . . . . . . Die Python-Laufzeitversion angeben . . . . . . . . . . . . . . . . . . . . . . . . . . Die Datei settings.py für Heroku anpassen . . . . . . . . . . . . . . . . . . . . . Ein Procfile zum Starten der Prozesse erstellen . . . . . . . . . . . . . . . . . . Die Datei wsgi.py für Heroku anpassen . . . . . . . . . . . . . . . . . . . . . . . Ein Verzeichnis für statische Dateien erstellen . . . . . . . . . . . . . . . . . . . Den Server gunicorn lokal nutzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mit Git den Überblick über die Projektdateien bewahren . . . . . . . . . . Die Datenbank auf Heroku einrichten . . . . . . . . . . . . . . . . . . . . . . . . Die Heroku-Bereitstellung verbessern . . . . . . . . . . . . . . . . . . . . . . . . . Das Onlineprojekt schützen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Änderungen mit Commit bestätigen und übertragen . . . . . . . . . . . . . . Eigene Fehlerseiten erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Weiterentwicklung des Projekts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Einstellung SECRET_KEY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Projekte auf Heroku löschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532 532 533 533 533 535 535 536 537 537 537 538 542 543 544 545 547 550 550 551 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552 Nachwort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 Inhalt xix Anhang 555 A Python installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 Python unter Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 Die installierte Version herausfinden . . . . . . . . . . . . . . . . . . . . . . . . . . 555 Python 3 unter Linux installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556 Python unter OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556 Die installierte Version herausfinden . . . . . . . . . . . . . . . . . . . . . . . . . . 556 Python 3 mit Homebrew installieren . . . . . . . . . . . . . . . . . . . . . . . . . . 557 Python unter Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Python 3 unter Windows installieren . . . . . . . . . . . . . . . . . . . . . . . . . Den Python-Interpreter finden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Python zur Pfadvariablen hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . 558 558 559 559 Schlüsselwörter und integrierte Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . 560 Python-Schlüsselwörter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560 Integrierte Python-Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560 B Texteditoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563 Geany . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Geany unter Linux installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Geany unter Windows installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . Python-Programme in Geany ausführen . . . . . . . . . . . . . . . . . . . . . . . Geany-Einstellungen anpassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564 564 565 565 566 Sublime Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sublime Text unter OS X installieren . . . . . . . . . . . . . . . . . . . . . . . . . Sublime Text unter Linux installieren . . . . . . . . . . . . . . . . . . . . . . . . . Sublime Text unter Windows installieren . . . . . . . . . . . . . . . . . . . . . . Python-Programme in Sublime Text ausführen . . . . . . . . . . . . . . . . . . Sublime Text konfigurieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Einstellungen von Sublime Text anpassen . . . . . . . . . . . . . . . . . . . 567 567 567 567 567 568 568 IDLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IDLE unter Linux installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IDLE unter OS X installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IDLE unter Windows installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . IDLE-Einstellungen anpassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 569 569 570 570 Emacs und vim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570 xx Inhalt C Hilfe finden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571 Erste Schritte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Versuchen Sie es erneut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Legen Sie eine Pause ein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nutzen Sie das Onlinematerial zu diesem Buch . . . . . . . . . . . . . . . . . . 571 572 572 573 Online nach Hilfe suchen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Stack Overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die offizielle Python-Dokumentation . . . . . . . . . . . . . . . . . . . . . . . . . Offizielle Dokumentation der Bibliotheken . . . . . . . . . . . . . . . . . . . . . r/learnpython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573 573 574 574 574 574 IRC (Internet Relay Chat) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein IRC-Konto anlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hilfreiche Kanäle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IRC-Kultur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 575 575 576 D Versionssteuerung mit Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577 Git installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Git unter Linux installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Git unter OS X installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Git unter Windows installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Git konfigurieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578 578 578 578 578 Ein Projekt anlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579 Dateien ignorieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579 Ein Repository initialisieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580 Den Projektstatus überprüfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580 Dateien zum Repository hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581 Einen Commit durchführen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581 Das Protokoll einsehen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582 Der zweite Commit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582 Änderungen zurücknehmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583 Vorherige Commits auschecken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585 Das Repository löschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587 Stichwortverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589