Inhalt | 6 |
Vorwort | 18 |
Danksagung | 19 |
1 Einleitung | 20 |
1.1 Einfach und schnell zu lernen | 20 |
1.2 Zielgruppe des Buches | 20 |
1.3 Aufbau des Buches | 21 |
1.4 Programmieren lernen ,,interaktiv'' | 22 |
1.5 Download der Beispiele und Hilfe | 23 |
1.6 Anregungen und Kritik | 23 |
Teil I Grundlagen | 24 |
2 Kommandos und Programme | 26 |
2.1 Erste Schritte mit Python | 26 |
2.1.1 Linux | 26 |
2.1.2 Windows | 27 |
2.1.3 macOS | 28 |
2.2 Herkunft und Bedeutung des Begriffes interaktive Shell | 28 |
2.2.1 Erste Schritte in der interaktiven Shell | 29 |
2.3 Verlassen der Python-Shell | 30 |
2.4 Benutzung von Variablen | 31 |
2.5 Mehrzeilige Anweisungen in der interaktiven Shell | 31 |
2.6 Programme schreiben oder schnell mal der Welt ``Hallo'' sagen | 32 |
3 Bytecode und Maschinencode | 36 |
3.1 Einführung | 36 |
3.2 Unterschied zwischen Programmier- und Skriptsprachen | 36 |
3.3 Interpreter- oder Compilersprache | 36 |
4 Datentypen und Variablen | 40 |
4.1 Einführung | 40 |
4.2 Variablennamen | 42 |
4.2.1 Gültige Variablennamen | 42 |
4.2.2 Konventionen für Variablennamen | 43 |
4.3 Datentypen | 43 |
4.3.1 Ganze Zahlen | 43 |
4.3.2 Fließkommazahlen | 45 |
4.3.3 Zeichenketten | 45 |
4.3.4 Boolesche Werte | 45 |
4.3.5 Komplexe Zahlen | 46 |
4.3.6 Operatoren | 46 |
4.4 Statische und dynamische Typdeklaration | 47 |
4.5 Typumwandlung | 49 |
4.6 Datentyp ermitteln | 50 |
5 Sequentielle Datentypen | 52 |
5.1 Übersicht | 52 |
5.1.1 Zeichenketten oder Strings | 53 |
5.1.2 Listen | 55 |
5.1.3 Tupel | 55 |
5.2 Indizierung von sequentiellen Datentypen | 56 |
5.3 Teilbereichsoperator | 57 |
5.4 Die len-Funktion | 59 |
5.5 Aufgaben | 60 |
6 Dictionaries | 62 |
6.1 Dictionaries und assoziative Felder | 62 |
6.2 Definition und Benutzung | 63 |
6.3 Fehlerfreie Zugriffe auf Dictionaries | 65 |
6.4 Zulässige Typen für Schlüssel und Werte | 66 |
6.5 Verschachtelte Dictionaries | 67 |
6.6 Methoden auf Dictionaries | 67 |
6.7 Operatoren | 71 |
6.8 Die zip-Funktion | 71 |
6.9 Dictionaries aus Listen erzeugen | 73 |
6.10 Aufgaben | 74 |
7 Mengen | 76 |
7.1 Übersicht | 76 |
7.2 Mengen in Python | 76 |
7.2.1 Sets erzeugen | 77 |
7.2.2 Mengen von unveränderlichen Elementen | 77 |
7.3 Frozensets | 78 |
7.4 Operationen auf ,,set''-Objekten | 78 |
7.4.1 add(element) | 78 |
7.4.2 clear() | 79 |
7.4.3 copy | 79 |
7.4.4 difference() | 79 |
7.4.5 difference_update() | 80 |
7.4.6 discard(el) | 80 |
7.4.7 remove(el) | 81 |
7.4.8 intersection(s) | 81 |
7.4.9 isdisjoint() | 81 |
7.4.10 issubset() | 82 |
7.4.11 issuperset() | 82 |
7.4.12 pop() | 83 |
8 Eingaben | 84 |
8.1 Eingabe mittels input | 84 |
9 Verzweigungen | 86 |
9.1 Anweisungsblöcke und Einrückungen | 86 |
9.2 Bedingte Anweisungen in Python | 89 |
9.2.1 Einfachste if-Anweisung | 89 |
9.2.2 if-Anweisung mit else-Zweig | 90 |
9.2.3 elif-Zweige | 90 |
9.3 Vergleichsoperatoren | 91 |
9.4 Zusammengesetzte Bedingungen | 91 |
9.5 Wahr oder falsch: Bedingungen in Verzweigungen | 91 |
9.6 Aufgaben | 92 |
10 Schleifen | 94 |
10.1 Übersicht | 94 |
10.2 while-Schleife | 95 |
10.3 break und continue | 96 |
10.4 die Alternative im Erfolgsfall: else | 97 |
10.5 For-Schleife | 99 |
10.6 Aufgaben | 102 |
11 Dateien lesen und schreiben | 106 |
11.1 Dateien | 106 |
11.2 Text aus einer Datei lesen | 106 |
11.3 Schreiben in eine Datei | 108 |
11.4 In einem Rutsch lesen: readlines und read | 108 |
11.5 with-Anweisung | 109 |
11.6 Aufgaben | 110 |
12 Formatierte Ausgabe und Strings formatieren | 112 |
12.1 Wege, die Ausgabe zu formatieren | 112 |
12.2 print-Funktion | 112 |
12.3 Stringformatierung im C-Stil | 114 |
12.4 Der pythonische Weg: Die String-Methode ,,format'' | 118 |
12.5 Benutzung von Dictionaries beim Aufruf der ,,format''-Methode | 121 |
12.6 Benutzung von lokalen Variablen in ,,format'' | 122 |
12.7 Formatierte Stringliterale | 123 |
12.8 Weitere String-Methoden zum Formatieren | 123 |
13 Flaches und tiefes Kopieren | 126 |
13.1 Einführung | 126 |
13.2 Kopieren einer Liste | 127 |
13.3 Flache Kopien | 129 |
13.4 Kopieren mit deepcopy | 130 |
13.5 Deepcopy für Dictionaries | 131 |
14 Funktionen | 132 |
14.1 Allgemein | 132 |
14.2 Funktionen | 132 |
14.3 Docstring | 134 |
14.4 Standardwerte für Funktionen | 136 |
14.5 Schlüsselwortparameter | 137 |
14.6 Funktionen ohne oder mit leerer return-Anweisung | 137 |
14.7 Mehrere Rückgabewerte | 138 |
14.8 Lokale und globale Variablen in Funktionen | 139 |
14.9 Parameterübergabe im Detail | 141 |
14.10 Effekte bei veränderlichen Objekten | 143 |
14.11 Kommandozeilenparameter | 144 |
14.12 Variable Anzahl von Parametern / Variadische Funktionen | 145 |
14.13 * in Funktionsaufrufen | 147 |
14.14 Beliebige Schlüsselwortparameter | 148 |
14.15 Doppeltes Sternchen im Funktionsaufruf | 148 |
14.16 Aufgaben | 149 |
15 Rekursive Funktionen | 152 |
15.1 Definition und Herkunft des Begriffs | 152 |
15.2 Definition der Rekursion | 153 |
15.3 Rekursive Funktionen in Python | 153 |
15.4 Die Tücken der Rekursion | 154 |
15.5 Fibonacci-Folge in Python | 155 |
15.6 Aufgaben | 159 |
16 Listen und Tupel im Detail | 162 |
16.1 Stapelspeicher | 162 |
16.2 Stapelverarbeitung in Python: pop und append | 163 |
16.3 extend | 163 |
16.4 ,+'-Operator oder append | 164 |
16.5 Entfernen eines Wertes | 166 |
16.6 Prüfen, ob ein Element in Liste enthalten ist | 166 |
16.7 Finden der Position eines Elementes | 166 |
16.8 Einfügen von Elementen | 167 |
16.9 Besonderheiten bei Tupel | 167 |
16.9.1 Leere Tupel | 168 |
16.9.2 1-Tupel | 168 |
16.9.3 Mehrfachzuweisungen, Packing und Unpacking | 168 |
16.10 Die veränderliche Unveränderliche | 170 |
16.11 Sortieren von Listen | 170 |
16.11.1 ,,sort'' und ,,sorted'' | 170 |
16.11.2 Umkehrung der Sortierreihenfolge | 171 |
16.11.3 Eigene Sortierfunktionen | 171 |
16.12 Aufgaben | 174 |
17 Modularisierung | 176 |
17.1 Module | 176 |
17.1.1 Namensräume von Modulen | 177 |
17.1.2 Namensräume umbenennen | 178 |
17.1.3 Modularten | 178 |
17.1.4 Suchpfad für Module | 179 |
17.1.5 Inhalt eines Modules | 180 |
17.1.6 Eigene Module | 180 |
17.1.7 Dokumentation für eigene Module | 181 |
17.2 Pakete | 182 |
17.2.1 Einfaches Paket erzeugen | 183 |
17.2.2 Komplexeres Paket | 184 |
17.2.3 Komplettes Paket importieren | 187 |
18 Globale und lokale Variablen | 190 |
18.1 Einführung | 190 |
18.2 Globale und lokale Variablen in Funktionen | 191 |
19 Alles über Strings … | 194 |
19.1 ... fast alles | 194 |
19.2 Aufspalten von Zeichenketten | 195 |
19.2.1 split | 195 |
19.2.2 Standardverhalten und ,,maxsplit'' | 197 |
19.2.3 rsplit | 198 |
19.2.4 Folge von Trennzeichen | 200 |
19.2.5 splitlines | 201 |
19.2.6 partition | 202 |
19.3 Zusammenfügen von Stringlisten mit join | 202 |
19.4 Suchen von Teilstrings | 202 |
19.4.1 ,,in'' oder ,,not in'' | 202 |
19.4.2 s.find(substring[, start[, end]]) | 203 |
19.4.3 s.rfind(substring[, start[, end]]) | 203 |
19.4.4 s.index(substring[, start[, end]]) | 204 |
19.4.5 s.rindex(substring[, start[, end]]) | 204 |
19.4.6 s.count(substring[, start[, end]]) | 204 |
19.5 Suchen und Ersetzen | 205 |
19.6 Nur noch Kleinbuchstaben oder Großbuchstaben | 205 |
19.7 capitalize und title | 205 |
19.8 Stripping Strings | 206 |
19.9 Strings ausrichten | 206 |
19.10 String-Tests | 207 |
19.11 Aufgaben | 209 |
20 Ausnahmebehandlung | 212 |
20.1 Abfangen mehrerer Exceptions | 214 |
20.2 except mit mehrfachen Ausnahmen | 215 |
20.3 Die optionale else-Klausel | 215 |
20.4 Fehlerinformationen über sys.exc_info | 216 |
20.5 Exceptions generieren | 216 |
20.6 Finalisierungsaktion | 217 |
Teil II Objektorientierte Programmierung | 218 |
21 Grundlegende Aspekte | 220 |
21.1 Bibliotheksvergleich | 220 |
21.2 Objekte und Instanzen einer Klasse | 222 |
21.3 Kapselung von Daten und Methoden | 223 |
21.4 Eine minimale Klasse in Python | 223 |
21.5 Eigenschaften und Attribute | 224 |
21.6 Methoden | 227 |
21.7 Instanzvariablen | 228 |
21.8 Die __init__-Methode | 228 |
21.9 Destruktor | 230 |
21.10 Datenkapselung, Datenabstraktion und Geheimnisprinzip | 231 |
21.10.1 Definitionen | 231 |
21.10.2 Zugriffsmethoden | 233 |
21.10.3 Properties | 234 |
21.10.4 Public-, Protected- und Private-Attribute | 236 |
21.10.5 Weitere Möglichkeiten der Properties | 237 |
21.10.6 Properties mit Dekorateuren | 240 |
21.11 Die __str__- und die __repr__-Methode | 241 |
21.12 Klassenattribute | 246 |
21.13 Statische Methoden | 248 |
21.13.1 Einleitendes Beispiel | 249 |
21.13.2 Getter und Setter für private Klassenattribute | 250 |
21.14 Public-Attribute statt private Attribute | 251 |
21.15 Magische Methoden und Operatorüberladung | 252 |
21.15.1 Einführung | 252 |
21.15.2 Übersicht magische Methoden | 254 |
21.15.3 Beispielklasse: Length | 255 |
22 Bruchklasse | 260 |
22.1 Brüche à la 1001 Nacht | 260 |
22.2 Zurück in die Gegenwart | 261 |
22.3 Rechenregeln | 263 |
22.3.1 Multiplikation von Brüchen | 263 |
22.3.2 Division von Brüchen | 264 |
22.3.3 Addition von Brüchen | 265 |
22.3.4 Subtraktion von Brüchen | 265 |
22.3.5 Vergleichsoperatoren | 266 |
22.4 Integer plus Bruch | 266 |
22.4.1 Die Bruchklasse im Überblick | 267 |
22.5 Fraction-Klasse | 269 |
23 Vererbung | 270 |
23.1 Oberbegriffe und Oberklassen | 270 |
23.2 Ein einfaches Beispiel | 271 |
23.3 Überladen, Überschreiben und Polymorphie | 272 |
23.4 Vererbung in Python | 275 |
23.5 Klassenmethoden | 278 |
23.6 Standardklassen als Basisklassen | 280 |
24 Mehrfachvererbung | 282 |
24.1 Einführung | 282 |
24.2 Beispiel: CalendarClock | 283 |
24.3 Diamand-Problem oder ,,deadly diamond of death'' | 291 |
24.4 super und MRO | 292 |
25 Slots | 298 |
25.1 Erzeugung von dynamischen Attributen verhindern | 298 |
26 Dynamische Erzeugung von Klassen | 300 |
26.1 Beziehung zwischen ,,class'' und ,,type'' | 300 |
27 Metaklassen | 304 |
27.1 Motivation | 304 |
27.2 Definition | 309 |
27.3 Definition von Metaklassen in Python | 309 |
27.4 Singletons mit Metaklassen erstellen | 311 |
27.5 Beispiel – Methodenaufrufe zählen | 312 |
27.5.1 Einführung | 312 |
27.5.2 Vorbereitungen | 312 |
27.5.3 Ein Dekorateur, um Funktionsaufrufe zu zählen | 314 |
27.5.4 Die Metaklasse ,,Aufrufzähler'' | 314 |
28 Abstrakte Klassen | 316 |
29 Aufgaben | 320 |
Teil III Fortgeschrittenes Python | 324 |
30 lambda, map, filter und reduce | 326 |
30.1 lambda | 326 |
30.2 map | 329 |
30.3 Filtern von sequentiellen Datentypen mittels ,,filter'' | 331 |
30.4 reduce | 332 |
30.5 Aufgaben | 333 |
31 Listen-Abstraktion/List Comprehension | 334 |
31.1 Die Alternative zu Lambda und Co. | 334 |
31.2 Syntax | 335 |
31.3 Weitere Beispiele | 335 |
31.4 Die zugrunde liegende Idee | 336 |
31.5 Anspruchsvolleres Beispiel | 337 |
31.6 Mengen-Abstraktion | 337 |
31.7 Rekursive Primzahlberechnung | 338 |
31.8 Generatoren-Abstraktion | 338 |
31.9 Aufgaben | 339 |
32 Generatoren und Iteratoren | 342 |
32.1 Einführung | 342 |
32.2 Iteration in for-Schleifen | 342 |
32.3 Generatoren | 344 |
32.4 Generatoren zähmen mit firstn und islice | 346 |
32.5 Beispiele | 347 |
32.5.1 Permutationen | 347 |
32.5.2 Variationen und Kombinationen | 348 |
32.6 Generator-Ausdrücke | 350 |
32.7 return-Anweisungen in Generatoren | 351 |
32.8 send-Methode / Koroutinen | 351 |
32.9 Die throw-Methode | 353 |
32.10 Dekoration von Generatoren | 355 |
32.11 yield from | 356 |
32.12 Aufgaben | 358 |
33 Dekorateure | 360 |
33.1 Einführung Dekorateure | 360 |
33.1.1 Verschachtelte Funktionen | 361 |
33.1.2 Funktionen als Parameter | 362 |
33.1.3 Funktionen als Rückgabewert | 363 |
33.1.4 Fabrikfunktionen | 364 |
33.2 Ein einfacher Dekorateur | 365 |
33.3 @-Syntax für Dekorateure | 366 |
33.4 Anwendungsfälle für Dekorateure | 369 |
33.4.1 Überprüfung von Argumenten durch Dekorateure | 369 |
33.4.2 Funktionsaufrufe mit einem Dekorateur zählen | 370 |
33.5 Dekorateure mit Parametern | 371 |
33.6 Benutzung von Wraps aus functools | 373 |
33.7 Klassen statt Funktionen | 374 |
33.7.1 Die __call__-Methode | 374 |
33.8 Eine Klasse als Dekorateur benutzen | 376 |
33.9 Memoisation | 377 |
33.9.1 Bedeutung und Herkunft des Begriffs | 377 |
33.9.2 Memoisation mit Dekorateur-Funktionen | 377 |
33.9.3 Memoisation mit einer Klasse | 378 |
33.9.4 Memoisation mit functools.lru_cache | 379 |
Teil IV Weiterführende Themen | 382 |
34 Tests und Fehler | 384 |
34.1 Einführung | 384 |
34.2 Modultests | 386 |
34.3 Modultests unter Benutzung von __name__ | 387 |
34.4 doctest-Modul | 389 |
34.5 Testgetriebene Entwicklung oder ,,Im Anfang war der Test'' | 392 |
34.6 unittest | 394 |
34.7 Methoden der Klasse TestCase | 396 |
34.8 Aufgaben | 399 |
35 Daten konservieren | 400 |
35.1 Persistente Speicherung | 400 |
35.2 Pickle-Modul | 401 |
35.2.1 Daten ,,einpökeln'' mit pickle.dump | 401 |
35.2.2 pickle.load | 402 |
35.3 Ein persistentes Dictionary mit shelve | 402 |
36 Reguläre Ausdrücke | 406 |
36.1 Ursprünge und Verbreitung | 406 |
36.2 Stringvergleiche | 406 |
36.3 Überlappungen und Teilstrings | 408 |
36.4 Das re-Modul | 408 |
36.5 Matching-Problem | 409 |
36.6 Syntax der regulären Ausdrücke | 411 |
36.6.1 Beliebiges Zeichen | 411 |
36.7 Zeichenauswahl | 412 |
36.8 Endliche Automaten | 413 |
36.9 Anfang und Ende eines Strings | 413 |
36.10 Vordefinierte Zeichenklassen | 416 |
36.11 Optionale Teile | 417 |
36.12 Quantoren | 418 |
36.13 Gruppierungen und Rückwärtsreferenzen | 420 |
36.13.1 Match-Objekte | 420 |
36.14 Umfangreiche Übung | 423 |
36.15 Alles finden mit findall | 425 |
36.16 Alternativen | 426 |
36.17 Compilierung von regulären Ausdrücken | 426 |
36.18 Aufspalten eines Strings mit oder ohne regulären Ausdruck | 428 |
36.18.1 split-Methode der String-Klasse | 428 |
36.18.2 split-Methode des re-Moduls | 429 |
36.18.3 Wörter filtern | 431 |
36.19 Suchen und Ersetzen mit sub | 432 |
36.20 Aufgaben | 433 |
37 Typanmerkungen | 436 |
37.1 Einführung | 436 |
37.2 Einfaches Beispiel | 437 |
37.3 Variablenanmerkungen | 438 |
37.4 Listenbeispiel | 439 |
37.5 typing-Modul | 440 |
38 Systemprogrammierung | 444 |
38.1 Systemprogrammierung | 444 |
38.2 Häufig falsch verstanden: Shell | 444 |
38.3 os-Modul | 445 |
38.3.1 Vorbemerkungen | 446 |
38.3.2 Umgebungsvariablen | 446 |
38.3.3 Dateiverarbeitung auf niedrigerer Ebene | 448 |
38.3.4 Die exec-,,Familie'' | 453 |
38.3.5 Weitere Funktionen im Überblick | 460 |
38.3.6 os.path - Arbeiten mit Pfaden | 474 |
38.4 shutil-Modul | 482 |
39 Forks | 488 |
39.1 Fork | 488 |
39.2 Fork in Python | 488 |
Teil V Lösungen zu den Aufgaben | 492 |
40 Lösungen zu den Aufgaben | 494 |
40.1 Lösungen zu Kapitel 5 (Sequentielle Datentypen) | 494 |
40.2 Lösungen zu Kapitel 6 (Dictionaries) | 497 |
40.3 Lösungen zu Kapitel 9 (Verzweigungen) | 499 |
40.4 Lösungen zu Kapitel 10 (Schleifen) | 501 |
40.5 Lösungen zu Kapitel 11 (Dateien lesen und schreiben) | 504 |
40.6 Lösungen zu Kapitel 16 (Listen und Tupel im Detail) | 506 |
40.7 Lösungen zu Kapitel 14 (Funktionen) | 509 |
40.8 Lösungen zu Kapitel 15 (Rekursive Funktionen) | 514 |
40.9 Lösungen zu Kapitel 19 (Alles über Strings …) | 518 |
40.10 Lösungen zu Kapitel 21 (Grundlegende Aspekte) | 521 |
40.11 Lösungen zu Kapitel 34 (Tests und Fehler) | 531 |
40.12 Lösungen zu Kapitel 36 (Reguläre Ausdrücke) | 531 |
40.13 Lösungen zu Kapitel 30 (lambda, map, filter und reduce) | 537 |
40.14 Lösungen zu Kapitel 31 (Listen-Abstraktion/List Comprehension) | 538 |
40.15 Lösungen zu Kapitel 32 (Generatoren und Iteratoren) | 539 |
Stichwortverzeichnis | 544 |