Python 3 - Michael Weigend - E-Book

Python 3 E-Book

Michael Weigend

0,0

Beschreibung

  • Einführung in alle Sprachgrundlagen: Klassen, Objekte, Vererbung, Kollektionen, Dictionaries
  • Benutzungsoberflächen und Multimediaanwendungen mit PyQt, Datenbanken, XML, Internet-Programmierung mit CGI, WSGI und Django
  • Wissenschaftliches Rechnen mit NumPy, parallele Verarbeitung großer Datenmengen, Datenvisualisierung mit Matplotlib
  • Übungen mit Musterlösungen zu jedem Kapitel

Die Skriptsprache Python ist mit ihrer einfachen Syntax hervorragend für Einsteiger geeignet, um modernes Programmieren zu lernen. Mit diesem Buch erhalten Sie einen umfassenden Einstieg in Python 3 und lernen darüber hinaus auch weiterführende Anwendungsmöglichkeiten kennen. Michael Weigend behandelt Python von Grund auf und erläutert die wesentlichen Sprachelemente. Er geht dabei besonders auf die Anwendung von Konzepten der objektorientierten Programmierung ein.

Insgesamt liegt der Schwerpunkt auf der praktischen Arbeit mit Python. Ziel ist es, die wesentlichen Techniken und dahinterstehenden Ideen anhand zahlreicher anschaulicher Beispiele verständlich zu machen. Zu typischen Problemstellungen werden Schritt für Schritt Lösungen erarbeitet. So erlernen Sie praxisorientiert die Programmentwicklung mit Python und die Anwendung von Konzepten der objektorientierten Programmierung.

Alle Kapitel enden mit einfachen und komplexen Übungsaufgaben mit vollständigen Musterlösungen.

Der Autor wendet sich sowohl an Einsteiger als auch an Leser, die bereits mit einer höheren Programmiersprache vertraut sind.

Aus dem Inhalt:
  • Datentypen, Kontroll-strukturen, Funktionen, Generatoren
  • Modellieren mit Sequenzen, Dictionaries und Mengen
  • Klassen, Objekte, Vererbung, Polymorphie
  • Module nutzen und auf PyPI veröffentlichen
  • Zeichenketten und reguläre Ausdrücke
  • Datenmodellierung, Datenbanken, XML und JSON
  • Grafische Benutzungsoberflächen mit tkinter und PyQt
  • Threads und Events, Bildverarbeitung mit PIL
  • Systemfunktionen, Testen und Performance-Analyse
  • CGI, WSGI und Rapid Web-Development mit Django
  • Wissenschaftliche Projekte mit NumPy
  • Datenvisualisierung mit Matplotlib und Messwerterfassung
  • Parallele Programmierung: Pipes, Queues, Pools

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 1162

