Cover

Inhalt

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 Markenschutz­Gesetzgebung 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.

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


Image

1 Grundlagen