Kanban
Реклама. ООО «ЛитРес», ИНН: 7719571260.
Оглавление
David J. Anderson. Kanban
Einfach Python
Inhaltsverzeichnis
Vorwort
Zielgruppe
Was vermittelt dieses Buch?
Tipp: Praxistipp
Aufbau dieses Buchs
Einstieg
Aufstieg
Praxisbeispiele
Schlussgedanken
Anhang
Sourcecode und ausführbare Programme
Verwendete Python-Version
Konventionen. Verwendete Zeichensätze
Verwendete Abkürzungen
Danksagung
Anregungen und Kritik
1Einführung. 1.1Python im Überblick
Hinweis: Python 2
Bestandteile von Python-Programmen
Zunehmende Popularität von Python
Zwischenfazit
1.2Los geht’s – Installation
1.2.1Python-Download
1.2.2Installation von Python
Python-Installation für Windows
Python-Installation für MacOS
1.2.3Nacharbeiten nach der Python-Installation
Nacharbeiten für Windows
Nacharbeiten für MacOS
1.2.4Python-Installation prüfen
1.2.5Python-Programm als Skript ausführen
1.3Entwicklungsumgebungen
1.3.1Installation von PyCharm
Hinweis: Möglicherweise leicht abweichende Screenshots
1.3.2PyCharm starten
1.3.3Erstes Projekt in PyCharm
1.3.4Erstes Modul in PyCharm
Neues Modul anlegen
Sourcecode editieren
Klasse ausführen
2Schnelleinstieg. 2.1Hallo Welt (Hello World)
2.2Variablen und Datentypen
2.2.1Definition von Variablen
Varianten der formatierten Ausgabe
2.2.2Variablen und Typen
Typumwandlung (Cast)
2.2.3Bezeichner (Variablennamen)
2.3Operatoren im Überblick
2.3.1Arithmetische Operatoren
Beispiele für Grundrechenarten
Modulo-Operator
Tipp: Übrigens …
Spezialfall: Division durch 0
2.3.2Zuweisungsoperatoren
Kurzschreibweisen
2.3.3Vergleichsoperatoren
2.3.4Logische Operatoren
2.4Fallunterscheidungen
Bedingte Ausführung mitif
ifundelsein Kombination
if,elifundelsein Kombination
Rekapitulation
Tipp: Kein switch in Python
2.5Funktionen
Funktionen definieren
Funktionen aufrufen
2.5.1Eigene Funktionen definieren
Spezialfall: Keine Rückgabe
Kombination mit Bedingungen
Funktionen als wiederverwendbare Bausteine
2.5.2Nützliche Beispiele aus Python
Vorteile durch den Einsatz der Built-in-Funktionen
2.5.3Fehlerbehandlung und Exceptions
2.6Kommentare
2.7Module
Beispiel
Zusammenfassung und Ergänzendes
Tipp: Besonderheiten beim Start und beim Import
2.8Built-in-Datentypen
2.8.1List
2.8.2Tupel
Besonderheit Tuple (Un-)Packing
2.8.3Set
2.8.4Dict
2.9Schleifen
2.9.1Besonderheit: Ranges
2.9.2Indexbasierte for-in-Schleife
Was passiert dabei im Detail?
Variieren der Schrittweite?
Durchlaufen einer Liste
2.9.3Wertebasierte for-in-Schleife
Was passiert dabei im Detail?
Anmerkung
2.9.4Index- und wertebasierte for-in-enumerate-Schleife
Beispiel für den Bedarf an Index und Wert
Tipp: Wahl der Schleifenvariante
2.9.5Die while-Schleife
Was passiert dabei im Detail?
2.10Weiterführende Informationen
2.11Aufgaben und Lösungen. 2.11.1Aufgabe 1: Mathematische Berechnungen
Lösung
2.11.2Aufgabe 2: Bedingung vereinfachen
Lösung
2.11.3Aufgabe 3: Funktion und if
Lösung
2.11.4Aufgabe 4: Selbstabholerrabatt
Lösung
Hinweis: Variante
2.11.5Aufgabe 5: Schleifen mit Berechnungen
Lösung
2.11.6Aufgabe 6: Schleifen und fixe Schrittweite
Lösung
2.11.7Aufgabe 7: Schleifen mit variabler Schrittweite
Lösung
2.11.8Aufgabe 8: Verschachtelte Schleifen – Variante 1
Lösung
2.11.9Aufgabe 9: Verschachtelte Schleifen – Variante 2
Lösung
2.11.10Aufgabe 10: Verschachtelte Schleifen – Variante 3
Lösung
3Strings
3.1Schnelleinstieg
3.1.1Gebräuchliche Stringaktionen. Stringkonkatenation
Groß- und Kleinschreibung
Tipp: Was sind Methoden?
Leerzeichen entfernen
Länge ermitteln
Auf leeren String prüfen
Auf einzelne Zeichen zugreifen
Iteration
Teilbereiche extrahieren – Slicing
Strings wiederholen
3.1.2Suchen und Ersetzen. Suchen und Enthaltensein
Weitersuchen
Ersetzen von Inhalten
Komplexeres Ersetzen von Inhalten
3.1.3Informationen extrahieren und formatieren. Informationen extrahieren
Formatierte Ausgabe
Formatierung mitcapitalize()undtitle()
3.1.4Praxisrelevante Funktionen im Kurzüberblick
3.2Nächste Schritte. 3.2.1Zeichenverarbeitung
3.2.2Strings und Listen. Umwandlung in eine Liste
Modifikation in einer Liste
Einen String aus einer Liste erzeugen
3.2.3Mehrzeilige Strings
Beispiel: HTML-Code
Tipp: Behandlung der führenden Leerzeichen
3.3Aufgaben und Lösungen. 3.3.1Aufgabe 1: Länge, Zeichen und Enthaltensein
Lösung
3.3.2Aufgabe 2: Zeichen wiederholen
Lösung
3.3.3Aufgabe 3: Vokale raten
Lösung: Vokale entfernen
Lösung: Vokale ersetzen
3.3.4Aufgabe 4: String Merge
Lösung
4Klassen und Objektorientierung
4.1Schnelleinstieg
4.1.1Grundlagen zu Klassen und Objekten
Theorie: Klassen und Objekte
Klassen definieren
Ein Objekt erzeugen
Theorie: Referenz und Identität
4.1.2Eigenschaften (Attribute) Zugriff auf die Attribute
Objektzustand
Wertebelegung der Attribute ändern
4.1.3Verhalten (Methoden)
Verhalten definieren
Tipp: Gedanken zur Erweiterung
Verhalten für Klassen definieren – statische Methoden und Variablen
4.1.4Objekte vergleichen – die Rolle von __eq__()
Vergleich von Objekten
Implementierung von__eq__()
Hinweis: Vergleich von Gleitkommazahlen (float)
4.2Nächste Schritte. 4.2.1Klassen ausführbar machen
Applikation als Klasse definieren
4.2.2Imports und Packages
Packages
Benutzerdefinierte Packages anlegen
4.2.3Übergang zum Einsatz einer IDE
Projekt in PyCharm anlegen
Modul anlegen
Sourcecode editieren
Klasse ausführen
4.2.4Verstecken von Informationen
Sichtbarkeiten / Zugreifbarkeit
Wertebereichsprüfungen
4.2.5Packages: Auswirkungen auf unsere Applikation
Sichtbarkeiten und Auswirkungen
Applikation in der IDE
4.3Vererbung
4.3.1Basisklassen
Vorgehen zur Definition von Basisklassen
4.3.2Typprüfung mit isinstance()
Anwendungsbeispiel
4.3.3Generalisierung und Spezialisierung
4.3.4Polymorphie
Subklassenbeziehungen undissubclass()
4.4Aufgaben und Lösungen. 4.4.1Aufgabe 1: Superheld
Lösung
4.4.2Aufgabe 2: Zähler
Lösung
4.4.3Aufgabe 3: Zähler mit Überlauf
Lösung
5Collections
5.1Schnelleinstieg. 5.1.1Die Klasse list
Liste erzeugen
Werte hinzufügen
Prüfen, ob ein Eintrag existiert
Positionsbasierter Zugriff
Modifikationen ausführen
Element positionsbasiert löschen
Spezielle Elemente löschen
Anzahl an Elementen ermitteln
Durch die Elemente iterieren
Listen sortieren
Alle Elemente löschen
Fallstricke beim Hinzufügen
Mehrere Elemente hinzufügen
5.1.2Die Klasse set
Leeresseterzeugen
Werte hinzufügen
Mehrere Werte hinzufügen
Prüfen, ob ein Eintrag existiert
Bestimmtes Element löschen
Anzahl an Elementen ermitteln
Durch die Elemente iterieren
Alle Elemente löschen
Mengenoperationen
5.1.3Die Klasse dict
Leeresdicterzeugen
Werte hinzufügen
Prüfen, ob ein Eintrag existiert
Prüfen, ob ein Wert existiert
Zugriff über Schlüssel
Modifikationen ausführen
Abbildung löschen
Anzahl an Einträgen ermitteln
Durch die Elemente iterieren
Alle Elemente löschen
5.2Nächste Schritte. 5.2.1Comprehensions
5.2.2Slicing – Zugriff auf Teilbereiche
Beispiel
5.2.3Sortierung – sort() / sorted()
Objekte sortieren
Die Funktionsorted()
5.2.4Tauschen von Elementen – swap()
Tipp: Rekursive Variante
5.2.5Reihenfolge umkehren – reverse() und reversed()
5.2.6Mehrdimensionale Listen
Einführendes Beispiel
Beispiel
Verbesserungen in der Ausgabe
Spezialfall: Nicht rechteckige Listen
5.3Praxisbeispiel: Einen Stack selbst realisieren
5.3.1Implementierung
Diskussion
Prüfung
5.3.2Stack im Einsatz
5.4Praxisbeispiel: Flächen füllen
Beispiel
Algorithmus
Prüfung
5.5Aufgaben und Lösungen. 5.5.1Aufgabe 1: Tennisverein-Mitgliederliste
Lösung
5.5.2Aufgabe 2: Liste mit Farbnamen füllen und filtern
Lösung
5.5.3Aufgabe 3: Duplikate entfernen – Variante 1
Lösung
5.5.4Aufgabe 4: Duplikate entfernen – Variante 2
Lösung
5.5.5Aufgabe 5: Hauptstädte
Lösung
5.5.6Aufgabe 6: Häufigkeiten von Namen
Lösung
5.5.7Aufgabe 7: Objekte mit Dictionary selbst gebaut
Lösung
5.5.8Aufgabe 8: Rotation um eine oder mehrere Positionen
Lösung
Tipp: Optimierung bei großen Werten fürn
5.5.9Aufgabe 9: Dreieckige Liste: Upside Down
Lösung: Brute Force mit neuer Liste und viel Kopieren
Lösung: Tricky Inplace mit Referenztausch
6Ergänzendes Wissen
6.1Benutzereingaben input()
Beispiel
Tipp: Unsichtbare Eingabe etwa für Passwörter
6.2Zufallswerte und das Modul random
Zufallswerte im Bereich 0 bis 1
Zufallswerte aus einem Bereich
Werte aus Liste zufällig wählen
Listen durcheinanderwürfeln
6.3Besonderheiten von Parametern
6.3.1Normale Parameter mit Position bzw. Name
6.3.2Parameter mit Defaultwert
6.3.3Var Args – variable Anzahl an Argumenten
Trickreiche Nutzung
Tipp: Besonderheiten
6.4Ternary-Operator
Beispiel
Tipp: Der ternäre Operator in der Praxis
6.5Aufzählungen mit Enum
Erste Idee: Listen mit fixen Werten
Aufzählungen mitEnumals Abhilfe
Besonderheit vonEnum: Werte für Konstanten
6.6break, continue und else in Schleifen
6.6.1Funktionsweise von break und continue
breakinfor
continueinfor
breakinwhile
continueinwhile
6.6.2Wie macht man es besser?
Beimbreak
Beimcontinue
6.6.3Besonderheit: else in Schleifen
6.7Ausdrücke mit eval() auswerten
Tipp: Was passiert unter der Motorhaube?
6.8Rekursion
Einführendes Beispiel
Beispiel: Fibonacci-Zahlen
Tipp: Abweichende Definition mit null als Startwert
Beispiel: Lineal
6.9Aufgaben und Lösungen. 6.9.1Aufgabe 1: Würfelspiel
Lösung
6.9.2Aufgabe 2: Temperaturumrechnung
Lösung
6.9.3Aufgabe 3: Palindrom-Prüfung mit Rekursion
Lösung
6.9.4Aufgabe 4: Einarmiger Bandit
Lösung
7Collections Advanced
7.1Sequenzielle Datentypen
Beispiel
7.2Iteratoren
Iteratoren in Python
Iteration durch einen Iterator
Hintergrundwissen: Funktionsweise derfor-Schleife für Iteratoren
Eigenen Iterator erstellen
7.3Generatoren
Beispiel: Generator implementieren
Tipp: Unterschied yield und return
Unterschiede zwischen Generatorfunktion und Iterator
7.4Datencontainer mit namedtuple
Einführendes Beispiel
Besonderheiten
Tipp: Einsatzgebiete für Named Tuples
7.5Einstieg in Lambdas
7.5.1Syntax von Lambdas
7.5.2Lambdas im Einsatz mit filter(), map() und reduce()
Kombination mitfilter()
Kombination mitmap()
Kombination mitreduce()
7.5.3Lambdas im Einsatz mit sort()
7.5.4Lambdas im Einsatz mit groupby()
Aufbereitungsalternativen
Spezialfall – Partitionierung
7.6Aufgaben und Lösungen. 7.6.1Aufgabe 1: Obstkorb
Lösung
7.6.2Aufgabe 2: Erwachsene aus Personenliste extrahieren
Lösung
7.6.3Aufgabe 3: Eigene Implementierung von rindex()
Lösung
7.6.4Aufgabe 4: Elemente eines Dictionaries allgemeingültig filtern
Lösung
7.6.5Aufgabe 5: Every-N-th-Iterator
Lösung
Kür: Mit Offset zum Überspringen von Elementen am Anfang
7.6.6Aufgabe 6: Greeting-Generator
Lösung
Achtung: Flüchtigkeitsfehler
7.6.7Aufgabe 7: Fibonacci-Generator
Lösung
7.6.8Aufgabe 8: Sortieren und Gruppieren
Lösung
8Verarbeitung von Dateien
8.1Schnelleinstieg
8.1.1Anlegen von Dateien und Verzeichnissen
Erzeugen neuer Verzeichnisse
Erzeugen neuer Dateien
8.1.2Aktuelles Verzeichnis wechseln
8.1.3Aktuelles Verzeichnis und absoluten Pfad ermitteln
8.1.4Inhalt eines Verzeichnisses auflisten
8.1.5Pfad ist Datei oder Verzeichnis?
8.1.6Auf Existenz prüfen
8.1.7Informationen in Dateien schreiben und daraus lesen
Öffnen von Dateien
Schließen von Dateien
Schreiben in Dateien
Einlesen aus Datei
Tipp: Walross-Operator :=
8.1.8Einfluss der Verarbeitungsmodi
Modusx– Erzeugen
Modusw– Überschreiben
Modusa– Anhängen
8.1.9Diverse Informationen ermitteln
Dateigröße bestimmen
Berechtigungen
Zeitpunkte
8.1.10Kopieren
8.1.11Umbenennen
8.1.12Löschen
Löschen einer Datei
Löschen eines Verzeichnisses
8.2Praxisbeispiel: Directory-Baum darstellen
8.2.1Basisvariante
8.2.2Variante mit schönerer Darstellung
8.2.3Finale Variante mit ausgeklügelter Darstellung
8.3JSON-Verarbeitung
8.3.1JSON in eine Datei schreiben
Beispiel
8.3.2Lesen von JSON aus einer Datei
Beispiel
8.3.3Pretty Printing
8.4Aufgaben und Lösungen. 8.4.1Aufgabe 1: Texte in Datei schreiben und wieder lesen
Lösung
8.4.2Aufgabe 2: Dateigrößen
Lösung
8.4.3Aufgabe 3: Existenzprüfung
Lösung
8.4.4Aufgabe 4: Rechteprüfung
Lösung
8.4.5Aufgabe 5: Verzeichnisinhalt auflisten
Lösung
Kür: Aufbereiten von Listen nur mit Dateien bzw. nur mit Verzeichnissen
9Fehlerbehandlung mit Exceptions
9.1Schnelleinstieg
Wichtige vordefinierte Fehler
9.1.1Fehlerbehandlung
Fehlerbehandlung mittryundexcept
Der letzte Wille – abschließende Aktionen und derfinally-Block
Python-Besonderheittry-else
9.1.2Exceptions selbst auslösen – raise
Beispiel
9.1.3Eigene Exception-Typen definieren
Einführendes Beispiel
Exception für Bereichsprüfung
9.1.4Propagation von Exceptions
Einführendes Beispiel
Beispiel
9.2Fehlerbehandlung in der Praxis
Beispiel
9.2.1Elegante Prüfungen mit assert
Zusicherungen zur Fehlersuche
Zusicherungen zur Parameterprüfung
9.3Automatic Resource Management (with)
9.4Aufgaben und Lösungen. 9.4.1Aufgabe 1: Abgesicherter Indexzugriff – Kür mit Fallback-Wert
Lösung
9.4.2Aufgabe 2: Einfacher Taschenrechner
Lösung
Kür
9.4.3Aufgabe 3: Resource Handling
Lösung
10Datumsverarbeitung
10.1Schnelleinstieg
10.1.1Zeitpunkte und die Klasse datetime
Aktuellen Zeitpunkt ermitteln
Beliebigesdatetimekonstruieren
Bestandteile eines Zeitpunkts ausgeben
Zeitpunkt aus Unix-Zeitstempel erzeugen
10.1.2Datumswerte und die Klasse date
Aktuelles Datum ermitteln
Beliebigesdatekonstruieren
Jahr, Monat und Tag ermitteln
Wochentage ermitteln
Tag im Monat ermitteln
Tag im Jahr ermitteln
Datum aus Zeitstempel erzeugen
Datum in Ordinal
10.1.3Zeit und die Klasse time
Aktuelle Zeit ermitteln
Eine spezielle Zeitangabe alstime-Objekt repräsentieren
Stunde, Minute, Sekunde und Mikrosekunde ausgeben
10.1.4Zeitdifferenzen und die Klasse timedelta
Einfache Datumsarithmetik
10.1.5Berechnungen
Monatslänge bestimmen
Länge des Jahrs bestimmen
Schaltjahr bestimmen
10.1.6Formatierung und Parsing
Die Methodestrftime()–datetime-Objekt zu String
Die Methodestrptime()– String zudatetime
10.2Praxisbeispiel: Kalenderausgabe
Vorüberlegungen
Lösung
Tipp: Hilfsmethoden und richtige Strukturierung
Prüfung
10.3Aufgaben und Lösungen. 10.3.1Aufgabe 1: Wochentage
Lösung
10.3.2Aufgabe 2: Freitag, der 13
Lösung
10.3.3Aufgabe 3: Mehrmals Freitag, der 13
Beispiele
Lösung
10.3.4Aufgabe 4: Schaltjahre
Beispiele
Lösung
11Praxisbeispiel: Tic Tac Toe
11.1Spielfeld initialisieren und darstellen
Spielfeld initialisieren
Spielfeld darstellen
11.2Setzen der Steine
11.3Prüfen auf Sieg
Grundgerüst
Baustein 1: Prüfung auf drei gleiche Symbole
Baustein 2: Prüfung der Horizontalen und Vertikalen
Baustein 3: Prüfung der Diagonalen
11.4Bausteine im Einsatz
Zwischenfazit
Bonus
Mögliche Erweiterungen
12Praxisbeispiel: CSV-Highscore-Liste einlesen
12.1Verarbeitung von Spielständen (Highscores)
Einlesen der Highscores
12.2Extraktion der Daten
12.3Besonderheiten der Implementierung. Behandlung von Fehlern beim Öffnen der Datei
Behandlung von Leerzeilen und Kommentaren
Ignorieren von unvollständigen Eingaben
Auswertung der Informationen
13Praxisbeispiel: Worträtsel
13.1Applikationsdesign – Vorüberlegungen zur Strukturierung
13.2Einlesen der verfügbaren Wörter
Exemplarische Datei mit Wörtern
Implementierung der KlasseWordImporter
13.3Hilfsdatenstrukturen
13.4Datenmodell
13.4.1Datenspeicherung und Initialisierung
13.4.2Zufällige Wahl von Richtung, Position, Wort und Buchstabe
13.4.3Algorithmus zum Verstecken von Wörtern
13.4.4Wort prüfen und platzieren
Weitere Hilfsmethoden und Auffüllen mit zufälligen Buchstaben
13.5HTML-Erzeugung
13.6Ausgabe als HTML und Darstellung im Browser
13.7Hauptapplikation
13.8Fazit
14Gute Angewohnheiten
14.1Grundregeln eines guten Programmierstils
14.1.1Keep It Human-Readable
14.1.2Keep it Understandable
Beispiel 1
Beispiel 2
Blockkommentare in Listings
14.2Coding Conventions
14.2.1PEP 8 – Coding Standard
Tooling
Ergänzendes Tooling
14.2.2Zen of Python
14.2.3Namensgebung
Vermeide Namenskürzel
Vermeide Variablennamen, die nur den Typ wiederholen
Verwende sinnvolle, konsistente Namen
Hinweis: Vorteil sprechender Namen
14.2.4Dokumentation. Vermeide Kommentare, die nur den Ablauf beschreiben
14.2.5Programmdesign. Prüfe Rückgabewerte und behandle Fehlersituationen
Beachte die maximale Funktionslänge von ca. 30–50 Zeilen
Beachte die maximale Klassenlänge von ca. 500–1000 Zeilen
14.2.6Parameterlisten. Halte die Parameterliste kurz
Halte die Reihenfolge von Parametern bei Methodenaufrufen konsistent
14.2.7Logik und Kontrollfluss. Vermeide expliziteTrue-/False-Literale inif-/while-Anweisungen
14.3Auch ans Testen denken
14.3.1Das Pytest-Framework
Installation von Pytest
14.3.2Schreiben und Ausführen von Tests
Beispiel: Ein erster Unit Test
Ausführen von Tests
Ausführen von Tests auf der Konsole
Ausführen von Tests aus der IDE
15Schlusswort
Persönliche Bitte
Weiterführende Literatur zu Python
Weiterführende Literatur zu Algorithmen und Datenstrukturen
Weiterführende Literatur zu Pytest
ASchlüsselwörter im Überblick
A.1Schlüsselwörter im Überblick
BSchnelleinstieg Python-REPL
B.1Python-REPL
Einführendes Beispiel
Weitere Kommandos und Möglichkeiten
Komplexere Aktionen
Beenden des Python-Kommandozeileninterpreters
CWesentliche Neuerungen aus Python 3.10 im Kurzüberblick
C.1Fehlermeldungen
C.1.1Fehlermeldungen bei Zuweisungen
Python 3.9.x
Verbesserung mit Python 3.10
C.1.2Fehlermeldungen bei unvollständigen Strings
Python 3.9.x
Verbesserung mit Python 3.10
C.2Fallunterscheidungen mit match
Python 3.9.x
Verbesserung mit Python 3.10
Kombination von Werten
Komplexeres Matching I
Komplexeres Matching II
C.3Verschiedenes. C.3.1Verbesserungen bei Kontextmanagern
Verbesserung mit Python 3.10
C.3.2Verbesserungen der Performance
C.3.3Erweiterung bei zip() Python 3.9.x
Verbesserung mit Python 3.10
C.3.4Verbesserungen bei Typprüfungen
Python 3.9.x
Verbesserung mit Python 3.10
Tipp: Interessantes Video zu den Neuerungen in Python 3.10
Literaturverzeichnis
Fußnoten. 1Einführung
2Schnelleinstieg
3Strings
4Klassen und Objektorientierung
5Collections
6Ergänzendes Wissen
8Verarbeitung von Dateien
9Fehlerbehandlung mit Exceptions
12Praxisbeispiel: CSV-Highscore-Liste einlesen
Index
Отрывок из книги
Dipl.-Inform. Michael Inden ist Oracle-zertifizierter Java-Entwickler. Nach seinem Studium in Oldenburg hat er bei diversen internationalen Firmen in verschiedenen Rollen etwa als Softwareentwickler, -architekt, Consultant, Teamleiter, CTO sowie Leiter Academy gearbeitet. Zurzeit ist er freiberuflich als Autor und Trainer in Zürich tätig.
Michael Inden hat über zwanzig Jahre Berufserfahrung beim Entwurf komplexer Softwaresysteme gesammelt, an diversen Fortbildungen und mehreren Java-One-Konferenzen teilgenommen. Sein besonderes Interesse gilt dem Design qualitativ hochwertiger Applikationen sowie dem Coaching. Sein Wissen gibt er gerne als Trainer in internen und externen Schulungen und auf Konferenzen weiter, etwa bei der JAX/W-JAX, JAX London, Oracle Code One, ch.open sowie bei der Java User Group Switzerland.
.....
6.9.2Aufgabe 2: Temperaturumrechnung
6.9.3Aufgabe 3: Palindrom-Prüfung mit Rekursion
.....