Veröffentlichungsjahr: 2022

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Inhaltsverzeichnis
Python 3
Impressum
Einleitung
Warum Python?
Python 3
An wen wendet sich dieses Buch?
Inhalt und Aufbau
Hinweise zur Typographie
Programmbeispiele
Kapitel 1: Grundlagen
1.1 Was ist Programm‌ieren?
1.2 Hardware‌ und Software‌
1.3 Programm als Algorithmus
1.4 Syntax und Semantik
1.5 Interpreter‌ und Compiler‌
1.6 Programmierparadi‌gmen
1.7 ‌Objektorientierte‌ Programmierung
1.7.1 Strukturelle Zerlegung
1.7.2 Die Welt als System von Objekten
1.7.3 Objekte besitzen Attribute und beherrschen Methode‌n
1.7.4 Objekte sind Instanz‌en von Klasse‌n
1.8 Hintergrund: Geschichte der objektorientierten Programmierung
1.9 Aufgaben
1.10 Lösungen
Kapitel 2: Der Einstieg – Python im interaktiven Modus‌‌
2.1 Python installieren
2.2 Python im interaktiven Modus‌‌
2.2.1 Start des Python-Interpreter‌s in einem Konsolenfenster
2.2.2 Die IDLE-Shell‌
2.2.3 Die ersten Python-Befehle ausprobieren
2.2.4 Hotkeys
2.3 Objekt‌e
2.4 Name‌‌n
2.5 Hintergrund: Syntax-Regeln für Bezeichner
2.6 Schlüsselwörter
2.7 Anweisung‌en
2.7.1 Ausdruckanweisung‌en
2.7.2 Impor‌t-Anweisungen
2.7.3 Zuweisun‌gen
2.7.4 Erweiterte Zuweisungen
2.7.5 Hintergrund: Dynamische Typisierung‌
2.8 Aufgaben
2.9 Lösungen
Kapitel 3: Python-Skript‌e
3.1 Ausprobieren, nachmachen, besser machen!
3.2 Skripte editieren‌ und ausführen mit IDLE‌
3.3 Ausführen eines Python-Skripts
3.4 Kommentar‌e
3.5 Die Zeilenstruktur‌ von Python-Programmen
3.6 Das EVA-Prinzip‌
3.7 Phasen der Programmentwicklung
3.8 Guter Programmierstil‌
3.9 Hintergrund: Die Kunst des Fehler‌findens
3.10 Weitere Entwicklungsumgebungen für Python
3.10.1 Thonny – eine Entwicklungsumgebung für Python-Einsteiger
3.10.2 Python in der Cloud
3.10.3 Jupyter Notebook und Google Colab
3.10.4 Entwicklungsumgebungen für Profis
3.11 Aufgaben
3.12 Lösungen
Kapitel 4: Standard-Datentyp‌en
4.1 Daten als Objekte
4.2 Fundamentale Datentypen im Überblick
4.3 Typen und Klassen
4.4 NoneTyp‌‌‌e
4.5 Wahrheitswert‌e – der Datentyp bool‌
4.6 Ganze Zahl‌‌en
4.7 Gleitkommazahl‌‌en
4.8 Komplexe Zahl‌‌en
4.9 Arithmetische Operatoren für Zahlen
4.10 Sequenz‌en
4.10.1 Zeichenkette‌n (String‌s)
4.10.2 Bytestring‌s
4.10.3 Tupel‌
4.10.4 Liste‌
4.10.5 Bytearray
4.10.6 Einige Grundoperationen für Sequenzen
4.10.7 Veränderbare und unveränderbar‌e Sequenzen
4.11 Menge‌n
4.12 Dictionaries
4.13 Typumwandlung‌en
4.13.1 int()‌
4.13.2 float()‌
4.13.3 complex()‌
4.13.4 bool()‌
4.13.5 str()‌‌
4.13.6 dict()‌, list()‌ und tuple()‌
4.14 Aufgaben
4.15 Lösungen
Kapitel 5: Kontrollstruktu‌ren
5.1 Einfache Bedingung‌en
5.1.1 Vergleich‌e
5.1.2 Zugehörigkeit zu einer Menge‌ (in‌‌, not in‌)
5.1.3 Beliebige Ausdrücke als Bedingungen
5.2 Zusammengesetzte Bedingungen – logische Operator‌en
5.2.1 Negation‌ (not‌)
5.2.2 Konjunktion‌ (and‌)
5.2.3 Disjunktion‌ (or‌)
5.2.4 Formalisierung von Bedingungen
5.2.5 Hinweis zum Programmierstil‌
5.3 Programmverzweigung‌en (bedingte Anweisung‌‌en)
5.3.1 Einseitige Verzweigung‌ (if‌)
5.3.2 Zweiseitige Verzweigung (if-else‌)
5.3.3 Mehrfache Fallunterscheidung‌ (elif‌)
5.3.4 Bedingte Ausdrücke‌‌
5.4 Bedingte Wiederholung‌ (while‌)
5.4.1 Endlosschleife‌‌n
5.5 Iteration‌ über ‌eine Kollektion (for)
5.5.1 Zählschleifen – Verwendung von range()‌
5.5.2 Verschachtelte Iterationen
5.5.3 Vertiefung: Iterative Berechnung rekursiver Folge‌‌n
5.6 Abbruch einer Schleife‌‌ mit break‌
5.6.1 Abbruch eines Schleifendurchlaufs mit continue‌
5.7 Abfangen von Ausnahme‌n mit‌‌ try‌‌
5.7.1 try...except‌
5.8 Aufgaben
5.9 Lösungen
Kapitel 6: Funktion‌en
6.1 Aufruf von Funktion‌en
6.2 Definition von Funktionen‌
6.3 Schrittweise Verfeinerung‌
6.4 Ausführung von Funktio‌nen
6.4.1 Global‌‌e und lokale Name‌‌n
6.4.2 Seiteneffekt‌e – die global‌-Anweisung‌
6.4.3 Parameterübergabe‌
6.5 Voreingestellte Parameterwerte‌‌
6.5.1 Schlüsselwort-Argument‌e
6.6 Funktion‌en mit beliebiger Anzahl von Parametern‌
6.7 Lokale Funktion‌en
6.8 Rekursive Funktion‌‌en
6.9 Experimente zur Rekursion mit der Turtle-Grafi‌k
6.9.1 Turtle-Befehle im interaktiven Modus
6.9.2 Eine rekursive Spirale
6.9.3 Baumstrukturen
6.9.4 Künstlicher Blumenkohl – selbstähnlich‌e Bilder
6.10 Rekursive Zahlenfunktionen
6.11 Hintergrund: Wie werden rekursive Funktionen ausgeführt?
6.11.1 Execution Frames
6.11.2 Rekursionstiefe‌
6.12 Funktion‌en als Objekte
6.12.1 Hintergrund: Typen sind keine Funktionen
6.13 Lambda-Formen‌
6.14 Funktionsannotationen: Typen zuordnen
6.15 Hinweise zum Programmierstil‌
6.15.1 Allgemeines
6.15.2 Funktionsnamen
6.15.3 Kommentierte Parameter
6.15.4 Docstrin‌gs
6.16 Aufgaben
6.17 Lösungen
Kapitel 7: Sequenzen, Mengen und Generatoren
7.1 Gemeinsame Operationen für Sequen‌zen
7.1.1 Zugriff auf Elemente einer Sequenz
7.1.2 Slicing‌‌ von Sequenzen
7.1.3 Auspacken (unpacking)
7.2 Vertiefung: Rekursive Funktionen für Sequenzen
7.2.1 Rekursives Summieren
7.2.2 Rekursive Suche
7.3 Tupel‌
7.4 Liste‌n
7.4.1 Eine List‌e erzeugen
7.4.2 Eine Liste‌ verändern
7.4.3 Flache und tiefe Kopie‌‌n
7.4.4 Liste‌n sortieren‌
7.4.5 Binäre Suche‌‌ in einer sortierten Liste
7.4.6 Zwei Sortierverfahren‌ im Vergleich
7.4.7 Modellieren mit Liste‌n – Beispiel: die Charts‌
7.5 Generator‌en
7.5.1 Generator‌ausdrücke
7.5.2 Generatorfunktion‌en
7.5.3 Iterator‌en
7.5.4 Verwendung von Generatoren
7.6 Mengen
7.6.1 Operationen für Mengen
7.6.2 Modellieren mit Mengen – Beispiel: Graphen
7.7 Aufgaben
7.8 Lösungen
Kapitel 8: Dictionaries
8.1 Operationen für Dictionaries
8.2 Wie erstellt man ein Dictionary?
8.2.1 Definition mit einem Dictionary‌-Display
8.2.2 Schrittweiser Aufbau eines Dictionary‌s
8.2.3 Ein Dictionary aus anderen Dictionaries zusammensetzen – update()‌
8.3 Zugriff auf Daten in einem Dictionary‌
8.3.1 Vergebliche Zugriffsversuche
8.4 Praxisbeispiel: Vokabeltrainer‌
8.5 Typische Fehler‌
8.6 Aufgaben
8.7 Lösungen
Kapitel 9: Ein- und Ausgabe‌‌
9.1 Streams‌
9.1.1 Die Rolle der Streams bei E/A-Operationen
9.1.2 Was ist ein Stream?
9.1.3 Eine Datei öffnen
9.1.4 Speichern einer Zeichenkette
9.1.5 Laden einer Zeichenkette aus einer Datei
9.1.6 Absolute und relative Pfad‌‌e
9.1.7 Zwischenspeichern, ohne zu schließen
9.1.8 Zugriff auf Stream‌s (lesen und schreiben)
9.2 Mehr Zuverlässigkeit durch try- und with-Anweisungen
9.2.1 try...finally‌
9.2.2 ‌with-Anweisungen
9.3 Objekt‌e speichern‌ mit pickle‌
9.3.1 Funktionen zum Speichern und Laden
9.4 Die Streams‌ sys.stdin und sys.stdout‌
9.5 Ausgabe von Werten mit der print()-Funktion
9.5.1 Anwendung: Ausgabe von Tabelle‌n‌
9.6 Kommandozeilen-Argument‌e (Option‌en)
9.6.1 Zugriff auf Optionen
9.6.2 Beispiel
9.6.3 Skripte mit Optionen testen
9.7 Aufgaben
9.8 Lösungen
Kapitel 10: Definition eigener Klasse‌n
10.1 Klassen und Objekte‌
10.2 Definition von Klassen‌‌
10.3 Objekte‌ (Instanzen‌)
10.4 Zugriff auf Attribute‌ – Sichtbarkeit‌
10.4.1 Öffentliche Attribute‌
10.4.2 Private Attribute‌
10.4.3 Properties
10.4.4 Dynamische Erzeugung von Attributen‌
10.5 Methoden‌‌
10.5.1 Polymorphismus‌ – überladen‌ von Operatoren‌
10.5.2 Vertiefung: Objekte ausführbar machen – die Methode __call__()‌
10.5.3 Statische Methoden‌
10.6 Abstraktion‌, Verkapselung und Geheimnisprinzip
10.6.1 Abstraktion‌
10.6.2 Verkapselung‌‌
10.6.3 Geheimnisprinzip‌‌
10.7 Vererbung‌
10.7.1 Spezialisierungen
10.7.2 Beispiel: Die Klasse Konto – eine Spezialisierung‌‌ der Klasse Geld
10.7.3 Vertiefung: Standardklassen als Basisklassen
10.8 Hinweise zum Programmierstil‌‌
10.8.1 Schreibweise
10.8.2 Sichtbarkeit
10.8.3 Dokumentation von Klassen‌
10.9 Typische Fehler‌‌
10.9.1 Versehentliches Erzeugen neuer Attribute
10.9.2 Verwechseln von Methoden und Attributen
10.10 Aufgaben
10.11 Lösungen
Kapitel 11: Klassen wiederverwenden – Module‌
11.1 Testen einer Klasse‌ in einem lauffähigen Stand-alone-Skript‌
11.2 Module‌‌ speichern und importieren
11.3 Den Zugang zu einem Modul‌ sicherstellen
11.3.1 Erweitern der Verzeichnisliste sys.path‌
11.3.2 Anwendungsbeispiel: Eine interaktive Testumgebung
11.3.3 Kompilieren von Modul‌en
11.4 Programmierstil‌: Verwendung und Dokumentation von Modulen‌
Kapitel 12: Objektorientiertes Modellieren‌‌
12.1 Phasen einer objektorientierten Software-Entwicklung‌
12.1.1 Objektorientierte Analyse‌ (OOA)‌
12.1.2 Objektorientierter Entwurf‌ (OOD‌)
12.1.3 Objektorientierte Programmierung (OOP‌)
12.2 Beispiel: Modell eines Wörterbuchs‌
12.2.1 OOA: Entwicklung einer Klassenstruktur‌
12.2.2 OOD: Entwurf einer Klassenstruktur zur Implementierung in Python
12.2.3 OOP: Implementierung der Klassenstruktur
12.3 Assoziation‌en zwischen Klassen
12.3.1 Reflexive Assoziation‌en
12.3.2 Aggregation‌
12.4 Beispiel: Management eines Musical‌s
12.4.1 OOA
12.4.2 OOD
12.4.3 OOP
12.5 Aufgaben
12.6 Lösungen
Kapitel 13: Textverarbeitung‌
13.1 Standardmethoden zur Verarbeitung von Zeichenketten
13.1.1 Formatieren‌
13.1.2 Schreibweise
13.1.3 Tests
13.1.4 Entfernen und Aufspalten
13.1.5 Suchen und Ersetzen
13.2 Codierung und Decodierung
13.2.1 Platonische Zeichen und Unicode
13.2.2 Vertiefung: Zeichenketten durch Bytefolgen darstellen
13.3 Automatische Textproduktion
13.3.1 Texte mit variablen Teilen – Anwendung der String-Methode format()‌‌
13.3.2 Vertiefung: Eine Tabelle erstellen
13.3.3 Mahnbriefe
13.3.4 Textuelle Repräsentation‌ eines Objekts
13.3.5 F-Strings
13.4 Analyse‌ von Texten
13.4.1 Chat-Bots
13.4.2 Textanalyse‌ mit einfachen Vorkommenstest‌‌s
13.5 Reguläre Ausdrücke‌‌
13.5.1 Die Funktion findall() aus dem Modul re
13.5.2 Aufbau eines regulären Ausdrucks
13.5.3 Objekte ‌für reguläre Ausdrücke
13.5.4 Strings untersuchen mit search()‌
13.5.5 Textpassagen extrahieren mit findall()‌
13.5.6 Zeichenketten zerlegen‌ mit split()‌
13.5.7 Teilstrings ersetzen mit sub()‌
13.5.8 Match-Objekte‌‌
13.6 Den Computer zum Sprechen bringen – Sprachsynthese‌
13.6.1 Buchstabieren
13.6.2 Den Klang der Stimme verändern
13.7 Aufgaben
13.8 Lösungen
Kapitel 14: Systemfunktionen‌
14.1 Das Modul sys‌ – die Schnittstelle zum Laufzeitsystem‌
14.1.1 Informationen über die aktuelle Systemumgebung‌
14.1.2 Standardeingabe‌ und -ausgabe‌
14.1.3 Die Objektverwaltung beobachten mit getrefcount()‌
14.1.4 Ausführung eines Skripts‌ beenden
14.2 Das Modul os‌ – die Schnittstelle zum Betriebssystem‌
14.2.1 Dateien‌ und Verzeichnisse‌ suchen
14.2.2 Hintergrund: Zugriffsrechte‌ abfragen und ändern (Windows und Unix)
14.2.3 Dateien‌ und Verzeichnisse‌ anlegen und modifizieren
14.2.4 Merkmale von Dateien‌ und Verzeichnissen‌ abfragen
14.2.5 Pfade verarbeiten
14.2.6 Hintergrund: Umgebungsvariablen‌
14.2.7 Systematisches Durchlaufen eines Verzeichnisbaumes‌
14.3 Datum‌ und Zeit‌
14.3.1 Funktionen des Moduls time
14.3.2 Sekundenformat‌
14.3.3 Zeit-Tupel‌
14.3.4 Zeitstring‌s
14.3.5 Einen Prozess‌ unterbrechen mit sleep()
14.4 Zeitberechnungen mit dem Modul datetime‌
14.4.1 Die Klasse datetime
14.4.2 Die Zeitzone
14.4.3 Die Klasse timedelta‌
14.5 Aufgaben
14.6 Lösungen
Kapitel 15: Grafische Benutzungsoberfläche‌n mit tkinter
15.1 Ein einführendes Beispiel
15.2 Einfache Widget‌‌s
15.3 Die Master-Slave-Hierarchie‌‌
15.4 Optionen der Widget‌s
15.4.1 Optionen bei der Instanziierung setzen
15.4.2 Widget‌-Optionen nachträglich konfigurieren
15.4.3 Font‌‌s
15.4.4 Farbe‌‌n
15.4.5 Rahmen‌‌
15.4.6 Die Größe eines Widget‌s
15.4.7 Leerraum‌‌ um Text
15.5 Gemeinsame Methoden der Widget‌‌s
15.6 Die Klasse Tk‌
15.7 Die Klasse Button‌‌
15.8 Die Klasse Label‌
15.8.1 Dynamische Konfiguration der Beschriftung
15.8.2 Verwendung von Kontrollvariabl‌en
15.9 Die Klasse Entry‌
15.10 Die Klasse Radiobutton‌‌
15.11 Die Klasse Checkbutton‌‌‌
15.12 Die Klasse Scale‌
15.13 Die Klasse Frame‌
15.14 Aufgaben
15.15 Lösungen
Kapitel 16: Layout‌‌
16.1 Der Packer‌
16.2 Layout-Fehler‌
16.3 Raster-Layout‌
16.4 Vorgehensweise bei der GUI‌-Entwicklung
16.4.1 Die Benutzungsoberfläche‌ gestalten
16.4.2 Funktionalität hinzufügen
16.5 Aufgaben
16.6 Lösungen
Kapitel 17: Grafi‌k
17.1 Die tkinter‌-Klasse Canvas‌
17.1.1 Generierung grafischer Elemente – ID, Positionierung und Display-Liste
17.1.2 Grafische Elemente gestalten
17.1.3 Visualisieren mit Kreisdiagramm‌en
17.2 Die Klasse PhotoImage‌
17.2.1 Eine Pixelgrafik‌ erzeugen
17.2.2 Foto‌s analysieren und verändern
17.3 Bilder in eine Benutzungsoberfläche einbinden
17.3.1 Icon‌s auf Schaltflächen
17.3.2 Hintergrundbild‌er
17.3.3 Hintergrund: Das PPM‌-Format
17.4 Die Python Imaging Library (PIL)
17.4.1 Installation eines Moduls mit pip
17.4.2 Mit PIL beliebige Bilddateien einbinden
17.4.3 Steganografie‌ – Informationen in Bildern verstecken
17.5 Aufgaben
17.6 Lösungen
Kapitel 18: Event-Verarbeitung
18.1 Einführendes Beispiel
18.2 Event-Sequenzen‌
18.2.1 Event-Typen
18.2.2 Qualifizierer‌ für Maus- und Tastatur-Events
18.2.3 Modifizierer
18.3 Beispiel: Tastaturereignisse verarbeiten
18.4 Programmierung eines Eventhandler‌s
18.4.1 Beispiel für eine Event-Auswertung
18.5 Bindemethoden‌‌
18.6 Aufgaben
18.7 Lösungen
Kapitel 19: Komplexe Benutzungsoberflächen
19.1 Text‌-Widget‌s
19.1.1 Methoden der Text‌-Widgets
19.2 Rollbalken‌ (Scrollbar‌s)
19.3 Menü‌s
19.3.1 Die Klasse Menu‌
19.3.2 Methoden der Klasse Menu‌
19.4 Texteditor‌ mit Menüleiste und Pulldown-Menü
19.5 Dialogbox‌en
19.6 Applikationen mit mehreren Fenster‌‌n
19.7 Aufgaben
19.8 Lösungen
Kapitel 20: Thread‌s
20.1 Funktionen in einem Thread ausführen‌
20.2 Thread-Objekte erzeugen – die Klasse Thread
20.3 Aufgaben
20.4 Lösungen
Kapitel 21: Fehler‌ finden und vermeiden
21.1 Testen von Bedingungen
21.1.1 Ausnahme‌n (Exception‌s)
21.1.2 Testen von Vor- und Nachbedingung‌‌en mit assert‌
21.1.3 Vertiefung: Programmabstürze ohne Fehlermeldung
21.2 Debugging-Modus‌‌ und optimierter Modus‌‌
21.3 Ausnahmen gezielt auslösen
21.4 Selbstdokumentation‌
21.5 Dokumentation eines Programmlaufs mit Log-Datei‌en
21.5.1 Grundfunktionen
21.5.2 Beispiel: Logging in der GUI-Programmierung
21.6 Vertiefung: Professionelles Arbeiten mit Logging
21.6.1 Logging-Level‌s
21.6.2 Logger-Objekt‌e
21.6.3 Das Format der Logging-Meldungen konfigurieren
21.7 Debugging
21.7.1 Schaltflächen des Debug-Control-Fensters
21.7.2 ‌Breakpoints
Kapitel 22: Dynamische Webseiten – CGI und WSGI
22.1 Wie funktionieren dynamische Webseiten?
22.2 Wie spät ist es? Aufbau eines CGI-Skript‌s
22.2.1 Die Ausgabe eines CGI-Skripts
22.2.2 Wie ist ein CGI-Skript aufgebaut?
22.2.3 Verwendung von Schablonen
22.2.4 Aufruf mit dem Webbrowser
22.2.5 Ein einfacher HTTP-Server ‌
22.3 Kommunikation über interaktive Webseite‌n‌‌
22.3.1 Aufbau eines HTML‌-Formular‌s
22.3.2 Eingabekomponenten in einem HTML-Formular
22.4 Verarbeitung von Eingabedaten mit FieldStorage‌
22.5 Sonderzeichen handhaben
22.6 CGI-Skript‌e debuggen
22.7 Der Apache-Webserver‌
22.7.1 Den Apache-Server installieren
22.7.2 CGI-Skript‌e auf dem Apache-Server
22.8 Dynamische Webseiten mit WSGI‌
22.8.1 Einfacher geht’s nicht: Ein Stand-alone-WSGI-Webserver mit wsgiref
22.9 mod_wsgi‌
22.9.1 Installation
22.9.2 Vorbereitung
22.9.3 Den Apache-Server konfigurieren
22.9.4 Ein WSGI-Skript für den Apache-Server
22.9.5 Tipps zum Debuggen
22.9.6 Zugriff von einem entfernten Rechner im WLAN
22.10 Verarbeitung von Eingabedaten aus Formularen
22.11 Objektorientierte WSGI-Skripte – Beispiel: ein Chatroom‌
22.11.1 Die HTML-Seiten
22.11.2 Die Klassen für den Chatroom
22.11.3 Skript (Teil 2):
22.12 WSGI-Skripte mit Cookies
22.12.1 Besuche zählen
Kapitel 23: Internet-Programmierung‌
23.1 Was ist ein Protokoll‌?
23.2 Übertragung von Dateien mit FTP‌
23.2.1 Das Modul ftplib‌
23.2.2 Navigieren‌ und Download‌en
23.2.3 Ein Suchroboter‌ für FTP-Server‌
23.3 Zugriff auf Webseiten mit HTTP und HTTPS‌
23.3.1 Automatische Auswertung von Webseiten
23.4 Zugriff auf Ressourcen im Internet über deren URL
23.4.1 Webseite herunterladen und verarbeiten
23.4.2 Projekt: Wie warm wird es heute?
23.4.3 Datei herunterladen und speichern
23.4.4 Projekt: Filme herunterladen
23.5 E-Mail‌s senden mit SMTP‌
23.6 Aufgaben
23.7 Lösungen
Kapitel 24: Datenbanken‌
24.1 Was ist ein Datenbanksystem‌?
24.2 Entity-Relationship-Diagramm‌e (ER-Diagramm‌e)
24.3 Relationale Datenbank‌‌en
24.4 Darstellung von Relationen als Mengen oder Dictionari‌es
24.5 Das Modul sqlite3‌‌
24.5.1 Beispiel: Telefonbuch
24.5.2 Eine Tabelle anlegen
24.5.3 Anfragen an eine Datenbank
24.5.4 Datensuche im interaktiven Modus
24.5.5 SQL-Anweisungen mit variablen Teilen
24.5.6 Vertiefung: SQL-Injection‌
24.6 Online-Redaktionssystem‌ mit Datenbankanbindung
24.6.1 Objektorientierte Analyse‌‌ (OOA)
24.6.2 Objektorientierter Entwurf des Systems (OOD)
24.6.3 Hintergrund: Authentifizieren‌ mit SHA-256
24.6.4 Implementierung des Redaktionssystems mit Python (OOP)
24.7 Aufgaben
24.8 Lösungen
Kapitel 25: Testen‌ und Tuning
25.1 Automatisiertes Testen
25.2 Testen mit Docstring‌s – das Modul doctest‌
25.3 Praxisbeispiel: Suche nach dem Wort des Jahre‌s
25.4 Klassen testen mit doctest‌
25.4.1 Wie testet man eine Klasse?
25.4.2 Normalisierte Whitespaces – doctest-Direktiven
25.4.3 Ellipse‌n verwenden
25.4.4 Dictionaries testen
25.5 Gestaltung von Testreihe‌n mit unittest‌
25.5.1 Einführendes Beispiel mit einem Testfall
25.5.2 Klassen des Moduls unittest
25.5.3 Weiterführendes Beispiel
25.6 Tunin‌g
25.6.1 Performance-Analyse‌ mit dem Profiler‌
25.6.2 Praxisbeispiel: Auswertung astronomischer Fotografien
25.6.3 Performance-Analyse‌ und Tuning‌
25.7 Aufgaben
25.8 Lösungen
Kapitel 26: XML und JSON‌
26.1 Was ist XML?
26.2 XML-Dokumente
26.3 Ein XML-Dokument als Baum‌
26.4 DOM‌
26.5 Das Modul xml.dom.minidom‌
26.5.1 XML-Dokumente und DOM-Objekte
26.5.2 Die Basisklasse Node‌
26.5.3 Die Klassen Document‌, Element‌ und Text‌
26.6 Attribut‌e von XML-Elementen
26.7 Anwendungsbeispiel 1: Eine XML-basierte Klasse
26.8 Anwendungsbeispiel 2: Datenkommunikation‌‌ mit XML
26.8.1 Überblick
26.8.2 Das Client-Programm
26.8.3 Das Server-Programm
26.9 JSON
26.9.1 JSON-Texte decodieren
26.9.2 Decodierungsfehler
26.9.3 Ein Dictionary als JSON-Objekt speichern: Kompakt oder gut lesbar?
26.9.4 Projekt: Verarbeitung von Wetterdaten
26.10 Aufgaben
26.11 Lösungen
Kapitel 27: Modellieren mit Kellern, Schlangen und Graphen
27.1 Stack‌ (Keller‌, Stapel‌)
27.2 Queu‌e (Schlan‌ge)
27.3 Graph‌en
27.4 Aufgaben
27.5 Lösungen
Kapitel 28: Benutzungsoberflächen mit Q‌t
28.1 Was bietet PyQt5?‌
28.2 PyQt5 erkunden
28.3 Wie arbeitet PyQt? Applikation und Fenster
28.4 Eine objektorientierte Anwendung mit PyQt5
28.5 Ein Webbrowse‌r
28.6 Interaktive Widgets‌
28.7 Labe‌l – Ausgabe von Text und Bild
28.8 Signal‌e
28.9 Checkbox‌en und Radiobutton‌s
28.10 Auswahlliste (ComboBox‌)
28.11 Gemeinsame Operationen der Widgets
28.12 Spezielle Methoden eines Fenster‌s
28.13 Event‌s
28.14 Font‌s
28.15 Styleshee‌ts
28.16 Icons
28.17 Messagebox‌en
28.18 Timer
28.19 Das Qt-Layout‌ unter der Lupe
28.19.1 Absolute Positionierung und Größe
28.19.2 Raster-Layout
28.19.3 Form-Layout‌
28.20 Browser für jeden Zweck
28.20.1 Die Klasse QWebEngineView
28.21 Ein Webbrowser mit Filter
28.22 Surfen mit Geschichte – der Verlauf einer Sitzung
28.23 Aufgaben
28.24 Lösungen
Kapitel 29: Multimediaanwendungen mit Qt
29.1 Kalender‌ und Textfeld – ein digitales Tagebuch
29.1.1 Programmierung
29.2 Kamerabild‌er
29.3 Dialog‌e
29.3.1 Projekt: Ansichtskart‌e
29.4 Videoplaye‌r
29.4.1 Ein einfacher Videoplayer
29.4.2 Videoplayer mit Playlist‌
29.4.3 Regeln zur Änderung der Größe (Size Policy‌)
29.4.4 Das Dashboard bei Mausbewegungen einblenden
29.5 Aufgaben
29.6 Lösungen
Kapitel 30: Rechnen mit Num‌Py
30.1 NumPy installieren
30.2 Arrays erzeugen
30.2.1 Arrays
30.2.2 Matrizen und Vektoren
30.2.3 Zahlenfolgen
30.2.4 Zufallsarrays
30.2.5 Spezielle Arrays
30.3 Indizieren
30.4 Slicing
30.5 Arrays verändern‌
30.6 Arithmetische Operationen
30.7 Funktionen, die elementweise ausgeführt werden
30.8 Einfache Visualisierung
30.9 Matrizenmultiplikation ‌mit dot()
30.10 Array-Funktionen und Achsen
30.11 Projekt: Diffusion
30.12 Vergleiche
30.13 Projekt: Wolken am Himmel
30.14 Projekt: Wie versteckt man ein Buch in einem Bild?
30.15 Datenanalyse mit Histogrammen
30.16 Wie funktioniert ein Medianfilter?
30.17 Rechnen mit SciPy
30.17.1 Lineare Gleichungssysteme lösen
30.17.2 Integration
30.18 Aufgaben
30.19 Lösungen
Kapitel 31: Messdaten verarbeiten
31.1 Messwerte in einem Diagramm darstellen – Matplotlib und tkinter
31.1.1 Basisprojekt
31.1.2 Erweiterung: Den letzten Wert löschen
31.1.3 Das Aussehen eines Diagramms gestalten
31.2 Messwerte aus einem Multimeter lesen und darstellen
31.2.1 Vorbereitung
31.2.2 Werte auslesen
31.2.3 Welche Ziffern zeigt das Display des Multimeters?
31.3 Anzeige der Temperatur
31.4 Messreihen aufzeichnen
31.5 Aufgabe
31.6 Lösung
Kapitel 32: Parallele Datenverarbeitun‌‌g
32.1 Was sind parallele Programme?
32.2 Prozesse starten und abbrechen
32.3 Funktionen in eigenen Prozessen starten
32.4 Prozesse zusammenführen – join()
32.5 Wie können Prozesse Objekte austauschen?
32.5.1 Objekte als Argumente übergeben
32.5.2 Objekte über eine Pipe senden und empfangen
32.5.3 Objekte über eine Queue austauschen
32.6 Daten im Pool bearbeiten
32.6.1 Mit dem Pool geht’s schneller – ein Zeitexperiment
32.6.2 Forschen mit Big Data aus dem Internet
32.7 Synchronisation‌
32.8 Produzenten und Konsumenten
32.8.1 Sprücheklopfer
32.9 Aufgaben
32.10 Lösungen
Kapitel 33: Django‌
33.1 Django aus der Vogelperspektive
33.2 Ein Projekt anlegen
33.2.1 Den Server starten‌
33.2.2 Eine neue Applikation anlegen
33.2.3 Startseite und View einrichten
33.3 Datenbankanbindung‌
33.4 Modelle erstellen‌
33.5 Modelle aktivieren‌
33.6 In der Python-Shell die Datenbank bearbeiten
33.6.1 Objekte durch Aufruf der Klasse erzeugen
33.6.2 Auf Attribute eines Objekts zugreifen
33.6.3 Objekte finden
33.6.4 Objekte erzeugen und Beziehungen herstellen
33.6.5 Den Beziehungsmanager nutzen
33.6.6 Objekte löschen
33.7 Django-Modelle unter der Lupe‌
33.7.1 Grenzwerte
33.7.2 Leere Felder
33.7.3 Voreingestellte Werte
33.7.4 Einmaligkeit
33.7.5 Auswahlmöglichkeiten
33.8 Der Manager unter der Lupe – Objekte erzeugen und suchen
33.8.1 Objekte erzeugen
33.8.2 Objekte finden
33.8.3 Mehrere Bedingungen
33.8.4 Suchen über Beziehungen
33.8.5 Weitere Suchmethoden
33.9 Administration‌
33.9.1 Eine Applikation der Website-Verwaltung zugänglich machen
33.10 Views einrichten – die Grundstruktur
33.10.1 Was sind View‌s?
33.10.2 Funktionen für Views
33.10.3 URL-Pattern‌s
33.11 View-Funktionen erweitern
33.11.1 Startseite
33.11.2 Auflistung der Ideen zu einer Frage – question_index
33.11.3 Die Templates verbessern: Namen statt expliziter URLs
33.12 Interaktive Webseiten – Views mit Formularen
33.12.1 Eingabe einer neuen Frage
33.12.2 Eingabe einer neuen Idee
33.12.3 View-Funktion für das Speichern einer neuen Idee
33.12.4 Fertig!
33.13 Die nächsten Schritte
33.14 Aufgabe
33.15 Lösung
Anhang A: Anhang
A.1 Codierung von Sonderzeichen in HTML
A.2 Quellen im WWW
A.3 Standardfunktionen und Standardklassen
A.4 Mathematische Funktionen
A.4.1 Das Modul math
A.4.2 Das Modul random
A.5 EBNF-Grammatik‌‌
Anhang B: Glossar
Anhang C: Download der Programmbeispiele
Anhang D: Ein Python-Modul veröffentlichen: PyPI
D.1 Bei PyPI und TestPyPI registrieren
D.2 Ein Paket für die Veröffentlichung vorbereiten
D.2.1 Die Programmdatei setup.py‌
D.2.2 Die Lizenz
D.2.3 Die Datei README.txt
D.2.4 Die Datei __init__.py
D.3 Das Paket auf PyPI veröffentlichen
D.3.1 Das Paket aktualisieren

