Inhalt | 6 |
Vorwort | 16 |
1 Grundlagen | 20 |
1.1 Hältst Du das richtige Buch in den Händen? | 20 |
1.2 Dieses Buch bricht mit einigen Konventionen! | 21 |
1.3 Die Arbeit mit diesem Buch | 22 |
1.4 Das Kapitel zu Minecraft | 23 |
1.5 Das Begleitmaterial zum Buch | 23 |
1.6 Anregungen? Kritik? Forum? | 24 |
1.7 Die Geschichte von Python in 120 Wörtern | 24 |
1.8 Was kann man mit Python machen (und was nicht)? | 25 |
1.9 Interpreter vs. Compiler | 26 |
1.10 Python 2.7 oder 3.7? | 27 |
1.11 Die Entwicklungsumgebung PyCharm | 28 |
1.11.1 Alternativen zu PyCharm | 29 |
1.12 Python-Interpreter installieren | 29 |
1.12.1 Python-Interpreter unter Windows installieren | 30 |
1.12.2 Python-Interpreter unter macOS installieren | 31 |
1.12.3 Python-Interpreter unter Linux installieren | 31 |
1.12.4 PyCharm unter Windows installieren | 32 |
1.12.5 PyCharm unter macOS installieren | 32 |
1.12.6 PyCharm unter Linux installieren | 33 |
1.12.7 PyCharm einrichten | 34 |
1.13 Genug geredet, los gehts! | 36 |
1.13.1 Das erste Programm eingeben | 37 |
1.13.2 Ausführen des ersten Beispiels | 39 |
1.13.3 Laden der Beispiele | 39 |
1.13.4 Der Quelltext im Detail | 41 |
1.13.5 Kommentare im Detail | 42 |
1.14 PEP8 – um sie ewig zu binden | 44 |
1.15 Python-Programme ohne Entwicklungsumgebung starten | 46 |
1.15.1 Python-Programme unter Windows starten | 46 |
1.15.2 Python-Programme unter Linux oder macOS starten | 47 |
1.16 Python interaktiv | 48 |
1.17 Aufgabenstellung | 50 |
1.18 Kurz & knapp | 50 |
2 Variablen | 52 |
2.1 Was sind Variablen? | 52 |
2.2 Statisch typisiert vs. dynamisch typisiert | 53 |
2.3 Einige Details vorab – Variablen sind auch nur Namen | 55 |
2.4 Richtlinien für Variablennamen | 57 |
2.4.1 Von Kamelen, Schlangen und Pascal | 57 |
2.4.2 Sinnvolle Variablennamen | 58 |
2.5 Rechnen mit Variablen | 59 |
2.5.1 Verkürzte Schreibweise bei Rechenoperationen | 60 |
2.5.2 Gibt es noch weitere Datentypen? | 61 |
2.5.3 Konvertierung von Datentypen | 62 |
2.5.4 Besonderheiten bei der Konvertierung von Datentypen | 63 |
2.6 Formatierte Ausgabe mit print() | 64 |
2.7 Genauigkeit von Fließkommazahlen | 66 |
2.7.1 Formatierte Ausgabe von Fließkommazahlen | 67 |
2.8 Den ganzzahligen Rest einer Division bestimmen | 68 |
2.9 Konstanten, Konventionen und Restriktionen | 69 |
2.10 Fehlerquelltext | 70 |
2.10.1 Was ist die Aufgabe des Programms? | 71 |
2.10.2 Lösungsvorschlag | 71 |
2.10.3 Die gemeinen Kleinigkeiten | 73 |
2.11 Aufgabenstellung | 74 |
2.11.1 Einige Tipps | 74 |
2.11.2 Lösung zur Aufgabenstellung | 75 |
2.12 Kurz & knapp | 76 |
3 Schleifen und Bedingungen | 78 |
3.1 Was sind Schleifen und Bedingungen? | 78 |
3.2 Die if-Bedingung | 79 |
3.2.1 Blöcke und Einrückungen | 80 |
3.2.2 Arbeit sparen mit else | 81 |
3.2.3 elif | 83 |
3.3 Der Platzhalter pass | 85 |
3.4 Blöcke im interaktiven Modus | 86 |
3.5 Logische Operatoren | 86 |
3.6 PyCharm – Korrekturvorschläge übernehmen | 89 |
3.7 while-Schleifen | 90 |
3.7.1 Eine Schleife mit break vorzeitig beenden | 91 |
3.7.2 continue in while-Schleifen | 93 |
3.7.3 while-else | 94 |
3.8 for-Schleifen | 95 |
3.8.1 Eine einfache Zählschleife | 96 |
3.8.2 Ein Wort zu Schleifenvariablen | 97 |
3.8.3 Die Funktion range() im Detail | 98 |
3.8.4 break und continue in for-Schleifen | 99 |
3.8.5 Sonderfall Unterstrich: die Wegwerfvariable | 100 |
3.9 Ein kurzer Abstecher: Exceptions | 101 |
3.10 Fehlerquelltext | 102 |
3.10.1 Was ist die Aufgabe des Programms? | 103 |
3.10.2 Lösung zum Fehlerquelltext | 104 |
3.11 Aufgabenstellung | 105 |
3.11.1 Einige Tipps | 106 |
3.11.2 Lösungsvorschlag | 107 |
3.12 Ein umfangreicheres Beispiel: Zahlenraten | 108 |
3.12.1 Die Hauptschleife | 111 |
3.12.2 Ein neues Spiel starten | 111 |
3.12.3 Abfrage des Schwierigkeitsgrades und Beenden des Spiels | 112 |
3.13 Kurz & knapp | 112 |
4 Funktionen | 116 |
4.1 Was sind Funktionen? | 116 |
4.2 Eine einfache Funktion definieren | 116 |
4.3 Parameter, Argumente und Rückgabewert | 118 |
4.4 Weitere Möglichkeiten, Funktionen aufzurufen | 120 |
4.5 Globale und lokale Variablen | 122 |
4.5.1 Ein bisschen mehr Verwirrung, bitte! | 124 |
4.5.2 Das Schlüsselwort global | 125 |
4.5.3 Auch Parameter sind lokal | 127 |
4.5.4 Ein Wort zu globalen Variablen | 128 |
4.5.5 Von Schatten und Hauptprogrammen | 128 |
4.6 Standardwerte für Parameter | 132 |
4.7 Schlüsselwortparameter | 133 |
4.8 Wann sollten Funktionen zum Einsatz kommen? | 135 |
4.9 Aufgabenstellung | 136 |
4.9.1 Lösung zur Aufgabenstellung | 137 |
4.10 Vorgehensweise bei größeren Projekten | 140 |
4.11 Rekursion | 141 |
4.12 Fehlerquelltext | 142 |
4.12.1 Was ist die Aufgabe des Programms? | 143 |
4.12.2 Lösung zum Fehlerquelltext | 144 |
4.13 Kurz & knapp | 146 |
5 Klassen | 150 |
5.1 Was ist Objektorientierung? | 150 |
5.2 Eine einfache Klasse definieren | 151 |
5.2.1 Aufbau einer Klasse | 152 |
5.2.2 Erzeugen von Objekten | 153 |
5.2.3 Verwenden der Objekte | 154 |
5.3 Kontrollierter Zugriff auf Attribute: Properties | 155 |
5.3.1 Getter | 155 |
5.3.2 Setter | 158 |
5.3.3 Wann sollten Attribute und wann Properties verwendet werden? | 159 |
5.3.4 Nachträgliches Umstellen auf Properties | 160 |
5.4 Dynamische Attribute | 161 |
5.5 Klassenattribute | 164 |
5.5.1 Stolpersteine bei Klassenattributen | 166 |
5.6 Statische Methoden | 168 |
5.7 Zwischenstand: Braucht man das wirklich? | 170 |
5.8 Aufgabenstellung | 171 |
5.8.1 Einige Tipps | 172 |
5.8.2 Lösungsvorschlag | 173 |
5.9 Das Gleiche ist nicht dasselbe | 175 |
5.9.1 Für Fortgeschrittene: Parameterübergabe im Detail | 178 |
5.10 None | 180 |
5.11 Vererbung | 182 |
5.11.1 Ein einfaches Beispiel | 183 |
5.11.2 Überschreiben von Methoden | 185 |
5.12 Wie das Smartphone erfunden wurde – oder: Mehrfachvererbung | 190 |
5.13 Für Fortgeschrittene: Binden von Methoden | 193 |
5.13.1 Ein Blick hinter die Kulissen | 193 |
5.13.2 Klassen um eigene Funktionen erweitern | 195 |
5.13.3 Statische Methoden und instanzbezogene Bindung | 197 |
5.14 Überschreiben der Methode __str__() | 201 |
5.15 Und wo ist der Fehlerquelltext? | 202 |
5.16 Kurz & knapp | 202 |
6 Container | 208 |
6.1 Was sind Container? | 208 |
6.1.1 Eine Anmerkung, bevor es losgeht | 208 |
6.2 Listen | 209 |
6.2.1 Listen erzeugen und auf Elemente zugreifen | 209 |
6.2.2 Listen dynamisch erzeugen | 210 |
6.2.3 Elemente löschen oder ersetzen | 212 |
6.2.4 Aufgabenstellung | 215 |
6.2.4.1 Einige Tipps | 216 |
6.2.4.2 Lösung zur Aufgabenstellung | 216 |
6.2.5 Sortieren von Listen | 217 |
6.2.5.1 Eigene Sortierfunktionen | 219 |
6.2.5.2 Eine weitere Möglichkeit der Sortierung: sorted | 221 |
6.2.5.3 Für Fortgeschrittene: lambda – anonyme Funktionen | 222 |
6.2.6 Listen verknüpfen | 225 |
6.2.7 Nicht nur für Fortgeschrittene: tiefes und flaches Kopieren | 226 |
6.3 Tupel | 228 |
6.3.1 Unterschiede zu Listen | 228 |
6.3.2 Vorsicht: Instanzen in Tupeln können geändert werden | 230 |
6.3.3 Mehrere Rückgabewerte mit Tupeln | 231 |
6.3.4 Für Fortgeschrittene: namedtuple | 233 |
6.4 Strings | 235 |
6.4.1 Für Fortgeschrittene: Darum sind Strings unveränderlich | 236 |
6.4.2 Slicing | 238 |
6.4.3 Arbeiten mit Strings | 240 |
6.4.4 Strings verbinden | 240 |
6.4.5 Zerlegen und wieder zusammensetzen: split und join | 242 |
6.4.6 Strings „aufbereiten“ | 244 |
6.4.7 Ändern der Groß- und Kleinschreibung | 246 |
6.4.8 Strings durchsuchen | 247 |
6.4.9 Aufgabenstellung | 249 |
6.4.9.1 Einige Tipps | 250 |
6.4.9.2 Lösungsvorschlag | 250 |
6.4.10 Ersetzungen durchführen | 252 |
6.5 Dictionaries | 254 |
6.5.1 Grundlagen von Dictionaries | 254 |
6.5.2 Vorsicht beim Zugriff! | 255 |
6.5.3 Dictionaries durchlaufen und verändern | 257 |
6.5.4 Elemente aus einem Dictionary entfernen | 259 |
6.6 Fehlerquelltext | 261 |
6.6.1 Was ist die Aufgabe des Programms? | 261 |
6.6.2 Lösung zum Fehlerquelltext | 262 |
6.7 Sets und Frozensets | 264 |
6.7.1 Einfache Sets/Frozensets erzeugen | 264 |
6.7.2 Sets: Elemente hinzufügen und entfernen | 266 |
6.7.3 Mengenoperationen | 267 |
6.8 Kurz & knapp | 271 |
7 Exceptions | 280 |
7.1 Was sind Exceptions? | 280 |
7.2 Fehler? Die passieren mir doch nicht! | 280 |
7.3 Die Mechanik von Exceptions | 282 |
7.4 Abfangen unterschiedlicher Exceptions | 284 |
7.5 Alle Exceptions fangen | 286 |
7.6 Eigene Exceptions | 288 |
7.7 else und finally | 291 |
7.8 Einige allgemeine Tipps | 294 |
7.9 Kurz & knapp | 298 |
8 Module und Pakete | 302 |
8.1 Module | 302 |
8.1.1 Grundlagen | 303 |
8.1.2 Dokumentation von Modulen | 305 |
8.1.3 Umbenennen eines Namensraums | 307 |
8.1.4 Selektives Importieren | 308 |
8.1.5 Namensräume haben ihren Sinn | 309 |
8.1.6 Batteries included! | 309 |
8.1.7 Reihenfolge beim Importieren | 310 |
8.1.8 Eigene Module in mehreren Projekten nutzen | 311 |
8.1.9 Tipps für das Schreiben von Modulen | 311 |
8.1.10 Automatische Ausführung beim Import verhindern | 313 |
8.2 Pakete | 314 |
8.2.1 Importieren von Modulen aus Paketen | 315 |
8.2.2 Reguläre Pakete | 316 |
8.2.3 Namespace Packages | 317 |
8.2.4 Unterscheidung der Paketarten | 318 |
8.3 Kurz & knapp | 319 |
9 Dateien und Dateisystem | 322 |
9.1 Lesen und Schreiben von Dateien | 322 |
9.1.1 Eine einfache Textdatei auslesen | 323 |
9.1.2 Fehler beim Öffnen von Dateien | 324 |
9.1.3 Eine Datei schrittweise auslesen | 325 |
9.1.4 Zeilenweises Auslesen von Textdateien | 327 |
9.1.5 Textdateien schreiben | 328 |
9.1.6 Übersicht möglicher Modi der Funktion open() | 330 |
9.1.7 Aufgabenstellung | 331 |
9.2 Dateien und Dateisystem | 331 |
9.2.1 Verzeichnisse | 332 |
9.2.2 Pfade und Prüfung auf deren Existenz | 333 |
9.2.3 Pfade und Plattformunabhängigkeit | 335 |
9.2.4 Verzeichnisse und Dateien erzeugen und löschen | 336 |
9.2.5 Verzeichnisstrukturen erzeugen und löschen | 339 |
9.2.6 Umbenennen von Verzeichnissen und Dateien | 341 |
9.2.7 Kopieren und Verschieben | 343 |
9.3 Kurz & knapp | 345 |
10 GUI-Programmierung mit tkinter | 350 |
10.1 Warum gerade tkinter? | 350 |
10.2 Die Layout-Manager | 351 |
10.2.1 Absolute Positionierung | 351 |
10.2.2 Der pack-Manager | 352 |
10.2.3 Der grid-Manager | 357 |
10.2.4 Welcher Manager soll es sein? | 359 |
10.3 Flexible Fenstergröße | 360 |
10.4 Konfiguration von Widgets | 363 |
10.5 Steuerelemente im Detail | 365 |
10.5.1 Buttons | 365 |
10.5.2 Kontrollvariablen | 367 |
10.5.3 Eingabefelder | 368 |
10.5.4 Textboxen | 369 |
10.5.5 Checkboxen | 373 |
10.5.6 Radiobuttons | 375 |
10.5.7 Aufgabenstellung | 376 |
10.5.8 Lösungsvorschlag | 377 |
10.5.9 Listboxen | 378 |
10.5.10 Listbox mit Scrollbalken | 381 |
10.6 Fehlerquelltext | 382 |
10.6.1 Was ist die Aufgabe des Programms? | 382 |
10.6.2 Lösung zum Fehlerquelltext | 383 |
10.7 Dialogfenster | 385 |
10.8 Menüs | 388 |
10.8.1 Einfache Menüs | 388 |
10.8.2 Untermenüs | 389 |
10.9 Kurz & knapp | 391 |
11 Debugging | 396 |
11.1 Was ist ein Debugger? | 397 |
11.2 Eine einfache Fehlersuche | 397 |
11.2.1 Haltepunkte setzen und entfernen | 398 |
11.2.2 Das Programm durchlaufen und Werte betrachten | 399 |
11.2.3 Geht es auch ohne Haltepunkte? | 402 |
11.2.4 Interaktive Fehlersuche mit der Python-Konsole | 403 |
11.3 Debuggen von Funktionen und Methoden | 405 |
11.3.1 In Funktionen springen | 406 |
11.3.2 Abschnitte überspringen und Funktionen verlassen | 407 |
11.3.3 Clever springen | 408 |
11.4 Watches | 409 |
11.5 Haltepunkte im Detail | 411 |
11.5.1 Ein Beispiel zum Experimentieren | 411 |
11.5.2 Verwalten von Haltepunkten | 412 |
11.5.3 Unterbrechen oder nicht? | 416 |
11.5.4 Bedingte Haltepunkte | 416 |
11.5.5 Protokollierung | 417 |
11.5.6 Temporäre Haltepunkte | 418 |
11.5.7 Verkettete Haltepunkte | 419 |
11.5.8 Haltepunkte für Exceptions | 419 |
11.5.9 Kombination der Optionen | 420 |
11.6 Einsatz in der Praxis | 421 |
12 Versionsverwaltung mit Git | 422 |
12.1 Der vermeintlich leichte Weg | 422 |
12.2 Wie funktionieren Versionskontrollsysteme? | 423 |
12.2.1 Verallgemeinerte Arbeitsweise | 423 |
12.2.2 Zentrale und verteilte Versionskontrolle | 424 |
12.3 Was ist Git? | 424 |
12.4 Interessiert mich nicht, ich arbeite alleine! | 426 |
12.5 Vorbereitungen | 426 |
12.5.1 Git unter Windows installieren | 426 |
12.5.2 Git unter macOS installieren | 427 |
12.5.3 Git unter Linux installieren | 428 |
12.5.4 GitHub | 428 |
12.6 Los geht’s – Git lokal verwenden | 429 |
12.6.1 Ein bestehendes Projekt unter Versionskontrolle stellen | 429 |
12.6.2 Dateien hinzufügen | 431 |
12.6.3 Commit/Einchecken | 432 |
12.6.4 Änderungen vornehmen und überprüfen | 433 |
12.6.5 Änderungen rückgängig machen | 435 |
12.6.6 Betrachten der Historie | 436 |
12.6.7 Zu älteren Versionen zurückkehren – Möglichkeit 1 | 438 |
12.6.8 Dateien ignorieren | 439 |
12.7 Zusammenarbeit über ein Remote Repository | 440 |
12.7.1 Projekt auf GitHub veröffentlichen | 441 |
12.7.2 Ein Repository klonen | 441 |
12.7.3 Änderungen pushen | 443 |
12.7.4 Pull | 443 |
12.7.5 Wer hat’s erfunden? | 444 |
12.7.6 Automatisches Merging | 444 |
12.7.7 Mergen und Konflikte beheben | 445 |
12.8 Branching | 449 |
12.8.1 Um was geht es? | 449 |
12.8.2 Einen Branch erzeugen und damit arbeiten | 450 |
12.8.3 Zwischen Branches wechseln | 452 |
12.8.4 Branches mergen | 452 |
12.8.5 Branches pushen | 454 |
12.8.6 Fetch | 454 |
12.8.7 Zu älteren Versionen zurückkehren – Möglichkeit 2 | 455 |
12.9 Weitere nützliche Features | 455 |
12.9.1 Stashing – Änderungen temporär speichern | 456 |
12.9.2 Commits korrigieren | 458 |
12.9.3 Tagging | 458 |
12.10 Noch ein paar Tipps | 459 |
12.10.1 Zwei einfache Branching-Modelle | 459 |
12.10.2 Atomare Commits | 460 |
12.10.3 Test-Repository griffbereit halten | 461 |
12.10.4 Andere Git-Clients | 461 |
12.11 Kurz & knapp | 462 |
13 Minecraft auf dem Raspberry Pi | 466 |
13.1 Um was geht es in diesem Kapitel? | 466 |
13.1.1 Der Raspberry Pi – ein kleines Kraftpaket | 466 |
13.1.2 Minecraft Pi | 467 |
13.1.3 Was wird benötigt? | 468 |
13.2 Der Sprung ins kalte Wasser | 469 |
13.3 Die Entwicklungsumgebungen | 469 |
13.4 Den Raspberry Pi einrichten | 470 |
13.4.1 Erstellen der SD-Karte | 470 |
13.4.2 Einstellen des Tastaturlayouts | 471 |
13.4.3 Minecraft starten | 471 |
13.4.4 Die Steuerung | 471 |
13.5 Der erste Testlauf | 473 |
13.5.1 Arbeiten mit IDLE | 473 |
13.5.2 Arbeiten mit Thonny | 475 |
13.6 Das Begleitmaterial | 476 |
13.7 Die Minecraft Python API | 476 |
13.7.1 Quellen und weitere Informationen: | 477 |
13.7.2 Eine Übersicht der Minecraft API | 477 |
13.7.3 Die Klasse Minecraft | 477 |
13.7.4 Die Klasse CmdCamera | 480 |
13.7.5 Die Klasse CmdPlayer | 481 |
13.7.6 Die Klasse CmdEntity | 481 |
13.7.7 Die Klasse Block | 482 |
13.7.7.1 Eine Übersicht der wichtigsten Blöcke | 482 |
13.7.8 Noch einmal alles zusammen | 483 |
13.8 Beispiele zu Schleifen und Bedingungen | 485 |
13.8.1 Blocktypen ausprobieren | 485 |
13.8.2 Spielfigur automatisch durch die Welt bewegen | 487 |
13.8.3 Eine Treppe bauen | 488 |
13.8.4 Eine Pyramide bauen | 489 |
13.9 Beispiele zu Funktionen | 491 |
13.9.1 Swimmingpools bauen | 491 |
13.9.2 Moderne Kunst? | 493 |
13.10 Beispiele zu Klassen | 496 |
13.10.1 Blöcke regnen lassen | 496 |
13.10.2 Blinklichter | 499 |
13.11 Beispiele zu Containern | 502 |
13.11.1 Lichterkette | 502 |
13.11.2 Mengenoperationen | 504 |
13.12 Ein Beispiel zu Modulen und Paketen | 506 |
13.13 exit() – wie geht es weiter? | 509 |
Index | 510 |