Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
EINFÜHRUNG IN PYTHON 3 //
- Lehrbuch und Nachschlagewerk
- Farbige Syntaxdarstellung
- Geeignet für Programmieranfänger, aber auch für Umsteiger von anderen Sprachen wie z. B. C, C++, C#, Java
- Systematische Einführung in Python, aufbauend auf den Erfahrungen aus Hunderten von Schulungen des Autors
- Praxisnahe Übungen mit ausführlich dokumentierten Musterlösungen
- Ihr exklusiver Vorteil: E-Book inside beim Kauf des gedruckten Buches
Die wesentlichen Begriffe und Techniken der Programmierung wie auch die zugrunde liegenden Ideen werden anschaulich erklärt. Anhand typischer Beispiele werden unterschiedliche Problemstellungen verdeutlicht, die sich dann leicht auf andere Anwendungsfälle übertragen lassen. Die Übungsaufgaben mit ausführlich dokumentierten Musterlösungen dienen zur Vertiefung des Stoffs und zeigen exemplarische Vorgehensweisen, die in vielen anderen Bereichen verwendet werden können.
Als idealer Einstieg für Programmieranfänger und für Umsteiger behandelt dieses Buch alle grundlegenden Sprachelemente von Python. Auch für Python-Kenner bietet das Buch viele weiterführende Themen wie Funktionale Programmierung mit Dekorateuren, Generatoren, Klasseninstanzen als aufrufbare Objekte, Systemprogrammierung, Forks, Ausnahmehandlungen und Modultests.
Entsprechend ihrer Bedeutung ist der Objektorientierung ein umfangreicher Teil des Buchs gewidmet. In anschaulicher und leicht verständlicher Weise wird in die Thematik der OOP eingeführt und dabei der pythonische Stil demonstriert, der sich deutlich von C++ und Java unterscheidet. Außerdem wurden nun auch eigene Kapitel zu Slots, dynamischer Erzeugung von Klassen, Metaklassen und Abstrakten Klassen aufgenommen.
Die Funktionale Programmierung wird in einem eigenen Teil behandelt. Dazu wurden die Kapitel über Dekorateure und Generatoren grundlegend überarbeitet und erweitert.
AUS DEM INHALT //
- Grundlagen: Sequentielle Datentypen, Dictionaries, Mengen, Verzweigungen, Schleifen
- Flaches und tiefes Kopieren
- Funktionen
- Modularisierung
- Objektorientierte Programmierung: Grundlagen, Aufrufbare Objekte (Callables), Vererbung, Mehrfachvererbung, Slots, Klassendekoration, Metaklassen, Abstrakte Klassen
- Funktionale Programmierung: lambda, map, filter und Listen-Abstraktion, Generatoren und Iteratoren, Dekorateure
- Tests und Fehler
- Daten konservieren
- Reguläre Ausdrücke
- Typ-Anmerkungen
- Systemprogrammierung
- Forks
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 612
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Bernd Klein
Einführung in Python 3
Für Ein- und Umsteiger
4., vollständig überarbeitete Auflage
Der Autor:
Bernd Klein, [email protected]
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. Autor 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 Autor 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.
© 2021 Carl Hanser Verlag München, www.hanser-fachbuch.deLektorat: Brigitte Bauer-SchiewekCopy editing: Jürgen Dubau, Freiburg/ElbeLayout: le-tex publishing services, LeipzigUmschlagdesign: Marc Müller-Bremer, www.rebranding.de, MünchenUmschlagrealisation: Max KostopoulosTitelmotiv: © istockphoto.com/zaricmAusstattung patentrechtlich geschützt. Kösel FD 351, Patent-Nr. 0748702
Print-ISBN: 978-3-446-46379-0E-Book-ISBN: 978-3-446-46556-5E-Pub-ISBN: 978-3-446-46467-4
Titelei
Impressum
Inhalt
Vorwort
Danksagung
Teil I: Einleitung
1 Einleitung
1.1 Einfach und schnell zu lernen
1.2 Geschichte von Python
1.3 Zen von Python
1.4 Zielgruppe des Buches
1.5 Aufbau des Buches
1.6 Programmieren lernen „interaktiv”
1.7 Download der Beispiele und Hilfe
1.8 Anregungen und Kritik
Teil II: Grundlagen
2 Kommandos und Programme
2.1 Erste Schritte mit Python
2.1.1 Linux
2.1.2 Windows
2.1.3 macOS
2.2 Herkunft und Bedeutung des Begriffes interaktive Shell
2.2.1 Erste Schritte in der interaktiven Shell
2.3 Verlassen der Python-Shell
2.4 Benutzung von Variablen
2.5 Mehrzeilige Anweisungen in der interaktiven Shell
2.6 Programme schreiben oder schnell mal der Welt “Hallo” sagen
3 Bytecode und Maschinencode
3.1 Einführung
3.2 Unterschied zwischen Programmier- und Skriptsprachen
3.3 Interpreter- oder Compilersprache
4 Datentypen und Variablen
4.1 Einführung
4.2 Variablennamen
4.2.1 Gültige Variablennamen
4.2.2 Konventionen für Variablennamen
4.3 Datentypen
4.3.1 Ganze Zahlen
4.3.2 Fließkommazahlen
4.3.3 Zeichenketten
4.3.4 Boolesche Werte
4.3.5 Komplexe Zahlen
4.3.6 Operatoren
4.4 Statische und dynamische Typdeklaration
4.5 Typumwandlung
4.6 Datentyp ermitteln
5 Sequentielle Datentypen
5.1 Übersicht
5.1.1 Zeichenketten oder Strings
5.1.2 Listen
5.1.3 Tupel
5.2 Indizierung von sequentiellen Datentypen
5.3 Teilbereichsoperator
5.4 Die len-Funktion
5.5 Aufgaben
6 Listen und Tupel im Detail
6.1 Virtueller Einkaufsbummel
6.2 Stapelspeicher/ Stacks
6.3 Stapelverarbeitung in Python: pop und append
6.4 extend
6.5 Module importieren
6.6 ,+’-Operator oder append
6.7 Entfernen eines Wertes
6.8 Prüfen, ob ein Element in Liste enthalten ist
6.9 Finden der Position eines Elementes
6.10 Einfügen von Elementen
6.11 Besonderheiten bei Tupel
6.11.1 Leere Tupel
6.11.2 1-Tupel
6.11.3 Mehrfachzuweisungen, Packing und Unpacking
6.12 Die veränderliche Unveränderliche
6.13 Aufgaben
7 Verzweigungen
7.1 Anweisungsblöcke und Einrückungen
7.2 Bedingte Anweisungen in Python
7.2.1 Einfachste if-Anweisung
7.2.2 if-Anweisung mit else-Zweig
7.2.3 elif-Zweige
7.3 Vergleichsoperatoren
7.4 Zusammengesetzte Bedingungen
7.5 Wahr oder falsch: Bedingungen in Verzweigungen
7.6 Aufgaben
8 Schleifen
8.1 Übersicht
8.2 while-Schleife
8.3 break und continue
8.4 Die Alternative im Erfolgsfall: else
8.5 Iterierbare Objekte (iterables)
8.6 For-Schleife
8.7 Aufgaben
9 Dictionaries
9.1 Definition und Benutzung
9.2 Fehlerfreie Zugriffe auf Dictionaries
9.3 Einfachere Definition von Dictionaries
9.4 Zulässige Typen für Schlüssel und Werte
9.5 Verschachtelte Dictionaries
9.6 Dictionaries in Listen wandeln
9.7 Weitere Methoden auf Dictionaries
9.8 Operatoren
9.9 Die zip-Funktion
9.10 Dictionaries aus Listen erzeugen
9.11 Aufgaben
10 Mengen
10.1 Übersicht
10.2 Mengen in Python
10.2.1 Sets erzeugen
10.2.2 Mengen von unveränderlichen Elementen
10.3 Frozensets
10.4 Operationen auf „set”-Objekten
10.4.1 add(element)
10.4.2 clear()
10.4.3 copy
10.4.4 difference()
10.4.5 difference_update()
10.4.6 discard(el)
10.4.7 remove(el)
10.4.8 intersection(s)
10.4.9 union(s)
10.4.10 isdisjoint()
10.4.11 issubset()
10.4.12 issuperset()
10.4.13 pop()
10.5 Erweiterte Zuweisungsoperatoren für Mengen
11 Eingaben
11.1 Eingabe mittels input
12 Dateien lesen und schreiben
12.1 Dateien
12.2 Text aus einer Datei lesen
12.3 Schreiben in eine Datei
12.4 In einem Rutsch lesen: readlines und read
12.5 with-Anweisung
12.6 Aufgaben
13 Formatierte Ausgabe und Strings formatieren
13.1 Wege, die Ausgabe zu formatieren
13.2 print-Funktion
13.3 Notwendigkeit
13.4 Formatierte Stringliterale / f-Strings
13.5 Die String-Methode „format”
13.6 Stringmodulo-Operator oder Formatierung à la C
13.7 Benutzung von Dictionaries beim Aufruf der „format”-Methode
13.8 Benutzung von lokalen Variablen in „format”
13.9 Weitere String-Methoden zum Formatieren
14 Referenzen, flaches und tiefes Kopieren
14.1 Einführung
14.2 Swen und Sarah
14.3 Variablen sind Referenzen
14.4 Kopieren einer Liste
14.5 Flache Kopien
14.6 Kopieren mit deepcopy
14.7 Problemverhinderung
14.8 Deepcopy für Dictionaries
15 Funktionen
15.1 Allgemein
15.2 Funktionen
15.3 Docstring
15.4 Standardwerte für Funktionen
15.5 Schlüsselwortparameter
15.6 Funktionen ohne oder mit leerer return-Anweisung
15.7 Mehrere Rückgabewerte
15.8 Parameterübergabe im Detail
15.9 Effekte bei veränderlichen Objekten
15.10 Kommandozeilenparameter
15.11 Variable Anzahl von Parametern / Variadische Funktionen
15.12 * in Funktionsaufrufen
15.13 Beliebige Schlüsselwortparameter
15.14 Doppeltes Sternchen im Funktionsaufruf
15.15 Aufgaben
16 Wertebereich von Variablen
16.1 Einführung
16.2 Globale und lokale Variablen in Funktionen
16.3 nonlocal-Variablen
17 Rekursive Funktionen
17.1 Definition und Herkunft des Begriffs
17.2 Definition der Rekursion
17.3 Rekursive Funktionen in Python
17.4 Die Tücken der Rekursion
17.5 Fibonacci-Folge in Python
17.6 Aufgaben
18 Sortieren
18.1 Sortieren von Listen
18.1.1 „sort” und „sorted”
18.1.2 Umkehrung der Sortierreihenfolge
18.1.3 Eigene Sortierfunktionen
18.2 Aufgaben
19 Modularisierung
19.1 Module
19.1.1 Namensräume von Modulen
19.1.2 Namensräume umbenennen
19.1.3 Modularten
19.1.4 Suchpfad für Module
19.1.5 Inhalt eines Moduls
19.1.6 Eigene Module
19.1.7 Dokumentation für eigene Module
19.2 Pakete
19.2.1 Einfaches Paket erzeugen
19.2.2 Komplexeres Paket
19.2.3 Komplettes Paket importieren
20 Alles über Strings
20.1 ... fast alles
20.2 Aufspalten von Zeichenketten
20.2.1 split
20.2.2 rsplit
20.2.3 Folge von Trennzeichen
20.2.4 splitlines
20.2.5 partition und rpartition
20.3 Zusammenfügen von Stringlisten mit join
20.4 Suchen von Teilstrings
20.4.1 „in” oder „not in”
20.4.2 s.find(substring[, start[, end]])
20.4.3 s.rfind(substring[, start[, end]])
20.4.4 s.index(substring[, start[, end]])
20.4.5 s.rindex(substring[, start[, end]])
20.4.6 s.count(substring[, start[, end]])
20.5 Suchen und Ersetzen
20.6 Nur noch Kleinbuchstaben oder Großbuchstaben
20.7 capitalize und title
20.8 Stripping Strings
20.9 Strings ausrichten
20.10 String-Tests
20.11 Aufgaben
21 Ausnahmebehandlung
21.1 Abfangen mehrerer Ausnahmen
21.2 except mit mehrfachen Ausnahmen
21.3 Die optionale else-Klausel
21.4 Fehlerinformationen über sys.exc_info
21.5 Exceptions generieren
21.6 Finalisierungsaktion
Teil III: Objektorientierte Programmierung
22 Grundlegende Aspekte
22.1 Bibliotheksvergleich
22.2 Objekte und Instanzen einer Klasse
22.3 Kapselung von Daten und Methoden
22.4 Eine minimale Klasse in Python
22.5 Eigenschaften und Attribute
22.6 Methoden
22.7 Instanzvariablen
22.8 Die __init__-Methode
22.9 Destruktor
22.10 Datenkapselung, Datenabstraktion und Geheimnisprinzip
22.10.1 Definitionen
22.10.2 Zugriffsmethoden
22.10.3 Properties
22.10.4 Public-, Protected- und Private-Attribute
22.10.5 Weitere Möglichkeiten der Properties
22.10.6 Properties mit Dekorateuren
22.11 Stringausgaben mit str und repr
22.12 Klassenattribute
22.13 Statische Methoden
22.13.1 Einleitendes Beispiel
22.13.2 Getter und Setter für private Klassenattribute
22.14 Public-Attribute statt private Attribute
22.15 Magische Methoden und Operatorüberladung
22.15.1 Einführung
22.15.2 Übersicht magische Methoden
22.15.3 Beispielklasse: Length
23 Bruchklasse
23.1 Brüche à la 1001 Nacht
23.2 Zurück in die Gegenwart
23.3 Rechenregeln
23.3.1 Multiplikation von Brüchen
23.3.2 Division von Brüchen
23.3.3 Addition von Brüchen
23.3.4 Subtraktion von Brüchen
23.3.5 Vergleichsoperatoren
23.4 Integer plus Bruch
23.4.1 Die Bruchklasse im Überblick
23.5 Fraction-Klasse
24 Aufrufbare Objekte
24.1 Einführung
24.1.1 Die callable-Funktion
24.1.2 Klassen statt Funktionen
25 Vererbung
25.1 Oberbegriffe und Oberklassen
25.2 Ein einfaches Beispiel
25.3 Überladen, Überschreiben und Polymorphie
25.4 Vererbung in Python
25.5 Klassenmethoden
25.6 Standardklassen als Basisklassen
26 Mehrfachvererbung
26.1 Einführung
26.2 Beispiel: KalenderUndUhr
26.3 Diamand-Problem oder „deadly diamond of death”
26.4 super und MRO
26.4.1 Ein einfaches Beispiel
26.4.2 Ein umfangreicheres Beispiel
27 Slots
27.1 Erzeugung von dynamischen Attributen verhindern
28 Dynamische Erzeugung von Klassen
28.1 Beziehung zwischen „class” und „type”
29 Metaklassen
29.1 Motivation
29.2 Definition
29.3 Definition von Metaklassen in Python
29.4 Singletons mit Metaklassen erstellen
29.5 Beispiel: Methodenaufrufe zählen
29.5.1 Einführung
29.5.2 Vorbereitungen
29.5.3 Ein Dekorateur, um Funktionsaufrufe zu zählen
29.5.4 Die Metaklasse „Aufrufzähler”
30 Abstrakte Klassen
31 Aufgaben zur Objektorientierung
Teil IV: Funktionale Programmierung
32 Begriffsbestimmung
33 lambda, map, filter und reduce
33.1 lambda
33.2 map
33.3 Filtern von sequentiellen Datentypen mittels „filter”
33.4 reduce
33.5 Aufgaben
34 Listen-Abstraktion/List Comprehension
34.1 Die Alternative zu Lambda und Co.
34.2 Syntax
34.3 Weitere Beispiele
34.4 Die zugrunde liegende Idee
34.5 Anspruchsvolleres Beispiel
34.6 Mengen-Abstraktion
34.7 Rekursive Primzahlberechnung
34.8 Generatoren-Abstraktion
34.9 Aufgaben
35 Generatoren und Iteratoren
35.1 Einführung
35.2 Iteration in for-Schleifen
35.3 Generatoren
35.4 Endlos-Generatoren zähmen mit firstn und islice
35.5 Sinnvollere Beispiele
35.6 Beispiele aus der Kombinatorik
35.6.1 Permutationen
35.6.2 Variationen und Kombinationen
35.7 Generator-Ausdrücke
35.8 return-Anweisungen in Generatoren
35.9 send-Methode
35.10 Die close-Methode
35.11 Die throw-Methode
35.12 Dekoration von Generatoren
35.13 yield from
35.14 Aufgaben
36 Dekorateure
36.1 Einführung Dekorateure
36.1.1 Verschachtelte Funktionen
36.1.2 Funktionen als Parameter
36.1.3 Funktionen als Rückgabewert
36.1.4 Fabrikfunktionen
36.2 Ein einfacher Dekorateur
36.3 @-Syntax für Dekorateure
36.4 Anwendungsfälle für Dekorateure
36.4.1 Überprüfung von Argumenten durch Dekorateure
36.4.2 Funktionsaufrufe mit einem Dekorateur zählen
36.5 Dekorateure mit Parametern
36.6 Benutzung von Wraps aus functools
36.7 Eine Klasse als Dekorateur benutzen
36.8 Memoisation
36.8.1 Bedeutung und Herkunft des Begriffs
36.8.2 Memoisation mit Dekorateurfunktionen
36.8.3 Memoisation mit einer Klasse
36.8.4 Memoisation mit functools.lru_cache
Teil V: Weiterführende Themen
37 Tests und Fehler
37.1 Einführung
37.2 Modultests
37.3 Modultests unter Benutzung von __name__
37.4 doctest-Modul
37.5 Testgetriebene Entwicklung oder „Im Anfang war der Test”
37.6 unittest
37.7 Methoden der Klasse TestCase
37.8 Aufgaben
38 Daten konservieren
38.1 Persistente Speicherung
38.2 Pickle-Modul
38.2.1 Daten „einpökeln” mit pickle.dump
38.2.2 pickle.load
38.3 Ein persistentes Dictionary mit shelve
39 Reguläre Ausdrücke
39.1 Ursprünge und Verbreitung
39.2 Stringvergleiche
39.3 Überlappungen und Teilstrings
39.4 Das re-Modul
39.5 Matching-Problem
39.6 Syntax der regulären Ausdrücke
39.6.1 Beliebiges Zeichen
39.7 Zeichenauswahl
39.8 Endliche Automaten
39.9 Anfang und Ende eines Strings
39.10 Vordefinierte Zeichenklassen
39.11 Optionale Teile
39.12 Quantoren
39.13 Gruppierungen und Rückwärtsreferenzen
39.13.1 Match-Objekte
39.14 Iteration über Matches mit finditer
39.15 Umfangreiche Übung
39.16 Alles finden mit findall
39.17 Alternativen
39.18 Compilierung von regulären Ausdrücken
39.19 Aufspalten eines Strings mit oder ohne regulären Ausdruck
39.19.1 split-Methode der String-Klasse
39.19.2 split-Methode des re-Moduls
39.19.3 Wörter filtern
39.20 Suchen und Ersetzen mit sub
39.21 Aufgaben
40 Typanmerkungen
40.1 Einführung
40.2 Einfaches Beispiel
40.3 Variablenanmerkungen
40.4 Listenbeispiele
40.5 Listen mit homogenem Typ
40.5.1 Version 3.6 bis 3.8
40.5.2 Python 3.9 und später
41 Systemprogrammierung
41.1 Einleitung
41.2 Häufig falsch verstanden: Shell
41.3 os-Modul
41.3.1 Vorbemerkungen
41.3.2 Umgebungsvariablen
41.3.3 Dateiverarbeitung auf niedrigerer Ebene
41.3.4 Weitere Funktionen im Überblick
41.3.5 os.path – Arbeiten mit Pfaden
41.4 shutil-Modul
41.5 glob-Modul
42 Forks
42.1 Fork
42.2 Fork in Python
Teil VI: Lösungen zu den Aufgaben
43 Lösungen zu den Aufgaben
43.1 Lösungen zu Kapitel 5 (Sequentielle Datentypen)
43.2 Lösungen zu Kapitel 6 (Listen und Tupel im Detail)
43.3 Lösungen zu Kapitel 7 (Verzweigungen)
43.4 Lösungen zu Kapitel 8 (Schleifen)
43.5 Lösungen zu Kapitel 9 (Dictionaries)
43.6 Lösungen zu Kapitel 12 (Dateien lesen und schreiben)
43.7 Lösungen zu Kapitel 15 (Funktionen)
43.8 Lösungen zu Kapitel 17 (Rekursive Funktionen)
43.9 Lösungen zu Kapitel 18 (Sortieren)
43.10 Lösungen zu Kapitel 20 (Alles über Strings . . . )
43.11 Lösungen zu den Kapiteln 22 bis 31 (Aufgaben zur Objektorientierung)
43.12 Lösungen zu Kapitel 33 (lambda, map, filter und reduce)
43.13 Lösungen zu Kapitel 34 (Listen-Abstraktion/List Comprehension)
43.14 Lösungen zu Kapitel 35 (Generatoren und Iteratoren)
43.15 Lösungen zu Kapitel 37 (Tests und Fehler)
43.16 Lösungen zu Kapitel 39 (Reguläre Ausdrücke)
Ist es wirklich so, dass Vorworte – ähnlich wie Bedienungsanleitungen – meistens nicht gelesen werden? Auch wenn dies sicherlich für viele zutreffen mag, so gibt es Situationen, in denen gerade ein Vorwort wertvolle Dienste leisten kann. Zum Beispiel, um die Kaufentscheidung für ein Buch zu erleichtern. So stehen auch Sie jetzt vielleicht am Regal einer guten Buchhandlung und werden möglicherweise von zwei Fragen bewegt: Sie brauchen noch eine Bestätigung, dass Python die richtige Programmiersprache für Sie ist, und möchten wissen, wie Ihnen dieses Buch helfen wird, die Sprache schnell und effizient zu erlernen.
Für Python spricht der traumhafte Anstieg seiner Bedeutung in Wissenschaft, Forschung und Wirtschaft in den letzten Jahren. Dies spiegelt sich auch in den Rankings von Programmiersprachen wider, die von verschiedenen Stellen durchgeführt werden. PYPL zählt wohl zu den bekanntesten und anerkanntesten unter diesen Webrankings. Python führt im Dezember 2020 mit 30,34 % den Index von PYPL an, gefolgt von Java mit nur 17,23 %.1
Weitere wichtige Gründe, Python zu lernen, sind: Python ist mit seiner einfachen natürlichen Syntax sehr einfach zu lernen. Python läuft auf allen Plattformen und erfreut sich auch beim Raspberry Pi größter Beliebtheit. Außerdem ist Python eine universell einsetzbare Programmiersprache, die sich bei den Aufgaben der Systemadministration ebenso effektiv einsetzen lässt wie im Maschinenbau, der Linguistik, der Pharmaindustrie, in der Banken- und Finanzwelt, der Physik, der Psychologie und vielen anderen Bereichen. Weil bedeutende Firmen wie Google, Facebook, Instagram, Spotify, Quora, Netflix und Dropbox Python benutzen und unterstützen, wird Python auch kontinuierlich weiterentwickelt.
Dieses Buch erscheint nun in der vierten, völlig überarbeiteten Ausgabe. Es eignet sich ebenso für Programmieranfänger als auch für Umsteiger von anderen Programmiersprachen. Behandelt werden nicht nur alle grundlegenden Sprachelemente von Python, sondern auch weiterführende Themen wie Generatoren, Dekorateure, Systemprogrammierung, Threads, Forks, Ausnahmebehandlungen und Modultests. Auf über hundert Seiten wird anschaulich und mit zahlreichen Beispielen auf die vielfältigen Aspekte der Objektorientierung eingegangen.
Brigitte Bauer-Schiewek, Lektorin
1 Im Vorwort zur 3. Auflage stand hier: Im renommierten PYPL-Index stand Python im Juli 2017 auf dem zweiten Platz hinter Java. Während Java im Vergleich zum Vorjahr jedoch -1,1 % Anteil verloren hatte, gewann Python +4,0 % hinzu.
Zum Schreiben eines Buches benötigt es neben der nötigen Erfahrung und Kompetenz im Fachgebiet vor allem viel Zeit. Zeit außerhalb des üblichen Rahmens. Zeit, die vor allem die Familie mitzutragen hat. Deshalb gilt mein besonderer Dank, wie bereits bei allen vorigen Auflagen auch, meiner Frau Karola, die mich während dieser Zeit tatkräftig unterstützt hat.
Außerdem danke ich den zahlreichen Teilnehmerinnen und Teilnehmern an meinen Python-Kursen, die mir geholfen haben, meine didaktischen und fachlichen Kenntnisse kontinuierlich zu verbessern. Ebenso möchte ich den Besucherinnen und Besuchern meiner Online-Tutorials unter www.python-kurs.eu und www.python-course.eu danken, vor allem jenen, die sich mit konstruktiven Anmerkungen bei mir gemeldet haben. Wertvolle Anregungen erhielt ich auch von denen, die das Buch vorab Korrektur gelesen hatten: Stefan Günther für die Erstauflage des Buches. Für die Hilfe zur zweiten – weitestgehend überarbeiteten – Auflage möchte ich im besonderen Maße Herrn Jan Lendertse und Herrn Vincent Bermel Dank sagen. Für die dritte – wiederum stark veränderte – Auflage danke ich Herrn Wilhelm Wall für seine wertvolle Hilfe, insbesondere Tests unter macOS.
Mein besonderer Dank für die vierte Auflage gilt zum einen Herrn Tobias Habermann und zum anderen Herrn Dr. Konrad Wienands. Herr Habermann hat dafür gesorgt, dass alle Python-Beispiele dieser Auflage automatisch mittels „Pythontex” getestet und ausgeführt werden. Herr Dr. Wienands ist mit großem Sachverstand in die Rolle eines potenziellen Anfängers geschlüpft und hat mir viele wertvolle Hinweise gegeben, wo es möglicherweise offene Fragen oder Probleme bei Neulingen geben könnte. Außerdem hat er auch kleine Unstimmigkeiten gefunden.
Vergessen darf ich auch nicht all diejenigen, die die Exemplare der vorigen Auflagen gekauft und damit erst den Erfolg des Buches ermöglicht hatten. Ebenso danke ich all denjenigen, die mich in E-Mails auf kleine Fehler oder Unstimmigkeiten hingewiesen haben, die ich aber hier leider nicht alle namentlich erwähnen kann.
Zuletzt danke ich auch ganz herzlich dem Hanser Verlag, der dieses Buch – nun auch in der vierten Auflage – ermöglicht. Vor allem danke ich Frau Brigitte Bauer-Schiewek und Frau Kristin Rothe, Programmplanung Computerbuch, für die kontinuierliche ausgezeichnete Unterstützung. Für die technische Unterstützung bei LaTeX-Problemen danke ich Herrn Stephan Korell und Frau Irene Weilhart. Herrn Jürgen Dubau danke ich fürs Lektorat.
Bernd Klein, Singen
Teil I
Einleitung
Python ist eine Programmiersprache, die in vielerlei Hinsicht begeistert. Ein riesiger Vorteil im Vergleich zu anderen Sprachen liegt in der leichten Erlernbarkeit der Sprache. In der ersten Auflage führte das Buch den Untertitel „In einer Woche programmieren lernen”. Kann man wirklich in so kurzer Zeit programmieren lernen? Das ist möglich! Vor allem mit Python. Wir erfahren es mehrmals im Monat in unseren meist fünftägigen Python-Kursen. Sie werden zum einen von Leuten, die noch keinerlei Programmiererfahrung haben, und zum anderen von Programmierenden mit Erfahrungen in C, C++, Java, Perl und anderen Programmiersprachen besucht. Manche haben auch schon vorher Erfahrungen in Python gesammelt. Aber eines ist in allen Gruppen gleich: Wir haben es immer geschafft, dass jeder programmieren gelernt hat, und vor allen Dingen – was uns am wichtigsten ist – konnten wir immer die Begeisterung für die Sprache Python entfachen.
So ist es auch eines der wichtigsten Ziele dieses Buches, die Leserinnen und Leser möglichst schnell und mit viel Freude zum selbständigen Programmieren zu bringen. Komplexe Sachverhalte werden in einfachen, leicht verständlichen Diagrammen veranschaulicht und an kleinen Beispielen eingeübt, die sich im Laufe vieler Schulungen herausgebildet und bewährt haben.
1.2Geschichte von PythonWas hat Python mit dem lateinischen Alphabet zu tun? Beide beginnen mit ABC. Im Falle von Python ist es die Programmiersprache ABC. Die Sprache wurde Anfang der 1990er Jahre von Guido van Rossum am Zentrum für Mathematik (Centrum voor Wiskunde en Informatica) in Amsterdam entwickelt. Ursprünglich war Python als Nachfolger für die Lehrsprache ABC entwickelt worden und sollte auf dem verteilten Betriebssystem Amoeba laufen. Guido van Rossum hatte auch an der Entwicklung der Sprache ABC mitgewirkt. In einem Interview mit Bill Venners sagte er: „In den frühen 1980er Jahren arbeitete ich als Implementierer in einem Team, das eine Sprache namens ABC am Centrum voor Wiskunde en Informatica (CWI) aufbaute. Ich weiß nicht, wie gut die Leute den Einfluss von ABC auf Python kennen. Ich versuche, den Einfluss von ABC zu erwähnen, weil ich alles, was ich während dieses Projekts gelernt habe, und die Leute, die daran gearbeitet haben, zu verdanken habe.”1
Auch wenn sich das offizielle Logo von Python aus zwei abstrahierten Python-Schlangen zusammensetzt, hat der Name der Programmiersprache Python herkunftsmäßig nichts mit Schlangen zu tun. Für Guido van Rossum stand vielmehr die britische Komikertruppe „Monty Python” mit ihrem legendären „Flying Circus” Pate für den Namen. Guido van Rossum schrieb dazu: „Vor über sechs Jahren, im Dezember 1989, suchte ich nach einem ,Hobby’-Programmierprojekt, mit dem ich mich während der Weihnachtswoche beschäftigen könnte. Mein Büro (ein staatliches Forschungslabor in Amsterdam) würde geschlossen sein, aber ich hatte einen Computer und nicht viel anderes vor. Ich beschloss, einen Interpreter für die neue Skriptsprache zu schreiben, über die ich in letzter Zeit nachgedacht hatte: einen Nachkommen von ABC, der Unix-/C-Hacker ansprechen würde. Ich habe Python als Arbeitstitel für das Projekt gewählt, da ich in einer etwas respektlosen Stimmung bin (und ein großer Fan von ,Monty Python’s Flying Circus’).’2
Dennoch sind Assoziationen mit Schlangen möglich und sinnvoll: Man denke nur an das Python-Toolkit „Boa” oder die Programmiersprache Cobra. Außerdem ist eine Schlange, wie schon erwähnt, im Python-Logo.
1.3Zen von PythonVom Softwareentwickler Tim Peters stammt das „Zen of Python”, welches er 1999 veröffentlichte. Dabei handelt es sich um „Leitprinzipien” zum Schreiben guter Python-Programme. Prinzipien, die sich sowohl an Programmierende als auch an die Designer der Sprache richten und die Sprache Python auch entscheidend prägten:
Schön ist besser als hässlich.
Explizit ist besser als implizit.
Einfach ist besser als komplex.
Komplex ist besser als kompliziert.
Flach ist besser als verschachtelt.
Spärlich ist besser als dicht.
Lesbarkeit zählt.
Sonderfälle sind nicht speziell genug, um gegen die Regeln zu verstoßen.
Obwohl Praktikabilität die Reinheit übertrifft,
Fehler sollten niemals stillschweigend ablaufen.
Sofern nicht ausdrücklich zum Schweigen gebracht.
Widerstehe im Angesicht von Zweideutigkeiten der Versuchung zu raten.
Es sollte einen – und vorzugsweise nur einen – offensichtlichen Weg geben, es zu tun.
Obwohl dieser Weg zunächst vielleicht nicht offensichtlich ist, es sei denn, Sie sind Niederländer.
Jetzt ist besser als nie.
Obwohl nie oft besser ist als gerade jetzt.
Wenn die Implementierung schwer zu erklären ist, ist es eine schlechte Idee.
Wenn die Implementierung leicht zu erklären ist, kann dies eine gute Idee sein.
Namespaces sind eine großartige Idee – lasst uns mehr davon machen!
1.4Zielgruppe des BuchesBeim Schreiben eines Buches stellt man sich ein Gegenüber vor, eine Person, die das Geschriebene lesen, mögen und verstehen soll. Diese Person kann ein beliebiges Geschlecht haben, deswegen haben wir uns im Buch um geschlechtsneutrale Formulierungen bemüht. Begriffe wie „der Nutzer” oder im Plural „die Nutzer” kommen nicht mehr im Buch vor. Allerdings haben wir diese auch nicht durch Formulierungen wie „die NutzerInnen” bzw. „Nutzer*innen” ersetzt, weil diese Formulierungen von einigen abgelehnt werden. Wir denken, dass es uns gelungen ist, geschlechtsneutral zu formulieren, ohne dass der Lesefluss gestört wird oder die Gefühle von manchen verletzt werden.
Natürlich hatten wir beim Schreiben aber nicht nur eine Person im Blickfeld, sondern eine ganze Schar von Lesenden. Da sind zum einen diejenigen, die noch nie programmiert haben und Sachverhalte erklärt haben wollen, die Leute mit Programmiererfahrung in anderen Sprachen vielleicht als „trivial” oder „selbstverständlich” bezeichnen würden. Aber hier ist ein Buch wohl dem Präsenzunterricht, also wenn Lehrende und Lernende am gleichen Ort zusammen sind, deutlich überlegen: Ist einem der Stoff eines Abschnitts oder sogar Kapitels bereits vertraut, kann man es einfach überspringen, bevor man sich zu langweilen beginnt. Ebenso können, falls keine Kenntnisse in anderen Programmiersprachen vorhanden sind, Abschnitte übersprungen werden, in denen wir Ähnlichkeiten, aber auch generelle Unterschiede in der Vorgehensweise von Python im Vergleich zu anderen Sprachen herausarbeiten.
In der obigen Aufzählung fehlt aber noch eine wichtige Gruppe, nämlich diejenigen, die schon Erfahrungen mit Python haben. Dies ist eine Gruppe mit einer breiten Streuung: angefangen bei denjenigen, die bereits ein wenig reingeschnuppert haben, gefolgt von solchen, die bereits kleine oder auch größere Programme geschrieben haben, bis hin zu jenen, die sich als Experten bezeichnen. Unsere Erfahrungen zeigen, dass auch einige aus der zuletzt genannten Gruppe neue Einblicke und Sachverhalte in diesem Buch finden werden, die sich positiv auf deren zukünftige Programmierung mit Python auswirken.
Ansonsten kann dieses Buch auch bestens als Nachschlagewerk benutzt werden. Der umfangreiche Index in diesem Buch macht das Auffinden besonders einfach und erlaubt es damit, dieses Buch außerdem als Referenz zu verwenden, auch wenn es keinesfalls unter diesem Aspekt geschrieben worden ist.
1.5Aufbau des BuchesDieses Buch besteht aus sechs Teilen:
Teil I:
Wir haben uns entschieden, die Einleitung, in der Sie sich gerade befinden, als eigenen Teil des Buches aufzunehmen. Schließlich enthält sie wichtige Informationen und sollte nach Möglichkeit auch gelesen werden.
Teil II:
Im zweiten Teil behandeln wir die Grundlagen der Sprache. Wir lernen Variablen und deren Besonderheit in Python kennen. In diesem Zusammenhang lernen wir auch die Datenstrukturen wie ganze Zahlen (Integers), Fließkommazahlen (Floats), Zeichenketten (Strings), Listen, Tupel, Dictionaries und Mengen kennen. Wir beschäftigen uns eingehend mit allen Anweisungsarten von Python, d.h. Zuweisungen, Kontrollstrukturen wie bedingten Anweisungen und Schleifen sowie Möglichkeiten der Ein- und Ausgabe. Außerdem behandeln wir eingehend Funktionen, Definitionen, einfache und auch komplexere Beispiele, Parameterübergabe sowie Gültigkeitsbereiche von Variablen, und in einem umfangreichen Kapitel gehen wir auch auf rekursive Funktionen ein. Die Modularisierung in Modulen und Paketen ist ein weiterer Themenschwerpunkt.
Teil III:
Den dritten Teil des Buches haben wir – entsprechend ihrer Bedeutung – ganz der Objektorientierung gewidmet. In anschaulichen Beispielen führen wir sanft in das objektorientierte Denken und Programmieren ein und zeigen die Besonderheiten von Python deutlich auf. Danach fahren wir mit den fortgeschrittenen Themen der Objektorientierung fort und behandeln neben Vererbung, Mehrfachvererbung und Slots auch extrem fortgeschrittene Themen wie Metaklassen und abstrakte Klassen.
Teil IV:
Viele lieben Python, weil es neben der objektorientierten Programmierung auch wesentliche Konzepte der funktionalen Programmierung unterstützt. Deshalb widmen wir diesem Thema den vierten Hauptteil des Buches. Dieser Teil des Buches wendet sich eher an Personen mit Programmiererfahrung, aber es lohnt, sich die behandelten Konzepte anzueignen. Sie sind notwendig, um Python richtig zu verstehen. Die Listen-Abstraktionen bieten ebenso wie die lambda-, map-, filter- und reduce-Funktionen eine faszinierende Möglichkeit, die Programmierung auf ein abstrakteres Level zu bringen. Dadurch kann man komplexere Probleme mit geringerem Programmieraufwand lösen, was außerdem zu einer besseren Verständlichkeit und einfacheren Wartbarkeit der Programme führt. Dennoch kann man die gleichen Programme auch ohne diese Techniken schreiben. Eingehend befassen wir uns auch mit dem Themenkomplex „Generatoren und Iteratoren” sowie „Dekoration und Dekorateure”!
Teil V:
Imfünften Teil mit dem Titel „Weiterführende Themen ” verlassen wir das „eigentliche” Python und wenden uns weiterführenden Themen der Programmierung zu. Diesen Teil hätten wir auch mit „Anwendungsprogrammierung” überschreiben können. Testverfahren und Debugging gehört zu den Fragestellungen, die alle Programmiererinnen und Programmierer bewegen sollten. Im Prinzip hätten wir dieses Kapitel ebenso gut in den ersten Teil nehmen können. Außerdem behandeln wir in einem Kapitel „Reguläre Ausdrücke”, die nahezu unerlässlich sind, wenn man Textverarbeitung effizient betreiben will. Man braucht sie beispielsweise, wenn man aus Log- oder Parameterdateien bestimmte Informationen herausfiltern will. Den ab Python 3.5 eingeführten Typanmerkungen (type annotations) haben wir auch ein eigenes Kapitel gewidmet. In einem weiteren Kapitel zeigen wir außerdem, wie man Daten strukturerhaltend übers Programmende hinaus konservieren kann. Das Kapitel zur Systemprogrammierung dürfte von besonderer Bedeutung für Leute sein, die gerne mit dem Betriebssystem agieren möchten, damit sie ihre Systemprogramme zukünftig unter Python und nicht mehr mit Shell-Skripting verfassen können.
Teil VI:
Programmieren lernen ist vor allen Dingen eine aktive Tätigkeit. Nur ein Buch zu lesen und Beispiele nachzuvollziehen, genügt nicht. Deshalb finden Sie zu den meisten Kapiteln interessante und lehrreiche Übungsaufgaben, die den Stoff vertiefen. Aufgaben ohne Lösungen wären aber wenig sinnvoll, weshalb sich im letzten Teil dieses Buches ausführliche Musterlösungen mit Erläuterungen zu den Aufgaben befinden.
Teil VII:
Auch wenn es nicht als eigener Teil aufgeführt ist, wollen wir hier noch auf das Stichwortverzeichnis eingehen. Erst ein umfangreiches Stichwortverzeichnis macht aus einem guten Buch ein nützliches und brauchbares Buch!
1.6Programmieren lernen „interaktiv”Wie bereits erwähnt, floss in dieses Buch die jahrelange Erfahrung sowohl in der Theorie und Praxis des Programmierens allgemein, aber vor allem auch die Vermittlung des Stoffes in zahlreichen kleinen und großen Kursen mit unterschiedlichsten Besuchertypen ein. Aber ein Buch zu schreiben, stellt dennoch eine neue Herausforderung dar. Beim Buch fehlt leider die direkte Interaktion zwischen dem, der das Wissen vermittelt, und dem Lernenden. Vor Ort kann man sofort sehen, wenn sich bei einem Teilnehmer die Stirn runzelt, große Fragezeichen erscheinen oder wenn sich jemand aus Stress das Ohrläppchen zu reiben beginnt. Dann weiß man als erfahrener Dozent, dass es höchste Zeit ist, ein paar zusätzliche Beispiele und Analogien zu verwenden, oder dass man den Stoff nochmals in anderen – möglicherweise auch einfacheren – Worten erklären sollte. Beim Schreiben eines Buches muss man diese möglichen Klippen vorhersehen und die nötigen zusätzlichen Übungen und Beispiele an den entsprechenden Stellen bereitstellen. Aber was bei vielen Lesern hilft, diese Klippen zu umgehen, führt bei anderen nun vielleicht zu Langeweile und Ungeduld, denn sie empfinden diese zusätzlichen Erklärungen, Übungen oder Beispiele möglicherweise als Zeit- oder Platzvergeudung.
Das Grundproblem ist, dass es sich bei einem Buch nicht um ein interaktives Medium handelt. Aber dank des Internets können wir Ihnen diese Interaktivität dennoch bieten. Im nächsten Abschnitt finden Sie die Adressen, wo Sie Hilfe und zusätzliche Informationen zum Buch finden.
1.7Download der Beispiele und HilfeAlle im Buch verwendeten Beispiele finden Sie zum Download unter
http://www.python-kurs.eu/buch/beispiele/
Auch wenn wir das Buch so geschrieben haben, dass Sie ohne zusätzliche Hilfe auskommen sollten, wird es dennoch hier und da mal ein Problem geben, wo Sie sich vielleicht festgebissen haben. Wenn das Glück es so will, dass Sie in einer Umgebung arbeiten, in der es andere Python-Programmierende gibt, haben Sie es natürlich gut. Aber viele Leserinnen und Leser genießen diesen Vorteil nicht. Dann könnte sich ein Besuch unserer Website besonders lohnen:
http://www.python-kurs.eu/buch/
Dort finden Sie ein Korrekturverzeichnis, zusätzliche bzw. aktualisierte Übungen und sonstige Hilfestellungen. Ansonsten bleibt natürlich immer noch der Einsatz einer Suchmaschine!
1.8Anregungen und KritikFalls Sie glauben, eine Ungenauigkeit oder einen Fehler im Buch gefunden zu haben, können Sie auch gerne eine E-Mail direkt an den Autor schicken: [email protected].
Natürlich gilt dies auch, wenn Sie Anregungen oder Wünsche zum Buch geben wollen. Leider können wir jedoch – so gerne wir es auch tun würden – keine individuellen Hilfen zu speziellen Problemen geben.
Wir werden versuchen, Fehler und Anmerkungen in kommenden Auflagen zu berücksichtigen. Selbstverständlich aktualisieren wir damit auch unsere Informationen unter
http://www.python-kurs.eu/buch/
1 Bill Venners: The Making of Python, A Conversation with Guido van Rossum, Part I, January 13, 2003, https://www.artima.com/intv/python.html
2 Guido van Rossum schrieb dies in einem Vorwort zur ersten Auflage des Buches „Programming Python” von Marc Lutz.
Teil II
Grundlagen
Dieses Kapitel können Sie beim Einstieg in die Materie auch gerne überspringen, da das Verständnis für die folgenden Kapitel nicht notwendig ist. Diejenigen, die noch nie programmiert haben, sollten dieses Kapitel definitiv überspringen. Hier geht es um allgemeine Fragen: Handelt es sich bei Python um eine Programmier- oder eine Skriptsprache? Wird ein Python-Programm übersetzt oder interpretiert? Kann der gleiche Python-Code auf verschiedenen Rechnern oder Betriebssystemen laufen? Worin liegt der Zusammenhang zwischen Python, Jython oder Java?
3.2Unterschied zwischen Programmier- und SkriptsprachenDie Frage, worin der Unterschied zwischen Programmier- und Skriptsprachen liegt, lässt sich nicht einfach beantworten. Sehr häufig werden die Begriffe Skript und Programm nahezu synonym verwendet. Es gibt Fälle, in denen es eindeutig ist: Hat man beispielsweise ein Problem in C gelöst, so wird allgemein das Ergebnis als „Programm” bezeichnet. Kaum jemand würde ein C-Programm als Skript bezeichnen. Bei Shells wie z. B. der Bourne- oder der Bash-Shell spricht man nahezu immer von Skripten und nicht von Programmen. Würde man von einem Bourne-Shell-Programm sprechen, so klingt das mindestens so falsch, als bezeichnete man ein Fahrrad als Moped. Worin der Unterschied zwischen einem Shell-Skript und einem Programm liegt, wird in Tabelle 3.1 auf der nächsten Seite gezeigt.
3.3Interpreter- oder CompilerspracheUnter einer Compilersprache versteht man eine Programmiersprache, deren Programme vor ihrer Ausführung vollständig in Maschinencode, also Binärcode, übersetzt werden. Dies kann leicht zu Verwechslungen führen, da manchmal auch die Sprache, in der ein Compiler geschrieben wird, als Compilersprache bezeichnet wird. Nehmen wir an, dass wir eine Programmiersprache XY1 hätten, für die es einen Compiler cXY gibt. Dann bezeichnet man XY als eine Compilersprache, weil sie mittels cXY in Maschinencode übersetzt wird. Wurde nun der Compiler2 cXY in der Programmiersprache C geschrieben, dann sagt man „C ist die Compilersprache von XY”.
Tabelle 3.1 Unterschiede zwischen Skripten und Programmen
Skripte
Programme
Ein Skript besteht typischerweise nur aus „wenigen” Zeilen Code, häufig weniger als 100 Zeilen.
Programme können sehr klein sein, also beispielsweise weniger als Hundert Zeilen Code, aber sie können auch aus mehreren Tausend oder gar Millionen Codezeilen bestehen.
Skripte werden unmittelbar ausgeführt. Sie werden nicht übersetzt (bzw. compiliert), sondern interpretiert.
Programme in Programmiersprachen wie C und C++ müssen immer in Maschinencode übersetzt werden, bevor sie ausgeführt werden können.
Bei einer Interpretersprache werden die Programme Befehl für Befehl interpretiert und ausgeführt.
Die Programmiersprachen C und C++ sind reine Compilersprachen, d.h. jedes Programm muss zuerst in Maschinencode übersetzt werden, bevor es ausgeführt werden kann. Sprachen wie Basic und VB werden interpretiert.
Man liest leider allzu häufig, dass es sich bei Python um eine interpretierte Sprache handelt. Dies ist nicht richtig. Aber bei Python handelt es sich auch nicht um eine Compilersprache im „klassischen” Sinne. Python-Programme werden sowohl übersetzt als auch interpretiert. Startet man ein Python-Programm, wird zuerst der Programmcode in Bytecode übersetzt. Bei Bytecode handelt es sich um Befehle für eine virtuelle Maschine. Bei Python spricht man von der PVM (Python Virtual Machine).3 Dieser Code ist unabhängig von realer Hardware, aber kommt dem Code von Maschinensprachen schon relativ nahe. Dieser Bytecode wird dann für einen bestimmten Maschinencode interpretiert. Das bedeutet, dass der Bytecode plattformunabhängig ist.
Bild 3.1Python: Compiler und Interpreter
Importiert man ein Python-Modul, so wird dieses nicht nur für diesen Lauf kompiliert, sondern auch dauerhaft gespeichert. Dadurch kann Python in einem späteren Lauf auf bereits compilierten Code zurückgreifen. Dies natürlich nur, falls sich der Quellcode des Moduls nicht verändert hat. Nun stellt sich die Frage, wo – also in welchem Verzeichnis – Python den Bytecode speichert. Sie werden in dem Verzeichnis, in dem sich Ihr Modul befindet, ein Verzeichnis __pycache__ finden. Innerhalb dieses Programms finden Sie dann die compilierten Module, die Sie an der Endung . pyc erkennen können.4
Es ist einfach, Obiges selbst zu testen. Dazu erzeugen wir eine Datei „beispiel.py” mit folgender Zeile als Inhalt:
Geben Sie dann im Python-Interpreter folgende Zeile ein:
In dem Unterverzeichnis __pycache__ befindet sich nun eine Datei beispiel.cpython-38.pyc.
1 Nach unserem Kenntnisstand gibt es keine Programmiersprache mit diesem Namen.
2 Beim Compiler handelt es sich auch um ein Programm.
3 Dieses Konzept entspricht der Vorgehensweise bei Java. Auch dort wird der Code zuerst in Bytecode übersetzt, d.h. Code für die JVM (Java Virtual Machine).
4 In den Python 2.x-Versionen wurden die compilierten Versionen im gleichen Verzeichnis wie die Module abgespeichert!