Michael Weigend

Python 3

Lernen und professionell anwenden

Das umfassende Praxisbuch

Impressum

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.

ISBN 978-3-7475-0546-5 9. Auflage 2022

www.mitp.de E-Mail: [email protected] Telefon: +49 7953 / 7189 - 079 Telefax: +49 7953 / 7189 - 082

© 2022 mitp Verlags GmbH & Co. KG

Dieses Werk, einschließlich aller seiner Teile, ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Dies gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen.

Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt 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.

Lektorat: Sabine Schulz, Janina Bahlmann Sprachkorrektorat: Petra Heubach-Erdmann Covergestaltung: Christian Kalkert Coverbild: © Marc AZEMA / stock.adobe.comelectronic publication: III-satz, Kiel, www.drei-satz.de

Dieses E-Book verwendet das ePub-Format und ist optimiert für die Nutzung mit dem iBooks-reader auf dem iPad von Apple. Bei der Verwendung anderer Reader kann es zu Darstellungsproblemen kommen.

Der Verlag räumt Ihnen mit dem Kauf des E-Books das Recht ein, die Inhalte im Rahmen des geltenden Urheberrechts zu nutzen. Dieses Werk, einschließlich aller seiner Teile, ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Dies gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und Einspeicherung und Verarbeitung in elektronischen Systemen.

