Titelei
Impressum
Inhalt
Vorwort
1 Grundlagen
1.1 Hältst Du das richtige Buch in den Händen?
1.2 Dieses Buch bricht mit einigen Konventionen!
1.3 Die Arbeit mit diesem Buch
1.4 Das Kapitel zu Minecraft
1.5 Das Begleitmaterial zum Buch
1.6 Anregungen? Kritik? Forum?
1.7 Die Geschichte von Python in 120 Wörtern
1.8 Was kann man mit Python machen (und was nicht)?
1.9 Interpreter vs. Compiler
1.10 Python 2.7 oder 3.7?
1.11 Die Entwicklungsumgebung PyCharm
1.11.1 Alternativen zu PyCharm
1.12 Python-Interpreter installieren
1.12.1 Python-Interpreter unter Windows installieren
1.12.2 Python-Interpreter unter macOS installieren
1.12.3 Python-Interpreter unter Linux installieren
1.12.4 PyCharm unter Windows installieren
1.12.5 PyCharm unter macOS installieren
1.12.6 PyCharm unter Linux installieren
1.12.7 PyCharm einrichten
1.13 Genug geredet, los gehts!
1.13.1 Das erste Programm eingeben
1.13.2 Ausführen des ersten Beispiels
1.13.3 Laden der Beispiele
1.13.4 Der Quelltext im Detail
1.13.5 Kommentare im Detail
1.14 PEP8 – um sie ewig zu binden
1.15 Python-Programme ohne Entwicklungsumgebung starten
1.15.1 Python-Programme unter Windows starten
1.15.2 Python-Programme unter Linux oder macOS starten
1.16 Python interaktiv
1.17 Aufgabenstellung
1.18 Kurz & knapp
2 Variablen
2.1 Was sind Variablen?
2.2 Statisch typisiert vs. dynamisch typisiert
2.3 Einige Details vorab – Variablen sind auch nur Namen
2.4 Richtlinien für Variablennamen
2.4.1 Von Kamelen, Schlangen und Pascal
2.4.2 Sinnvolle Variablennamen
2.5 Rechnen mit Variablen
2.5.1 Verkürzte Schreibweise bei Rechenoperationen
2.5.2 Gibt es noch weitere Datentypen?
2.5.3 Konvertierung von Datentypen
2.5.4 Besonderheiten bei der Konvertierung von Datentypen
2.6 Formatierte Ausgabe mit print()
2.7 Genauigkeit von Fließkommazahlen
2.7.1 Formatierte Ausgabe von Fließkommazahlen
2.8 Den ganzzahligen Rest einer Division bestimmen
2.9 Konstanten, Konventionen und Restriktionen
2.10 Fehlerquelltext
2.10.1 Was ist die Aufgabe des Programms?
2.10.2 Lösungsvorschlag
2.10.3 Die gemeinen Kleinigkeiten
2.11 Aufgabenstellung
2.11.1 Einige Tipps
2.11.2 Lösung zur Aufgabenstellung
2.12 Kurz & knapp
3 Schleifen und Bedingungen
3.1 Was sind Schleifen und Bedingungen?
3.2 Die if-Bedingung
3.2.1 Blöcke und Einrückungen
3.2.2 Arbeit sparen mit else
3.2.3 elif
3.3 Der Platzhalter pass
3.4 Blöcke im interaktiven Modus
3.5 Logische Operatoren
3.6 PyCharm – Korrekturvorschläge übernehmen
3.7 while-Schleifen
3.7.1 Eine Schleife mit break vorzeitig beenden
3.7.2 continue in while-Schleifen
3.7.3 while-else
3.8 for-Schleifen
3.8.1 Eine einfache Zählschleife
3.8.2 Ein Wort zu Schleifenvariablen
3.8.3 Die Funktion range() im Detail
3.8.4 break und continue in for-Schleifen
3.8.5 Sonderfall Unterstrich: die Wegwerfvariable
3.9 Ein kurzer Abstecher: Exceptions
3.10 Fehlerquelltext
3.10.1 Was ist die Aufgabe des Programms?
3.10.2 Lösung zum Fehlerquelltext
3.11 Aufgabenstellung
3.11.1 Einige Tipps
3.11.2 Lösungsvorschlag
3.12 Ein umfangreicheres Beispiel: Zahlenraten
3.12.1 Die Hauptschleife
3.12.2 Ein neues Spiel starten
3.12.3 Abfrage des Schwierigkeitsgrades und Beenden des Spiels
3.13 Kurz & knapp
4 Funktionen
4.1 Was sind Funktionen?
4.2 Eine einfache Funktion definieren
4.3 Parameter, Argumente und Rückgabewert
4.4 Weitere Möglichkeiten, Funktionen aufzurufen
4.5 Globale und lokale Variablen
4.5.1 Ein bisschen mehr Verwirrung, bitte!
4.5.2 Das Schlüsselwort global
4.5.3 Auch Parameter sind lokal
4.5.4 Ein Wort zu globalen Variablen
4.5.5 Von Schatten und Hauptprogrammen
4.6 Standardwerte für Parameter
4.7 Schlüsselwortparameter
4.8 Wann sollten Funktionen zum Einsatz kommen?
4.9 Aufgabenstellung
4.9.1 Lösung zur Aufgabenstellung
4.10 Vorgehensweise bei größeren Projekten
4.11 Rekursion
4.12 Fehlerquelltext
4.12.1 Was ist die Aufgabe des Programms?
4.12.2 Lösung zum Fehlerquelltext
4.13 Kurz & knapp
5 Klassen
5.1 Was ist Objektorientierung?
5.2 Eine einfache Klasse definieren
5.2.1 Aufbau einer Klasse
5.2.2 Erzeugen von Objekten
5.2.3 Verwenden der Objekte
5.3 Kontrollierter Zugriff auf Attribute: Properties
5.3.1 Getter
5.3.2 Setter
5.3.3 Wann sollten Attribute und wann Properties verwendet werden?
5.3.4 Nachträgliches Umstellen auf Properties
5.4 Dynamische Attribute
5.5 Klassenattribute
5.5.1 Stolpersteine bei Klassenattributen
5.6 Statische Methoden
5.7 Zwischenstand: Braucht man das wirklich?
5.8 Aufgabenstellung
5.8.1 Einige Tipps
5.8.2 Lösungsvorschlag
5.9 Das Gleiche ist nicht dasselbe
5.9.1 Für Fortgeschrittene: Parameterübergabe im Detail
5.10 None
5.11 Vererbung
5.11.1 Ein einfaches Beispiel
5.11.2 Überschreiben von Methoden
5.12 Wie das Smartphone erfunden wurde – oder: Mehrfachvererbung
5.13 Für Fortgeschrittene: Binden von Methoden
5.13.1 Ein Blick hinter die Kulissen
5.13.2 Klassen um eigene Funktionen erweitern
5.13.3 Statische Methoden und instanzbezogene Bindung
5.14 Überschreiben der Methode __str__()
5.15 Und wo ist der Fehlerquelltext?
5.16 Kurz & knapp
6 Container
6.1 Was sind Container?
6.1.1 Eine Anmerkung, bevor es losgeht
6.2 Listen
6.2.1 Listen erzeugen und auf Elemente zugreifen
6.2.2 Listen dynamisch erzeugen
6.2.3 Elemente löschen oder ersetzen
6.2.4 Aufgabenstellung
6.2.5 Sortieren von Listen
6.2.6 Listen verknüpfen
6.2.7 Nicht nur für Fortgeschrittene: tiefes und flaches Kopieren
6.3 Tupel
6.3.1 Unterschiede zu Listen
6.3.2 Vorsicht: Instanzen in Tupeln können geändert werden
6.3.3 Mehrere Rückgabewerte mit Tupeln
6.3.4 Für Fortgeschrittene: namedtuple
6.4 Strings
6.4.1 Für Fortgeschrittene: Darum sind Strings unveränderlich
6.4.2 Slicing
6.4.3 Arbeiten mit Strings
6.4.4 Strings verbinden
6.4.5 Zerlegen und wieder zusammensetzen: split und join
6.4.6 Strings „aufbereiten“
6.4.7 Ändern der Groß- und Kleinschreibung
6.4.8 Strings durchsuchen
6.4.9 Aufgabenstellung
6.4.10 Ersetzungen durchführen
6.5 Dictionaries
6.5.1 Grundlagen von Dictionaries
6.5.2 Vorsicht beim Zugriff!
6.5.3 Dictionaries durchlaufen und verändern
6.5.4 Elemente aus einem Dictionary entfernen
6.6 Fehlerquelltext
6.6.1 Was ist die Aufgabe des Programms?
6.6.2 Lösung zum Fehlerquelltext
6.7 Sets und Frozensets
6.7.1 Einfache Sets/Frozensets erzeugen
6.7.2 Sets: Elemente hinzufügen und entfernen
6.7.3 Mengenoperationen
6.8 Kurz & knapp
7 Exceptions
7.1 Was sind Exceptions?
7.2 Fehler? Die passieren mir doch nicht!
7.3 Die Mechanik von Exceptions
7.4 Abfangen unterschiedlicher Exceptions
7.5 Alle Exceptions fangen
7.6 Eigene Exceptions
7.7 else und finally
7.8 Einige allgemeine Tipps
7.9 Kurz & knapp
8 Module und Pakete
8.1 Module
8.1.1 Grundlagen
8.1.2 Dokumentation von Modulen
8.1.3 Umbenennen eines Namensraums
8.1.4 Selektives Importieren
8.1.5 Namensräume haben ihren Sinn
8.1.6 Batteries included!
8.1.7 Reihenfolge beim Importieren
8.1.8 Eigene Module in mehreren Projekten nutzen
8.1.9 Tipps für das Schreiben von Modulen
8.1.10 Automatische Ausführung beim Import verhindern
8.2 Pakete
8.2.1 Importieren von Modulen aus Paketen
8.2.2 Reguläre Pakete
8.2.3 Namespace Packages
8.2.4 Unterscheidung der Paketarten
8.3 Kurz & knapp
9 Dateien und Dateisystem
9.1 Lesen und Schreiben von Dateien
9.1.1 Eine einfache Textdatei auslesen
9.1.2 Fehler beim Öffnen von Dateien
9.1.3 Eine Datei schrittweise auslesen
9.1.4 Zeilenweises Auslesen von Textdateien
9.1.5 Textdateien schreiben
9.1.6 Übersicht möglicher Modi der Funktion open()
9.1.7 Aufgabenstellung
9.2 Dateien und Dateisystem
9.2.1 Verzeichnisse
9.2.2 Pfade und Prüfung auf deren Existenz
9.2.3 Pfade und Plattformunabhängigkeit
9.2.4 Verzeichnisse und Dateien erzeugen und löschen
9.2.5 Verzeichnisstrukturen erzeugen und löschen
9.2.6 Umbenennen von Verzeichnissen und Dateien
9.2.7 Kopieren und Verschieben
9.3 Kurz & knapp
10 GUI-Programmierung mit tkinter
10.1 Warum gerade tkinter?
10.2 Die Layout-Manager
10.2.1 Absolute Positionierung
10.2.2 Der pack-Manager
10.2.3 Der grid-Manager
10.2.4 Welcher Manager soll es sein?
10.3 Flexible Fenstergröße
10.4 Konfiguration von Widgets
10.5 Steuerelemente im Detail
10.5.1 Buttons
10.5.2 Kontrollvariablen
10.5.3 Eingabefelder
10.5.4 Textboxen
10.5.5 Checkboxen
10.5.6 Radiobuttons
10.5.7 Aufgabenstellung
10.5.8 Lösungsvorschlag
10.5.9 Listboxen
10.5.10 Listbox mit Scrollbalken
10.6 Fehlerquelltext
10.6.1 Was ist die Aufgabe des Programms?
10.6.2 Lösung zum Fehlerquelltext
10.7 Dialogfenster
10.8 Menüs
10.8.1 Einfache Menüs
10.8.2 Untermenüs
10.9 Kurz & knapp
11 Debugging
11.1 Was ist ein Debugger?
11.2 Eine einfache Fehlersuche
11.2.1 Haltepunkte setzen und entfernen
11.2.2 Das Programm durchlaufen und Werte betrachten
11.2.3 Geht es auch ohne Haltepunkte?
11.2.4 Interaktive Fehlersuche mit der Python-Konsole
11.3 Debuggen von Funktionen und Methoden
11.3.1 In Funktionen springen
11.3.2 Abschnitte überspringen und Funktionen verlassen
11.3.3 Clever springen
11.4 Watches
11.5 Haltepunkte im Detail
11.5.1 Ein Beispiel zum Experimentieren
11.5.2 Verwalten von Haltepunkten
11.5.3 Unterbrechen oder nicht?
11.5.4 Bedingte Haltepunkte
11.5.5 Protokollierung
11.5.6 Temporäre Haltepunkte
11.5.7 Verkettete Haltepunkte
11.5.8 Haltepunkte für Exceptions
11.5.9 Kombination der Optionen
11.6 Einsatz in der Praxis
12 Versionsverwaltung mit Git
12.1 Der vermeintlich leichte Weg
12.2 Wie funktionieren Versionskontrollsysteme?
12.2.1 Verallgemeinerte Arbeitsweise
12.2.2 Zentrale und verteilte Versionskontrolle
12.3 Was ist Git?
12.4 Interessiert mich nicht, ich arbeite alleine!
12.5 Vorbereitungen
12.5.1 Git unter Windows installieren
12.5.2 Git unter macOS installieren
12.5.3 Git unter Linux installieren
12.5.4 GitHub
12.6 Los geht's – Git lokal verwenden
12.6.1 Ein bestehendes Projekt unter Versionskontrolle stellen
12.6.2 Dateien hinzufügen
12.6.3 Commit/Einchecken
12.6.4 Änderungen vornehmen und überprüfen
12.6.5 Änderungen rückgängig machen
12.6.6 Betrachten der Historie
12.6.7 Zu älteren Versionen zurückkehren – Möglichkeit 1
12.6.8 Dateien ignorieren
12.7 Zusammenarbeit über ein Remote Repository
12.7.1 Projekt auf GitHub veröffentlichen
12.7.2 Ein Repository klonen
12.7.3 Änderungen pushen
12.7.4 Pull
12.7.5 Wer hat's erfunden?
12.7.6 Automatisches Merging
12.7.7 Mergen und Konflikte beheben
12.8 Branching
12.8.1 Um was geht es?
12.8.2 Einen Branch erzeugen und damit arbeiten
12.8.3 Zwischen Branches wechseln
12.8.4 Branches mergen
12.8.5 Branches pushen
12.8.6 Fetch
12.8.7 Zu älteren Versionen zurückkehren – Möglichkeit 2
12.9 Weitere nützliche Features
12.9.1 Stashing – Änderungen temporär speichern
12.9.2 Commits korrigieren
12.9.3 Tagging
12.10 Noch ein paar Tipps
12.10.1 Zwei einfache Branching-Modelle
12.10.2 Atomare Commits
12.10.3 Test-Repository griffbereit halten
12.10.4 Andere Git-Clients
12.11 Kurz & knapp
13 Minecraft auf dem Raspberry Pi
13.1 Um was geht es in diesem Kapitel?
13.1.1 Der Raspberry Pi – ein kleines Kraftpaket
13.1.2 Minecraft Pi
13.1.3 Was wird benötigt?
13.2 Der Sprung ins kalte Wasser
13.3 Die Entwicklungsumgebungen
13.4 Den Raspberry Pi einrichten
13.4.1 Erstellen der SD-Karte
13.4.2 Einstellen des Tastaturlayouts
13.4.3 Minecraft starten
13.4.4 Die Steuerung
13.5 Der erste Testlauf
13.5.1 Arbeiten mit IDLE
13.5.2 Arbeiten mit Thonny
13.6 Das Begleitmaterial
13.7 Die Minecraft Python API
13.7.1 Quellen und weitere Informationen:
13.7.2 Eine Übersicht der Minecraft API
13.7.3 Die Klasse Minecraft
13.7.4 Die Klasse CmdCamera
13.7.5 Die Klasse CmdPlayer
13.7.6 Die Klasse CmdEntity
13.7.7 Die Klasse Block
13.7.8 Noch einmal alles zusammen
13.8 Beispiele zu Schleifen und Bedingungen
13.8.1 Blocktypen ausprobieren
13.8.2 Spielfigur automatisch durch die Welt bewegen
13.8.3 Eine Treppe bauen
13.8.4 Eine Pyramide bauen
13.9 Beispiele zu Funktionen
13.9.1 Swimmingpools bauen
13.9.2 Moderne Kunst?
13.10 Beispiele zu Klassen
13.10.1 Blöcke regnen lassen
13.10.2 Blinklichter
13.11 Beispiele zu Containern
13.11.1 Lichterkette
13.11.2 Mengenoperationen
13.12 Ein Beispiel zu Modulen und Paketen
13.13 exit() – wie geht es weiter?
Heiko Kalista
Python 3
Einsteigen und
Durchstarten
Alle in diesem Buch enthaltenen Informationen, Verfahren und Darstellungen wurden nach bestem Wissen zusammengestellt und mit Sorgfalt getestet. Dennoch sind Fehler nicht ganz auszuschließen. Aus diesem Grund sind die im vorliegenden Buch enthaltenen Informationen mit keiner Verpflichtung oder Garantie irgendeiner Art verbunden. Autoren und Verlag übernehmen infolgedessen keine juristische Verantwortung und werden keine daraus folgende oder sonstige Haftung übernehmen, die auf irgendeine Art aus der Benutzung dieser Informationen – oder Teilen davon – entsteht.
Ebenso übernehmen Autoren und Verlag keine Gewähr dafür, dass beschriebene Verfahren usw. frei von Schutzrechten Dritter sind. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Buch berechtigt deshalb auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen und MarkenschutzGesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften.
Bibliografische Information der Deutschen Nationalbibliothek: Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
Dieses Werk ist urheberrechtlich geschützt. Alle Rechte, auch die der Übersetzung, des Nachdruckes und der Vervielfältigung des Buches, oder Teilen daraus, vorbehalten. Kein Teil des Werkes darf ohne schriftliche Genehmigung des Verlages in irgendeiner Form (Fotokopie, Mikrofilm oder ein anderes Verfahren) – auch nicht für Zwecke der Unterrichtsgestaltung – reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden.
© 2018 Carl Hanser Verlag München
www.hanser-fachbuch.de
Lektorat: Sylvia Hasselbach
Copy editing: Walter Saumweber, Ratingen
Umschlagdesign: Marc Müller-Bremer, München, www.rebranding.de
Umschlagrealisation: Stephan Rönigk
Gesamtherstellung: Kösel, Krugzell
ISBN 978-3-446-45469-9
E-Book ISBN 978-3-446-45689-1
Verwendete Schriften: SourceSansPro und SourceCodePro (Lizenz)
CSS-Version: 1.0
Font License | Zurück zum Impressum |
Copyright 2010, 2012, 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
Vorwort |
Wer sich in die Welt der Programmierung wagt, steht meist vor der Frage, welche Programmiersprache am besten für den Einstieg geeignet ist. Die Antwort darauf hängt naturgemäß von verschiedenen Aspekten ab: Was möchte man entwickeln, welche Hardware und welche Betriebssysteme spielen eine Rolle und wie leicht ist die gewählte Sprache zu lernen?
Diese Fragen stellen sich jedoch nicht nur dann, wenn man sich zum ersten Mal mit der Programmierung beschäftigt und einen Einstieg sucht. Als Entwickler sieht man sich häufig mit neuen Situationen konfrontiert und muss abwägen, ob nicht eine andere Programmiersprache als die bisher verwendete in der aktuellen Situation besser geeignet ist. Eine Programmiersprache ist wie ein Werkzeug: Man sucht sich für jede Aufgabe das passende heraus. Doch es gibt auch einen weiteren, viel einfacheren Grund, eine neue Programmiersprache zu lernen: die reine Neugierde, die den meisten Entwicklern eigen ist.
Python erfreut sich nicht ohne Grund großer und stets steigender Beliebtheit. Schließlich handelt es sich um eine Sprache, die sich leicht erlernen lässt und mit der gleichzeitig enorm viel möglich ist. Ob Du nun bereits eine Programmiersprache beherrschst, oder ob Du Dich zum Einstieg für Python entschieden hast: Dieses Buch ist so konzipiert, dass Du es in beiden Fällen nutzen kannst.
Beim Schreiben dieses Buches war es mir besonders wichtig, eine lockere und gemütliche Atmosphäre zu erzeugen. Wenn Du beim Lesen den Eindruck hast, dass man bei einer Tasse Kaffee zusammensitzt und gemeinsam neue Themen entdeckt, dann ist mir das hoffentlich auch gelungen.
Danksagung
Der erste und größte Dank gilt an dieser Stelle Naomi, die immer an meiner Seite ist und jederzeit Verständnis hatte, wenn ich mich zum Schreiben ins stille Kämmerlein zurückzog. Ohne Deine Unterstützung wäre dieses Buch niemals zustande gekommen!
Besonderer Dank gilt allen meinen Freunden und meiner Familie für das nicht selbstverständliche Verständnis in hektischen Zeiten.
Bettina Zankl möchte ich für das Durcharbeiten der einzelnen Kapitel und für die vielen konstruktiven und wertvollen Vorschläge danken. Der nächste Behelfsdöner kann kommen!
Sylvia Hasselbach, Irene Weilhart, und Kristin Rothe vom Carl Hanser Verlag möchte ich für die tolle Zusammenarbeit danken. Ich wette, irgendwo im Verlagsgebäude hängt nun ein Schild mit dem Aufdruck „Herr Kalista hat mal wieder eine Frage . . .“.
Vielen Dank an Walter Saumweber für das gewissenhafte Korrektorat und das tolle Feedback!
Am Rande Hessens, im Juli 2018
Heiko Kalista
1 | Grundlagen |