Der Verlag schützt seine E-Books vor Missbrauch des Urheberrechts durch ein digitales Rechtemanagement. Bei Kauf im Webshop des Verlages werden die E-Books mit einem nicht sichtbaren digitalen Wasserzeichen individuell pro Nutzer signiert.

Bei Kauf in anderen E-Book-Webshops erfolgt die Signatur durch die Shopbetreiber. Angaben zu diesem DRM finden Sie auf den Seiten der jeweiligen Anbieter.

Einleitung

Warum Python?

Es gibt triftige Argumente für die Verwendung der Programmiersprache Python.

Python ist einfach. Man könnte auch sagen minimalistisch. Auf Sprachelemente, die nicht unbedingt notwendig sind, wurde verzichtet. Mit Python kann man kurze Programme schreiben, die viel leisten.

Python besitzt einen interaktiven Modus. Sie können einzelne Befehle direkt eingeben und ihre Wirkung beobachten. Python unterstützt das Experimentieren und Ausprobieren. Das erleichtert das Erlernen neuer Programmierkonzepte und hilft vor allem Anfängern bei den ersten »Gehversuchen«.

Dennoch ist Python ist kein Spielzeug. Zusammen mit vielen Zusatzkomponenten, sogenannten Modulen, ist es eine sehr mächtige Programmiersprache.

Python ist nichtkommerziell. Alle Software, die Sie benötigen, ist kostenlos und für jede Plattform verfügbar.

Hinter Python steht eine wachsende internationale Community aus Wissenschaftlern und Praktikern, die die Sprache pflegen und weiterentwickeln.

Python 3

Im Jahre 2008 fand in der Python-Welt eine kleine Revolution statt. Python 3 wurde veröffentlicht. Eine neue Version, die mit den Vorgängerversionen 2.X nicht mehr kompatibel ist. Ein Programm, das z.B. in Python 2.5 geschrieben worden ist, läuft (in der Regel) nicht mehr mit einem Python-3-Interpreter. Das ist natürlich schade, war aber notwendig, weil es einige sehr tief gehende Änderungen gab. Doch das neue Python 3 ist noch konsistenter und führt zu schönerem Programmtext als die früheren Versionen.

An wen wendet sich dieses Buch?

Dieses Buch ist für jeden, der die Programmierung mit Python lernen möchte. Besondere Vorkenntnisse werden nicht erwartet. Für die hinteren Kapitel ist es allerdings hilfreich, wenn man sich mit HTML auskennt. Das Buch wendet sich sowohl an Anfänger als auch an Leserinnen und Leser, die bereits mit einer höheren Programmiersprache vertraut sind, und ihr Wissen erweitern und vertiefen wollen. Für Neulinge gibt es zahlreiche Passagen, in denen grundlegende Konzepte anschaulich erklärt werden. Insbesondere das erste Kapitel ist zum überwiegenden Teil eine allgemeine Einführung für diejenigen, die sich bisher noch nie ausführlicher mit der Computertechnik beschäftigt haben. Wenn Sie sich eher zu den Fortgeschrittenen zählen, dürfen Sie getrost diese Textabschnitte überspringen und sich dem zuwenden, das Sie interessiert.

Auf der anderen Seite enthält das Buch auch Stellen, die eine Herausforderung darstellen. Einige Abschnitte tragen Überschriften, die mit Hintergrund: oder Vertiefung: beginnen. Sie enthalten Ausblicke und Hintergrundinformationen oder gehen vertiefend auf speziellere Aspekte der jeweiligen Thematik ein, die nicht jeden interessieren.

Generell ist der Theorieanteil dieses Buches gering. Die praktische Arbeit steht im Vordergrund. In der Regel ist es möglich, theoretische Passagen (wie die über formale Grammatiken) zu überspringen, wenn man nun gar nicht damit zurechtkommt. Alle wichtigen Dinge werden zusätzlich auch auf anschauliche Weise erklärt. Und Sie werden erleben, dass beim Nachvollziehen und praktischen Ausprobieren der Programmbeispiele auch zunächst schwierig erscheinende Konzepte verständlich werden. Lassen Sie sich also nicht abschrecken.

Inhalt und Aufbau

Im Zentrum steht die Kunst der Programmentwicklung nach dem objektorientierten Paradigma. Dabei machen wir einen Rundgang durch verschiedene Gebiete der Informatik. Wir werfen einen Blick hinter die Kulissen von Software-Systemen, die Sie als Anwender aus dem Alltag kennen. Wie gestaltet man eine grafische Benutzungsoberfläche? Wie funktioniert E-Mail? Wie programmiert man einen Chatroom? Darüber hinaus werden eine Reihe fundamentaler Ideen der Informatik angesprochen. Das Buch orientiert sich an den üblichen Curricula von Universitätskursen zur Einführung in die Programmierung. In vielen Fällen dürfte es deshalb eine sinnvolle Ergänzung zu einem Vorlesungsskript sein.

Dieses Buch ist so angelegt, dass man es von vorne nach hinten lesen kann. Wir fangen mit einfachen Dingen an und nachfolgende Kapitel knüpfen an den vorhergehenden Inhalt an. Idealerweise sollte jeder Begriff bei seiner ersten Verwendung erklärt werden. Doch lässt sich dieses Prinzip nur schwer in Perfektion umsetzen. Manchmal gehen wir von einem intuitiven Vorverständnis aus und erläutern die Begrifflichkeit erst kurz darauf ausführlich.

Im vorderen Teil des Buches finden Sie an verschiedenen Stellen Hinweise zum Programmierstil und zu typischen Fehlern. Am Ende jedes Kapitels gibt es Übungsaufgaben, die in der Regel nach Schwierigkeitsgrad sortiert sind. Einige Programmieraufgaben sind so komplex, dass man sie (insbesondere als Anfänger) eigentlich gar nicht eigenständig lösen kann. Sie sind dann eher als Erweiterung gedacht und es wurde ins Kalkül gezogen, dass Sie »mogeln« und während der Bearbeitung in die Lösung gucken.

Unterkapitel, deren Überschriften mit dem Wort »Vertiefung« beginnen, wenden sich an besonders interessierte Leser und können in der Regel übersprungen werden.

Der vordere Teil des Buches befasst sich mit den grundlegenden Konzepten der Programmierung mit Python. Herausgestellt werden die syntaktischen Besonderheiten gegenüber anderen Programmiersprachen. Sie finden an verschiedenen Stellen Hinweise zum Programmierstil und zu typischen Fehlern. Angesprochen werden unter anderem folgende Punkte:

Aufbau von Anweisungen in einem Python Programm

Umgang mit der Standard-Entwicklungsumgebung IDLE

Standard-Datentypen

Modellieren mit Datenstrukturen: Tupel, Listen, Dictionaries, Mengen

Kontrollstrukturen: Wiederholungen, Verzweigungen, Abfangen von Ausnahmen (try ... except)

Funktionen: Arten von Parametern, Voreinstellungen, Lambda-Ausdrücke, Rekursion, Docstrings

Ein- und Ausgabe: Dateien, pickle

Konzepte der Objektorientierung: Klassen, Objekte, Vererbung, statische Methoden, Polymorphie, Properties

Techniken der objektorientierten Modellierung: Analyse (OOA) und Design (OOD), UML, Objekt- und Klassendiagramme, Assoziationen

Modularisieren

Verarbeitung von Zeichenketten: String-Methoden, Codierung und Decodierung, Formatierung, reguläre Ausdrücke, Sprachsynthese, Chat-Bots

Systemfunktionen: Schnittstelle zum Betriebssystem, Datum und Zeit

Grundprinzipien der Gestaltung von grafischen Benutzungsoberflächen mit tkinter: Widgets, Event-Verarbeitung, Layout, Threads

Debugging-Techniken

Im hinteren Teil des Buches werden die Kapitel immer spezieller. Hier kommen dann gelegentlich auch Module von Drittanbietern ins Spiel, die nicht zur Standardinstallation von Python gehören (z.B. PIL, PyQt, NumPy). Sie müssen erst heruntergeladen und installiert werden. Zu diesen spezielleren Themen gehören:

Internet-Programmierung: CGI-Skripte, WSGI, Webserver, E-Mail-Clients

Datenbanken und XML

Testen und Performance-Analyse: doctest, unittest

Benutzungsoberflächen für Multimedia-Anwendungen mit PyQt: Video-Player, Webbrowser, Kalender

Wissenschaftliches Rechnen mit NumPy und SciPy: Arrays, Vektoren und Matrizen, digitale Bildbearbeitung, Datenvisualisierung, lineare Gleichungssysteme, Integralrechnung

Parallele Datenverarbeitung: Prozesse und Synchronisation, Queues, Pipes, Pools

Messdaten eines externen digitalen Multimeters erfassen und verarbeiten

Webentwicklung mit Django.

Programmbeispiele

Das Buch enthält zahlreiche Programmbeispiele, die zum Ausprobieren, Nachmachen und Weiterentwickeln ermuntern sollen. Sie können alle Skripte und einige zusätzliche Dateien als ZIP-Archiv von der Website des mitp-Verlages herunterladen. Der URL ist:

http://www.mitp.de/0544

Klicken Sie im Kasten Downloads auf den Link Programmbeispiele.

Außerdem sind die Programmbeispiele in einem GitHub-Repository veröffentlicht. URL:

https://github.com/mweigend/python3/

Weitere Hinweise zum Download finden Sie im Anhang C.

Beim Design der Beispiele wurde darauf geachtet, dass sie möglichst kurz und übersichtlich sind. Häufig sind die Skripte Spielzeugversionen richtiger Software, die man im Alltag zu sinnvollen Dingen nutzen kann. Sie sind Modelle – etwa so wie Häuser aus Legosteinen Modelle richtiger Häuser sind. Sie sind auf das Wesentliche reduziert und sollen nur bestimmte Aspekte verdeutlichen. Sie genügen deshalb nicht den Qualitätsanforderungen, die man üblicherweise an professionelle Software stellt, aber sie dienen vielleicht als Anregung und Inspiration für eigene Projekte.

Kapitel 1: Grundlagen

Bitte noch etwas Geduld! Im ersten Kapitel bleibt der Computer noch ausgeschaltet. Hier wird zunächst eine anschauliche Vorstellung von einigen Grundideen der Programmierung vermittelt. Sie helfen, den Rest des Buches besser zu verstehen. Im Mittelpunkt stehen folgende Fragen:

Was sind Programme und Algorithmen?

Worin unterscheiden sich Programmierparadigmen?

Was ist die Philosophie der objektorientierten Programmierung?

1.1  Was ist Programm‌ieren?

Es ist eigentlich ganz einfach: Programmieren ist das Schreiben eines Programms. Nun gibt es den Begriff »Programm« auch in unserer Alltagssprache – fernab von jeder Computertechnik. Sie kennen Fernseh- und Kinoprogramme, planen ein Programm für Ihre Geburtstagsparty, genießen im Urlaub vielleicht Animationsprogramme (sofern Sie nichts Besseres zu tun haben) und lesen als gewissenhafter Staatsbürger vor den Bundestagswahlen Parteiprogramme. In diesen Zusammenhängen versteht man unter einem Programm eigentlich recht unterschiedliche Dinge: Ein Parteiprogramm ist so etwas wie ein strukturiertes Konzept politischer Ziele, ein Kinoprogramm ein Zeitplan für Filmvorstellungen und ein Animationsprogramm ein Ablauf von Unterhaltungsveranstaltungen.

In der Informatik‌ – der Wissenschaft, die hinter der Programmiertechnik steht – ist der Begriff Programm natürlich enger und präziser gefasst. Allerdings gibt es auch hier unterschiedliche Sichtweisen.

Die älteste und bekannteste Definition basiert auf dem Begriff Algorithmus‌. Grob gesprochen ist ein Algorithmus eine Folge von Anweisungen (oder militärisch formuliert: Befehlen), die man ausführen muss, um ein Problem zu lösen. Unter einem Programm versteht man in dieser Sichtweise einen Algorithmus,

der in einer Sprache geschrieben ist, die auch Maschinen verstehen können (Programmiersprache), und

der das Verhalten von Maschinen steuert.

Daraus folgt: Wer ein Computerprogramm schreibt, muss zumindest zwei Dinge tun:

Er oder sie muss einen Algorithmus erfinden, der in irgendeiner Weise nützlich ist und zum Beispiel bei der Lösung eines Problems helfen kann.

Der Algorithmus muss fehlerfrei in einer Programmiersprache formuliert werden. Man spricht dann von einem Programmtext.

Ziel einer Programmentwicklung ist korrekter Programmtext.

1.2  Hardware‌ und Software‌

Ein Computer ist eine universelle Maschine, deren Verhalten durch ein Programm bestimmt wird. Ein Computersystem besteht aus Hardware und Software. Ersteres ist das englische Wort für »Eisenwaren« und meint alle Komponenten des Computers, die man anfassen kann – Arbeitsspeicherbausteine, Prozessor, Peripheriespeicher (Festplatte, Diskette, CD), Monitor, Tastatur usw. Software dagegen ist ein Kunstwort, das als Pendant zu Hardware gebildet wurde. Mit Software bezeichnet man die Summe aller Programme, die die Hardware steuern.

Man kann die gesamte Software eines Computers grob in zwei Gruppen aufteilen:

Das Betriebssystem‌ regelt den Zugriff auf die Hardware des Computers und verwaltet Daten, die im Rechner gespeichert sind. Es stellt eine Umgebung bereit, in der Benutzer Programme ausführen können. Bekannte Betriebssysteme sind Unix, MS Windows oder macOS. Python-Programme laufen unter allen drei genannten Betriebssystemen. Man nennt sie deshalb portabel.

Anwendungs‌- und Systemsoftware‌ dient dazu, spezifische Probleme zu lösen. Ein Textverarbeitungsprogramm z.B. unterstützt das Erstellen, Verändern und Speichern von Textdokumenten. Anwendungssoftware ist also auf Bedürfnisse des Benutzers ausgerichtet, während das Betriebssystem nur für ein möglichst störungsfreies und effizientes Zusammenspiel der verschiedenen Komponenten des Computersystems sorgt.

Ein Computersystem wird häufig durch ein Schichtenmodell wie in Abbildung 1.1 beschrieben. Die unterste Schicht ist die Computer-Hardware, darüber liegt das Betriebssystem und zuoberst befinden sich schließlich die Anwendungs- und Systemprogramme, die eine Benutzungsschnittstelle enthalten. Nur über diese oberste Software-Schicht kommunizieren Menschen mit einem Computersystem.

Abb. 1.1: Komponenten eines Computer-Systems

Wenn Sie ein Python-Programm schreiben, entwickeln Sie vor allem Anwendungssoftware. Dabei verwenden Sie eine Systemsoftware, zum Beispiel die integrierte Entwicklungsumgebung IDLE. Ausgeführt wird das Programm mithilfe einer weiteren Systemsoftware, nämlich dem Python-Interpreter. Dieser »liest« den Python-Programmtext Zeile für Zeile und beauftragt das Betriebssystem (eine Schicht tiefer), bestimmte Dinge zu tun – etwa eine Zahl auf den Bildschirm zu schreiben.

1.3  Programm als Algorithmus

Ein Algorithmus‌ ist eine Anleitung zur Lösung einer Aufgabe. Es besteht aus einer Folge von Anweisungen, die so präzise formuliert sind, dass sie auch von einem völlig Unkundigen rein mechanisch ausgeführt werden können. Sie kennen Algorithmen aus dem Alltag:

Kochrezept

Anleitung zur Mund-zu-Mund-Beatmung in einer Erste-Hilfe-Fibel

Gebrauchsanweisung für die Benutzung einer Bohrmaschine

Abb. 1.2: Natürlichsprachlich formulierter Algorithmus zur Zubereitung eines Brathähnchens, entwickelt von Martha Pötsch aus Essen

Abbildung 1.2 zeigt einen äußerst effizienten Algorithmus zur Zubereitung eines Brathähnchens (Vorbereitungszeit: eine Minute). Wenn auch das Rezept wirklich sehr gut ist (es stammt von meiner Großmutter), so erkennt man dennoch an diesem Beispiel zwei Schwächen umgangssprachlich formulierter Alltags-Algorithmen:

Sie beschreiben die Problemlösung meist nicht wirklich vollständig, sondern setzen voraus, dass der Leser, d.h. die den Algorithmus ausführende Instanz, über ein gewisses Allgemeinwissen verfügt und in der Lage ist, »Beschreibungslücken« selbstständig zu füllen. So steht in dem Kochrezept nichts davon, dass man die Backofentür öffnen und schließen muss. Das versteht sich von selbst und wird deshalb weggelassen.

Sie enthalten ungenaue Formulierungen, die man unterschiedlich interpretieren kann. Was heißt z.B. »goldbraun«?

Auch ein Computerprogramm kann man als Algorithmus auffassen. Denn es »sagt« dem Computer, was er zu tun hat. Damit ein Algorithmus von einem Computer ausgeführt werden kann, muss er in einer Sprache formuliert sein, die der Computer »versteht« – einer Programmiersprache. Im Unterschied zu »natürlichen« Sprachen, wie Deutsch oder Englisch, die sich in einer Art evolutionärem Prozess im Laufe von Jahrhunderten entwickelt haben, sind Programmiersprachen »künstliche« Sprachen. Sie wurden von Fachleuten entwickelt und sind speziell auf die Formulierung von Algorithmen zugeschnitten.

1.5  Interpreter‌ und Compiler‌

Python ist eine höhere Programmiersprache. Es ist eine künstliche Sprache für Menschen, die Algorithmen formulieren wollen. Mit einer höheren Programmiersprache lässt sich auf bequeme Weise Programmtext notieren, der leicht durchschaubar und gut verständlich ist. Syntax und Semantik einer höheren Programmiersprache sind auf die Bedürfnisse von Menschen zugeschnitten und nicht auf die technischen Spezifika der Maschine, die das Programm ausführen soll.

Damit ein Programmtext – man spricht auch von Quelltext (source code) – vom Computer »verstanden« wird und abgearbeitet werden kann, muss er in ein ausführbares Programm übersetzt werden.

Dazu gibt es zwei unterschiedliche Methoden.

Ein Compiler übersetzt einen kompletten Programmtext und erzeugt ein direkt ausführbares (executable) Programm, das vom Betriebssystem geladen und gestartet werden kann. Bei der Übersetzung müssen natürlich die Besonderheiten des Rechners, auf dem das Programm laufen soll, berücksichtigt werden. Es gibt dann z.B. unterschiedliche Fassungen für MS-Windows- und Unix-Systeme. Programmiersprachen, bei denen kompiliert wird, sind z.B. Pascal, C, C++.

Abb. 1.3: Arbeitsweise eines Compilers

Ein Interpreter liest einen Programmtext Zeile für Zeile und führt (über das Betriebssystem) jede Anweisung direkt aus. Wenn ein Programm gestartet werden soll, muss zuerst der Interpreter aufgerufen werden. Für jedes Betriebssystem gibt es zu der Programmiersprache einen eigenen Interpreter. Wer ein Programm in einer interpretativen Sprache verwenden möchte, benötigt also zusätzlich zu dem Anwendungsprogramm noch einen Interpreter.

Python ist eine interpretative Programmiersprache. Dies hat den Vorteil, dass ein und dasselbe Programm auf allen Rechnerplattformen läuft. Als nachteilig könnte man aus Entwicklersicht empfinden, dass der Quelltext einer Software, die man verkaufen möchte, immer offen gelegt ist (open source). Damit besteht das Risiko, dass jemand illegalerweise den Programmtext leicht verändert und ihn unter seinem Namen weiterverkauft. Das geistige Eigentum des Programmentwicklers ist also schlecht geschützt. Auf der anderen Seite gibt es einen gewissen Trend, nur solche Software einzusetzen, deren Quelltext bekannt ist. Denn nur dann ist es möglich, etwaige Fehler, die erst im Lauf des Betriebes sichtbar werden, zu finden und zu beseitigen. Wer Software verwendet, deren Quelltext geheim gehalten ist, macht sich vom Software-Hersteller abhängig, und ist im Störungsfall »auf Gedeih und Verderb« auf ihn angewiesen.

Abb. 1.4: Arbeitsweise eines Interpreters

1.6  Programmierparadi‌gmen

Ein Paradigma‌ ist allgemein ein Denk- oder Handlungsmuster, an dem man sich z.B. bei der Formulierung einer Problemlösung orientiert. Wenn man ein Programm als Algorithmus betrachtet, also als System von Befehlen, folgt man dem imperativen Programmierparadigma (imperare: lat. befehlen).

Zur Abgrenzung sei kurz darauf hingewiesen, dass es auch andere Programmierparadigmen gibt. Prolog z.B. ist eine deklarativ‌e Programmiersprache. Ein deklaratives Programm beschreibt Eigenschaften der Lösung des Problems. Der Programmierer legt sein Augenmerk auf die Frage, was berechnet werden soll, und nicht, wie man es berechnet. Dagegen stellt ein imperatives Programm eine Anleitung dar. Sie beschreibt, wie – Schritt für Schritt – die Aufgabe gelöst werden soll.

Das folgende kleine Experiment veranschaulicht den Unterschied. Wenn Sie es selbst durchspielen wollen, benötigen Sie sieben Streichhölzer. Die beiden folgenden Texte beschreiben auf deklarative und auf imperative Weise, wie die Streichhölzer angeordnet werden sollen. Probieren Sie aus, mit welchem Paradigma Sie besser zurechtkommen.

Deklaratives Paradigma:

Insgesamt gibt es sieben Streichhölzer.

Genau ein Streichholz berührt an beiden Enden jeweils zwei weitere Streichhölzer.

Wenigstens ein Streichholz bildet mit zwei benachbarten Streichhölzern jeweils einen rechten Winkel.

Drei Streichhölzer liegen zueinander parallel, berühren sich aber nicht.

Es gibt kein Streichholz, das nicht an jedem Ende wenigstens ein anderes Streichholz berührt.

Imperative‌s Paradigma:

Legen Sie zwei Streichhölzer (A und B) in einer geraden Linie nebeneinander auf den Tisch, so dass sie sich an einer Stelle berühren.

Legen Sie ein Streichholz C mit einem Ende an der Stelle an, wo sich A und B berühren. Das Streichholz soll einen rechten Winkel zu A und B bilden.

Legen Sie an die äußeren Enden von A und B jeweils ein weiteres Streichholz mit einem Ende an (D und E), so dass diese neuen Streichhölzer jeweils einen rechten Winkel zu A und B bilden und in die gleiche Richtung gehen wie das mittlere Streichholz.

Verbinden Sie die noch freien Enden von C, D und E mit den verbleibenden zwei Streichhölzern.

Eine Abbildung der korrekten Anordnung finden Sie am Ende des Kapitels. Vermutlich haben Sie die zweite Aufgabe schneller lösen können. Tatsächlich benötigen auch in der Computertechnik imperative Programme weniger Rechenzeit als deklarative.

Zum Schluss sei noch das Paradigma der funktionalen Programmierung erwähnt. Mit funktionalen Programmiersprachen wie z.B. Haskell oder Scheme kann man ein Programm als (mathematische) Funktion definieren. Einfache vorgegebene Funktionen werden zu einer komplexen Funktion verknüpft, die das Gewünschte leistet. Mathematisch geschulten Menschen fällt diese Art der Programmentwicklung bei bestimmten Problemen leichter.

Man kann mit Fug und Recht sagen, dass unter diesen drei Paradigmen der imperative Ansatz am verbreitetesten ist. Funktionale und deklarative Sprachen spielen heute in der Praxis der Software-Entwicklung eher eine untergeordnete Rolle. Auch die objektorientierte Programmierung (OOP) wird als eigenes Programmierparadigma beschrieben. Das hört sich so an, als wäre die objektorientierte Programmierung etwas ganz anderes als das imperative oder funktionale Paradigma. Aber ganz so ist es eigentlich nicht. Vielmehr betrifft das Paradigma der Objektorientierung einen Aspekt der Programmentwicklung, den ich bisher noch nicht erwähnt habe. Es geht um die Beherrschung von Komplexität.

1.7  ‌Objektorientierte‌ Programmierung

1.7.1  Strukturelle Zerlegung

Die ersten Computerprogramme waren einfach und dienten der Lösung eines relativ kleinen, gut umgrenzten Problems. Die Situation wird ganz anders, wenn man umfangreiche Software erstellen möchte, etwa ein Textverarbeitungsprogramm oder ein Verwaltungsprogramm für eine Bibliothek. Solche großen Systeme lassen sich nur beherrschen, wenn man sie zunächst in kleinere überschaubare Teile aufbricht. Abbildung 1.5 soll diesen Gedanken veranschaulichen.

Abb. 1.5: Zerlegung eines komplexen Systems

Die Vorteile liegen auf der Hand:

Die kleineren Teile des Ganzen lassen sich einfacher programmieren. Die Wahrscheinlichkeit, dass sie Fehler enthalten, ist geringer. Mehrere Personen können zeitgleich und unabhängig voneinander die Einzelteile erstellen. Das spart Zeit. Und es kann sein, dass man später einen Baustein, den man früher einmal programmiert hat, wieder verwenden kann. Das spart Kosten.

Das objektorientierte Paradigma bietet ein Verfahren, nach dem große Systeme in kleinere Teile zerlegt werden können.

1.7.2  Die Welt als System von Objekten

In der objektorientierten Sichtweise stellt man sich die Welt als System von Objekten vor, die untereinander Botschaften austauschen. Zur Veranschaulichung betrachten wir ein Beispiel aus dem Alltag, das in Abbildung 1.6 illustriert wird.

Leonie in Bonn möchte ihrer Freundin Elena in Berlin einen Blumenstrauß schicken. Sie geht deshalb zu Mark, einem Blumenhändler, und erteilt ihm einen entsprechenden Auftrag. Betrachten wir Mark als Objekt. In der Sprache der objektorientierten Programmierung sagt man: Leonie sendet an das Objekt Mark eine Botschaft, nämlich: »Sende sieben gelbe Rosen an Elena, Markgrafenstr. 10 in Berlin.«. Damit hat sie getan, was sie tun konnte. Es liegt nun in Marks Verantwortung, den Auftrag zu bearbeiten. Mark versteht die Botschaft und weiß, was zu tun ist. Das heißt, er kennt einen Algorithmus für das Verschicken von Blumen. Der erste Schritt ist, einen Blumenhändler in Berlin zu finden, der die Rosen an Elena liefern kann. In seinem Adressverzeichnis findet er den Floristen Sascha. Ihm sendet er eine leicht veränderte Botschaft, die nun zusätzlich noch den Absender enthält. Damit ist Mark fertig und hat die Verantwortung für den Prozess weitergegeben. Auch Sascha hat einen zur Botschaft passenden Algorithmus parat. Er stellt den gewünschten Blumenstrauß zusammen und beauftragt seinen Boten Daniel, die Rosen auszuliefern. Daniel muss nun den Weg zur Zieladresse finden und befragt seine Straßenkarte. Sie antwortet ihm mit einer Wegbeschreibung. Nachdem Daniel den Weg zu Elenas Wohnung gefunden hat, überreicht er die Blumen und teilt ihr in einer Botschaft mit, von wem sie stammen. Damit ist der gesamte Vorgang, den Leonie angestoßen hat und an dem mehrere Objekte beteiligt waren, beendet.

Abb. 1.6: Objektorientiertes Modell eines Blumenversandsystems

1.7.3  Objekte besitzen Attribute und beherrschen Methode‌n

Jedes Objekt besitzt Eigenschaften oder Attribute. Ein Attribut eines Blumenhändlers ist z.B. die Stadt, in der er sein Geschäft hat. Dieses Attribut ist auch für die Umwelt wichtig. So musste Mark einen Blumenhändler mit dem Attribut »wohnhaft in Berlin« suchen. Weitere typische Attribute von Blumenhändlern sind Name, Telefonnummer, Warenbestand oder Öffnungszeiten.

Abb. 1.7: Objekte besitzen Attribute und beherrschen Methoden.

Objekte sind in der Lage, bestimmte Operationen auszuführen, die man Methoden nennt. Ein Blumenhändler z.B. kann einen Lieferauftrag für Blumen entgegennehmen, Sträuße binden, einen Boten schicken, beim Großhandel neue Blumen einkaufen usw. Wenn ein Objekt eine geeignete Botschaft empfängt, wird eine zur Botschaft passende Operation gestartet. Man sagt: Die Methode wird aufgerufen. Der Umwelt, das heißt den anderen Objekten, ist bekannt, welche Methoden ein Objekt beherrscht. Die Umwelt weiß von den Methoden nur,

was sie bewirken

welche Daten sie als Eingabe benötigen

Die Umwelt weiß aber nicht, wie das Objekt funktioniert, das heißt, nach welchen Algorithmen die Botschaften verarbeitet werden. Dieses bleibt ein privates Geheimnis des Objektes.

Leonie hat keine Ahnung, wie Mark den Blumentransport bewerkstelligt. Es interessiert sie auch gar nicht. Ihre Aufgabe bestand allein darin, für ihr Problem ein geeignetes Objekt zu finden und ihm eine geeignete Botschaft zu senden. Ein ungeeignetes Objekt wäre zum Beispiel Tom, der Zahnarzt, oder Katrin, die Leiterin des Wasserwerks gewesen. Diese Objekte hätten Leonis Nachricht gar nicht verstanden und zurückgewiesen. Außerdem ist für Leonie wichtig, wie sie die Botschaft an Mark formuliert. Sie muss ihm ihren Namen mitteilen (damit der Empfänger weiß, von wem die Blumen sind), die Adresse des Empfängers sowie Anzahl und Sorte der Blumen, die gesendet werden sollen.

Eine Methode ist die Implementierung (technische Realisierung) eines Algorithmus. Bei der Programmierung einer Methode mit Python (oder einer anderen objektorientierten Sprache) wird also wieder das imperative Paradigma wichtig.

1.7.4  Objekte sind Instanz‌en von Klasse‌n

Die Objekte des Beispiels kann man in Gruppen einteilen. Sascha und Mark sind beide Blumenhändler. Sie beherrschen beide dieselben Methoden und besitzen dieselben Attribute (z.B. die Stadt), allerdings mit unterschiedlichen Werten. Man sagt: Sascha und Mark sind Instanzen der Klasse »Blumenhändler«. In der objektorientierten Programmierung ist eine Klasse die Definition eines bestimmten Typs von Objekten. Sie ist so etwas wie ein Bauplan, in dem die Methoden und Attribute beschrieben werden. Nach diesem Schema können Objekte (Instanzen) einer Klasse erzeugt werden. Ein Objekt ist eine Konkretisierung, eine Inkarnation einer Klasse. Alle Instanzen einer Klasse sind von der Struktur her gleich. Sie unterscheiden sich allein in der Belegung ihrer Attribute mit Werten. Die Objekte Sascha und Mark besitzen dasselbe Attribut »Stadt«, aber bei Sascha trägt es den Wert »Berlin« und bei Mark »Bonn«.

1.8  Hintergrund: Geschichte der objektorientierten Programmierung

Die Grundideen der Objektorientierung (wie z.B. die Begriffe Klasse und Objekt) tauchen zum ersten Mal in der Simulationssprache SIMULA auf. Sie wurde von Ole-Johan Dahl and Kristen Nygaard am Norwegian Computing Centre (NCC) in Oslo zwischen 1962 und 1967 entwickelt und diente zur Simulation komplexer Systeme der realen Welt. Die erste universell verwendbare objektorientierte Programmiersprache wurde in den Jahren 1970 bis 1980 am Palo Alto Research Center der Firma Xerox von Alan Key und seinem Team entwickelt und unter dem Namen SmallTalk-80 in die Öffentlichkeit gebracht. Wenig später entstand in den Bell Laboratories (AT&T, USA) unter der Leitung von Bjarne Stroustrup die Sprache C++ als objektorientierte Erweiterung von C. Sie wurde zu Beginn der Neunzigerjahre zur dominierenden objektorientierten Sprache. Mitte der Neunzigerjahre etablierte sich Java (Sun Microsystems Inc.) auf dem Markt. Die Entwicklung von Python wurde 1989 von Guido van Rossum am Centrum voor Wiskunde en Informatica (CWI) in Amsterdam begonnen und wird nun durch die nichtkommerzielle Organisation Python Software Foundation (PSF) koordiniert. Gegenwärtig gibt es eine rasch wachsende Communitiy von Python-Programmierern.

Etwa parallel zur Entwicklung von objektorientierten Programmiersprachen wurden Konzepte der objektorientierten Analyse (OOA‌) und des objektorientierten Entwurfs (OOD) veröffentlicht. Im Prozess einer objektorientierten Software-Entwicklung sind OOA und OOD der Implementierung in einer Programmiersprache vorgelagert. Im Gegensatz zur rein textuellen Notation der Programmiersprachen verwenden objektorientierte Analyse- und Entwurfsmethoden auch visuelle Darstellungen. Besonders zu erwähnen ist die Unified Modeling Language (UML), die in der Version 1.1 im September 1997 publiziert wurde und heute so etwas wie einen Industriestandard zur grafischen Beschreibung objektorientierter Software-Systeme darstellt.

1.9  Aufgaben

Aufgabe 1

Welche der folgenden Texte sind Algorithmen?

Liebesbrief

Formular zur Beantragung eines Personalausweises

Märchen

Musterlösung einer Mathematikaufgabe

Die christlichen Zehn Gebote

Aufgabe 2

Ordnen Sie den folgenden Beschreibungen einer Problemlösung passende Programmierparadigmen zu (imperativ, objektorientiert, deklarativ).

Um ein Zündholz zu entzünden, reiben Sie den Kopf des Zündholzes über die Reibfläche.

Um eine Menge von Blumenvasen der Größe nach zu sortieren, sorgen Sie davor, dass jede Blumenvase entweder am Anfang der Reihe steht oder größer als ihr linker Nachbar ist.

Der Betrieb in einem Restaurant funktioniert so: Es gibt einen Koch und einen Kellner. Der Kellner kümmert sich um die Gäste, säubert die Tische, bringt das Essen und kassiert. Der Koch bereitet das Essen zu, wenn er vom Kellner einen Auftragzettel mit den Nummern der bestellten Gerichte erhält.

1.10  Lösungen

Lösung 1

Liebesbriefe können natürlich sehr unterschiedlich aussehen, manche sind leidenschaftlich, andere poetisch und sensibel. Wenn auch nach Auffassung des Kommunikationstheoretikers Schulz von Thun jede sprachliche Botschaft (unter anderem) auch eine appellative Dimension hat, dürfte ein Liebesbrief insgesamt wohl kaum als Anweisung zur Lösung eines Problems zu sehen sein und ist damit kein Algorithmus.

Ein solches Formular besitzt die entscheidenden Merkmale eines Algorithmus. Es beschreibt (einigermaßen unmissverständlich) alle Aktionen, die ausgeführt werden müssen, um das Problem »Wie komme ich an einen Personalausweis?« zu lösen.

Märchen erzählen, was vor langer Zeit passiert ist. Sie sind keine Algorithmen.

Eine gut formulierte Musterlösung beschreibt in der Regel einen Lösungsweg, führt also die mathematischen Operationen (in der richtigen Reihenfolge) auf, die man ausführen muss, um die Aufgabe zu lösen. Sie kann somit als Algorithmus (mit Kommentaren zum besseren Verständnis) betrachtet werden.

Die Zehn Gebote sind zwar allgemeine Verhaltensvorschriften (soziale Normen), definieren aber kein konkretes Verhalten, das zu einer Problemlösung führt.

Lösung 2

Imperativ. Es handelt sich um eine Folge von Anweisungen.

Deklarativ. Es wird beschrieben, welche Eigenschaften die Lösung (nach Größe sortierte Blumenvasen) haben muss, aber nicht, wie man dieses Ziel erreicht.

Objektorientiert. Das Restaurant wird als System interagierender Objekte beschrieben.

Lösung des Experimentes »Programmierparadigmen« (Abschnitt 1.6)

Abb. 1.8: Eine mögliche Lösung des Streichholz-Experiments

Kapitel 2: Der Einstieg – Python im interaktiven Modus‌‌

In diesem Kapitel beginnt die praktische Arbeit mit Python. Zunächst installieren Sie die benötigte Software. Im interaktiven Modus führen Sie einzelne Anweisungen aus, die sofort ein Ergebnis liefern. Gewinnen Sie einen Eindruck, wie man mit Python programmieren kann.

2.1  Python installieren

Bevor Sie mit der praktischen Programmierung beginnen, müssen Sie Python auf Ihrem Rechner installieren. Sie können sämtliche Software, die Sie für die Arbeit mit Python benötigen, von der Python-Homepage‌http://www.python.org/download herunterladen. Wählen Sie die Version, die dort empfohlen wird. Das ist nicht unbedingt die neueste Version. Dieses Buch bezieht sich auf Version 3.10. Falls Sie eine neuere Version installieren, müssten aber dennoch alle Programme, die in diesem Buch beschrieben werden, funktionieren, da bei der Weiterentwicklung von Python 3 auf Abwärtskompatibilität Wert gelegt wird. Es ist kein Problem (und sogar durchaus üblich), wenn auf einem Computer nebeneinander mehrere Python-Versionen installiert sind. Python wird ständig weiterentwickelt. Im Oktober 2022 kommt die Version 3.11 heraus. Die Python Software Foundation veröffentlicht alle zwölf Monate eine neue Version. Das bedeutet nicht, dass Sie jedes Jahr neue Software installieren müssen. Auch die älteren Python-Linien werden (jeweils etwa fünf Jahre lang) weiter gepflegt. Python ist völlig kostenlos und kompatibel mit der GNU General Public License (GPL).

Python ist für Microsoft Windows, Unix und macOS verfügbar. Die offizielle Distribution der Python Software Foundation umfasst vier Komponenten:

Den Python-Interpreter

Die Entwicklungsumgebung IDLE

Module, die vom Python-Interpreter eingebunden werden können

Eine umfangreiche Dokumentation

Unix

Auf Unix-Systemen ist Python in der Regel bereits installiert. Prüfen Sie, welche Version vorliegt, indem Sie in einem Konsolenfenster auf der Kommandozeile den Befehl python –V eingeben. (Das klappt auch bei Windows-Rechnern.) Sofern Python installiert ist, meldet Ihnen das System die Version. Beispiel:

$ python –V Python 3.10.4

Wenn Sie keine Version von Python 3 vorfinden, müssen Sie nachinstallieren.

Auf einem Linux-Rechner installieren Sie Python am besten mit dem Advanced Packaging Tool (APT):

$ sudo apt-get install python3.10
Windows

Unter Windows 10 geht die Installation‌ so: Auf der Download-Seite http://www.python.org/download werden Installationsdateien angeboten, die zu Ihrem System passen.

Abb. 2.1: Python-Downloadseite für Windows

Klicken Sie auf die Schaltfläche oben links mit der aktuellsten Version von Python 3. Laden Sie das Installationsprogramm herunter und starten Sie es.

Abb. 2.2: Installation von Python 3 auf einem Windows-System

Achten Sie darauf, dass im Rahmen der Installation Python dem Systempfad hinzugefügt wird.

Sie können Python unter dem voreingestellten Pfad abspeichern oder selbst einen Speicherort bestimmen. Eine Alternative ist z.B. der Pfad c:\Python310. Um diesen Speicherort einzurichten, klicken Sie auf Customize installation (Abbildung 2.2). In einer anschließenden Dialogbox können Sie dann Ihren Wunsch-Pfad eingeben (Abbildung 2.3)

Abb. 2.3: Eingabe eines Speicherortes für Python

Wenn alles gut gegangen ist, sollte bei der Installation bereits der Systempfad erweitert worden sein. Wenn Sie bei Windows »per Hand« den Pfad erweitern wollen, öffnen Sie ein Konsolenfenster (Eingabeaufforderung) und geben z.B. folgendes Kommando ein:

set PATH=C:\Python310;%PATH%

Wenn Sie nun auf der Kommandozeile path eingeben, erhalten Sie den neuen Wert der Umgebungsvariablen PATH, der nun mit C:\Python310; beginnt.

Hier wurde davon ausgegangen, dass Python im Verzeichnis C:\Python310 gespeichert ist. Ist das nicht der Fall, müssen Sie das Kommando an Ihr System anpassen.

Für Windows wird noch ein Zusatzpaket von Mark Hammond mit Windows-spezifischen Erweiterungen empfohlen. Es enthält die Programmentwicklungsumgebung PythonWin.

Am einfachsten installieren Sie PythonWin, indem Sie die aktuellste Binärdatei von GitHub herunterladen. Besuchen Sie mit Ihrem Browser die Projektseite

https://github.com/mhammond/pywin32/releases

und laden Sie eine Version herunter, die zu der auf Ihrem Computer installierten Python-Version passen muss. Wenn Sie einen 64-Bit-Computer, aber eine 32-Bit-Version von Python haben, müssen Sie eine 32-Bit-Version von PythonWin installieren.

Noch ein Hinweis: Verwechseln Sie PythonWin nicht mit WinPython. Das ist eine portable Python-Distribution für wissenschaftliches Rechnen und sicherlich auch sehr interessant. Aber es hat mit der Erweiterung PythonWin von Mark Hammond nichts zu tun.

Abb. 2.4: Die kostenlose Entwicklungsumgebung PythonWin von Mark Hammond

Wenn alles gut geht, erscheint nach der Installation im Start-Menü im Python-Ordner auch die Entwicklungsumgebung mit der grünen Schlange als Programm-Icon. Falls das nicht passiert, können Sie die Verknüpfung von Hand herstellen. Sie finden die Programmdatei PythonWin.exe in einem speziellen Verzeichnis, das für die PythonWin-Erweiterung angelegt worden ist. Je nachdem wie Sie Python installiert haben, ist der Pfad z.B.

C:\python310\Lib\site-packages\pythonwin
macOS

Auf Apple-Computern ist Python in der Regel bereits installiert. Um das nachzuprüfen, öffnen Sie auf Ihrem Mac ein Terminal-Fenster (Programme|Dienstprogramme|Terminal) und geben folgenden Befehl ein

python --version

Um Python 3 zu installieren, besuchen Sie die Python-Website, laden eine zu Ihrem System passende Installer-Datei herunter und führen sie aus.

2.3  Objekt‌e

Python ist in einem sehr umfassenden Sinne eine objektorientierte Programmiersprache. Daten, Funktionen und andere Sprachelemente werden durch Objekte repräsentiert. Wenn man in der Mathematik von der Zahl 123 spricht, denkt man zunächst an einen numerischen Wert. Wert‌‌e von Objekten werden durch Literal‌e repräsentiert. Das sind Zeichenfolgen, die nach bestimmten Regeln aufgebaut sind. Der Wert der natürlichen Zahl 123 kann durch die Zeichenfolgen 123 (Dezimalzahl) oder 0173 (Oktalzahl) repräsentiert werden – zwei verschiedene Literale für den gleichen numerischen Wert.

Der Wert ist nur ein Aspekt eines Objektes. Für das Objekt mit dem Wert 123 ist auch von Bedeutung, dass es sich um eine ganze Zahl handelt. Das Objekt gehört zu einem bestimmten Typ‌‌, nämlich dem Typ »ganze Zahl« (engl. integer). Steht die Ziffernfolge in Hochkommata oder Anführungsstrichen, handelt es sich um eine Zeichenkette (engl. string). Die Zeichenkette '123' ist etwas anderes als die ganze Zahl 123. Der Typ eines Objektes wird dann wichtig, wenn es in einem Programm verarbeitet werden soll. Mit Zahlen kann man arithmetische Operationen durchführen, mit Zeichenketten nicht. Probieren Sie aus:

>>> 123-1 122 >>> '123'-'1' Traceback (most recent call last): File "<pyshell#27>", line 1, in ? '123'-'1' TypeError: unsupported operand type(s) for -: 'str' and 'str'

Offenbar ist die Subtraktion für Objekte vom Typ Zeichenkette nicht erlaubt.

Der Typ eines Objektes kann mit der Standardfunktion type() ermittelt werden. Beispiel:

>>> type (123) <class 'int'> >>> type('123') <class 'str'>

Ein drittes Merkmal aller Objekte ist, dass sie eine Identität‌‌ besitzen. Bei Python wird die Identität eines Objektes durch eine (einmalige) ganze Zahl repräsentiert, die mit der Standardfunktion id() abgefragt werden kann.

>>> id(123) 3011465121840 >>> id('123') 3011502573936

Die Identität dient der Identifizierung eines Objektes. Es ist mehr als nur eine verschlüsselte Form des Wertes. Es kann sein, dass zwei Objekte den gleichen Wert, aber unterschiedliche Identität besitzen. Diese Objekte sind dann gleich‌, aber nicht identisch‌. In der realen Welt können z.B. auch Atome völlig gleich sein, ohne identisch zu sein.

Halten wir also fest: Alle Objekte besitzen einen Wert, einen Typ und eine Identität (siehe Abbildung 2.7).

Abb. 2.7: Repräsentation der Zahl 123 durch ein Objekt mit Identität, Wert und Typ

Zeichenketten und ganze Zahlen sind Beispiele für Standard-Typen von Python, die in der Programmiersprache vorgegeben sind (built-in types). Es ist auch möglich, eigene Datentypen zu definieren.

2.6  Schlüsselwörter

Es gibt einige reservierte Wörter, die zwar den Syntaxregeln für Bezeichner entsprechen, aber dennoch nicht als Namen verwendet werden dürfen. Man nennt sie auch Schlüsselwörter‌ (keywords‌) und sie sind bereits mit einer bestimmten Bedeutung belegt: