Entdecken Sie die Möglichkeiten von Python 3. Egal, ob Sie erst anfangen, mit Python zu arbeiten oder bei Ihrer Arbeit etwas nachschlagen möchten - in diesem Buch finden Sie alles, was Sie zu Python wissen müssen. Nach einer Einführung in die Sprache folgt eine umfassende Sprachreferenz, die Beschreibung der Standardbibliothek und ausführliche Informationen zu professionellen Themen. Dabei führen die Autoren auch in Tools wie PyPy, Numba oder pandas ein. Ob GUI-Programmierung, Webentwicklung oder Data Science: Dieses Buch macht den persönlichen Werkzeugkasten perfekt. Aus dem Inhalt: Sprachgrundlagen und objektorientierte Programmierung Einführung in Python Modularisierung Reguläre Ausdrücke Datums- und Zeitfunktionen Thread-Programmierung GUI-Programmierung Webentwicklung mit Django Migration von Python 2.x nach 3 Mathematische Module Schnittstellen zum Betriebssystem Netzwerkkommunikation Distribution von Python-Projekten Programmoptimierung Wissenschaftliches Rechnen Data Science Aus dem Lektorat Inhaltsverzeichnis 1 Einleitung 1.1 Warum haben wir dieses Buch geschrieben? 1.2 Was leistet dieses Buch? 1.3 Wie ist dieses Buch aufgebaut? 1.4 Wer sollte dieses Buch wie lesen? 1.5 Beispielprogramme 1.6 Vorwort zur siebten Auflage (2022) 1.7 Danksagung 2 Die Programmiersprache Python 2.1 Historie, Konzepte, Einsatzgebiete 2.1.1 Geschichte und Entstehung 2.1.2 Grundlegende Konzepte 2.1.3 Einsatzmöglichkeiten und Stärken 2.1.4 Einsatzbeispiele 2.2 Die Installation von Python 2.2.1 Installation von Anaconda unter Windows 2.2.2 Installation von Anaconda unter Linux 2.2.3 Installation von Anaconda unter macOS 2.3 Drittanbietermodule installieren 2.4 Die Verwendung von Python Teil I Einstieg in Python 3 Erste Schritte im interaktiven Modus 3.1 Ganze Zahlen 3.2 Gleitkommazahlen 3.3 Zeichenketten 3.4 Listen 3.5 Dictionarys 3.6 Variablen 3.6.1 Die besondere Bedeutung des Unterstrichs 3.6.2 Bezeichner 3.7 Logische Ausdrücke 3.8 Funktionen und Methoden 3.8.1 Funktionen 3.8.2 Methoden 3.9 Bildschirmausgaben 3.10 Module 4 Der Weg zum ersten Programm 4.1 Tippen, kompilieren, testen 4.1.1 Shebang 4.1.2 Interne Abläufe 4.2 Grundstruktur eines Python-Programms 4.2.1 Umbrechen langer Zeilen 4.2.2 Zusammenfügen mehrerer Zeilen 4.3 Das erste Programm 4.4 Kommentare 4.5 Der Fehlerfall 5 Kontrollstrukturen 5.1 Fallunterscheidungen 5.1.1 Die if-Anweisung 5.1.2 Bedingte Ausdrücke 5.2 Schleifen 5.2.1 Die while-Schleife 5.2.2 Abbruch einer Schleife 5.2.3 Erkennen eines Schleifenabbruchs 5.2.4 Abbruch eines Schleifendurchlaufs 5.2.5 Die for-Schleife 5.3 Die pass-Anweisung 5.4 Zuweisungsausdrücke 5.4.1 Motivation 5.4.2 Das Spiel Zahlenraten mit einem Zuweisungsausdruck 6 Dateien 6.1 Datenströme 6.2 Daten aus einer Datei auslesen 6.2.1 Eine Datei öffnen und schließen 6.2.2 Die with-Anweisung 6.2.3 Den Dateiinhalt auslesen 6.3 Daten in eine Datei schreiben 6.4 Das Dateiobjekt erzeugen 6.4.1 Die Built-in Function open 6.4.2 Attribute und Methoden eines Dateiobjekts 6.4.3 Die Schreib-/Leseposition verändern 7 Das Datenmodell 7.1 Die Struktur von Instanzen 7.1.1 Datentyp 7.1.2 Wert 7.1.3 Identität 7.2 Referenzen löschen 7.3 Mutable vs. immutable Datentypen 7.3.1 Mutable Datentypen und Seiteneffekte 8 Funktionen, Methoden und Attribute 8.1 Parameter von Funktionen und Methoden 8.1.1 Positionsbezogene Parameter 8.1.2 Schlüsselwortparameter 8.1.3 Optionale Parameter 8.1.4 Reine Schlüsselwortparameter 8.2 Attribute 9 Informationsquellen zu Python 9.1 Die Built-in Function help 9.2 Die Onlinedokumentation 9.3 PEPs Teil II Datentypen 10 Basisdatentypen: eine Übersicht 10.1 Das Nichts – NoneType 10.2 Operatoren 10.2.1 Bindigkeit 10.2.2 Auswertungsreihenfolge 10.2.3 Verkettung von Vergleichen 11 Numerische Datentypen 11.1 Arithmetische Operatoren 11.1.1 Erweiterte Zuweisungen 11.2 Vergleichende Operatoren 11.3 Konvertierung zwischen numerischen Datentypen 11.4 Ganzzahlen – int 11.4.1 Zahlensysteme 11.4.2 Bit-Operationen 11.4.3 Die Methode bit_length 11.5 Gleitkommazahlen – float 11.5.1 Exponentialschreibweise 11.5.2 Genauigkeit 11.5.3 Unendlich und Not a Number 11.6 Boolesche Werte – bool 11.6.1 Logische Operatoren 11.6.2 Wahrheitswerte nicht-boolescher Datentypen 11.6.3 Auswertung logischer Operatoren 11.7 Komplexe Zahlen – complex 12 Sequenzielle Datentypen 12.1 Der Unterschied zwischen Text und Binärdaten 12.2 Operationen auf Instanzen sequenzieller Datentypen 12.2.1 Auf Elemente prüfen 12.2.2 Verkettung 12.2.3 Wiederholung 12.2.4 Indizierung 12.2.5 Slicing 12.2.6 Länge einer Sequenz 12.2.7 Das kleinste und das größte Element 12.2.8 Ein Element suchen 12.2.9 Elemente zählen 12.3 Listen – list 12.3.1 Verändern eines Wertes innerhalb der Liste – Zuweisung mit [] 12.3.2 Ersetzen von Teillisten und Einfügen neuer Elemente – Zuweisung mit [] 12.3.3 Elemente und Teillisten löschen – del zusammen mit [] 12.3.4 Methoden von list-Instanzen 12.3.5 Listen sortieren - s.sort([key, reverse]) 12.3.6 Seiteneffekte 12.3.7 List Comprehensions 12.4 Unveränderliche Listen – tuple 12.4.1 Packing und Unpacking 12.4.2 Immutabel heißt nicht zwingend unveränderlich! 12.5 Strings – str, bytes, bytearray 12.5.1 Steuerzeichen 12.5.2 String-Methoden 12.5.3 Formatierung von Strings 12.5.4 Zeichensätze und Sonderzeichen 13 Zuordnungen und Mengen 13.1 Dictionary – dict 13.1.1 Erzeugen eines Dictionarys 13.1.2 Schlüssel und Werte 13.1.3 Iteration 13.1.4 Operatoren 13.1.5 Methoden 13.1.6 Dict Comprehensions 13.2 Mengen – set und frozenset 13.2.1 Erzeugen eines Sets 13.2.2 Iteration 13.2.3 Operatoren 13.2.4 Methoden 13.2.5 Veränderliche Mengen – set 13.2.6 Unveränderliche Mengen – frozenset 14 Collections 14.1 Verkettete Dictionarys 14.2 Zählen von Häufigkeiten 14.3 Dictionarys mit Standardwerten 14.4 Doppelt verkettete Listen 14.5 Benannte Tupel 15 Datum und Zeit 15.1 Elementare Zeitfunktionen – time 15.1.1 Der Datentyp struct_time 15.1.2 Konstanten 15.1.3 Funktionen 15.2 Objektorientierte Datumsverwaltung – datetime 15.2.1 datetime.date 15.2.2 datetime.time 15.2.3 datetime.datetime 15.2.4 datetime.timedelta 15.2.5 Operationen für datetime.datetime und datetime.date 15.3 Zeitzonen – zoneinfo 15.3.1 Die IANA-Zeitzonen-Datenbank 15.3.2 Zeitangaben in lokalen Zeitzonen 15.3.3 Rechnen mit Zeitangaben in lokalen Zeitzonen 16 Enumerationen und Flags 16.1 Aufzählungstypen – Enum 16.2 Aufzählungstypen für Bitmuster – Flag 16.3 Ganzzahlige Aufzählungstypen – IntEnum Teil III Fortgeschrittene Programmiertechniken 17 Funktionen 17.1 Definieren einer Funktion 17.2 Rückgabewerte 17.3 Funktionsobjekte 17.4 Optionale Parameter 17.5 Schlüsselwortparameter 17.6 Beliebige Anzahl von Parametern 17.7 Reine Schlüsselwortparameter 17.8 Reine Positionsparameter 17.9 Unpacking beim Funktionsaufruf 17.10 Seiteneffekte 17.11 Namensräume 17.11.1 Zugriff auf globale Variablen – global 17.11.2 Zugriff auf den globalen Namensraum 17.11.3 Lokale Funktionen 17.11.4 Zugriff auf übergeordnete Namensräume – nonlocal 17.11.5 Ungebundene lokale Variablen – eine Stolperfalle 17.12 Anonyme Funktionen 17.13 Rekursion 17.14 Eingebaute Funktionen 17.14.1 abs(x) 17.14.2 all(iterable) 17.14.3 any(iterable) 17.14.4 ascii(object) 17.14.5 bin(x) 17.14.6 bool([x]) 17.14.7 bytearray([source, encoding, errors]) 17.14.8 bytes([source, encoding, errors]) 17.14.9 chr(i) 17.14.10 complex([real, imag]) 17.14.11 dict([source]) 17.14.12 divmod(a, b) 17.14.13 enumerate(iterable[, start]) 17.14.14 eval(expression, [globals, locals]) 17.14.15 exec(object, [globals, locals]) 17.14.16 filter(function, iterable) 17.14.17 float([x]) 17.14.18 format(value, [format_spec]) 17.14.19 frozenset([iterable]) 17.14.20 globals() 17.14.21 hash(object) 17.14.22 help([object]) 17.14.23 hex(x) 17.14.24 id(object) 17.14.25 input([prompt]) 17.14.26 int([x, base]) 17.14.27 len(s) 17.14.28 list([sequence]) 17.14.29 locals() 17.14.30 map(function, [*iterable]) 17.14.31 max(iterable, {default, key}), max(arg1, arg2, [*args], {key}) 17.14.32 min(iterable, {default, key}), min(arg1, arg2, [*args], {key}) 17.14.33 oct(x) 17.14.34 ord(c) 17.14.35 pow(x, y, [z]) 17.14.36 print([*objects], {sep, end, file, flush}) 17.14.37 range([start], stop, [step]) 17.14.38 repr(object) 17.14.39 reversed(sequence) 17.14.40 round(x, [n]) 17.14.41 set([iterable]) 17.14.42 sorted(iterable, [key, reverse]) 17.14.43 str([object, encoding, errors]) 17.14.44 sum(iterable, [start]) 17.14.45 tuple([iterable]) 17.14.46 type(object) 17.14.47 zip([*iterables], {strict}) 18 Module und Pakete 18.1 Einbinden globaler Module 18.2 Lokale Module 18.2.1 Namenskonflikte 18.2.2 Modulinterne Referenzen 18.2.3 Module ausführen 18.3 Pakete 18.3.1 Importieren aller Module eines Pakets 18.3.2 Namespace Packages 18.3.3 Relative Importanweisungen 18.4 Das Paket importlib 18.4.1 Einbinden von Modulen und Paketen 18.4.2 Verändern des Importverhaltens 18.5 Geplante Sprachelemente 19 Objektorientierte Programmierung 19.1 Beispiel: Ein nicht objektorientiertes Konto 19.1.1 Ein neues Konto anlegen 19.1.2 Geld überweisen 19.1.3 Geld ein- und auszahlen 19.1.4 Den Kontostand anzeigen 19.2 Klassen 19.2.1 Definieren von Methoden 19.2.2 Der Konstruktor 19.2.3 Attribute 19.2.4 Beispiel: Ein objektorientiertes Konto 19.3 Vererbung 19.3.1 Ein einfaches Beispiel 19.3.2 Überschreiben von Methoden 19.3.3 Beispiel: Girokonto mit Tagesumsatz 19.3.4 Ausblick 19.4 Mehrfachvererbung 19.4.1 Mögliche Probleme der Mehrfachvererbung 19.5 Property-Attribute 19.5.1 Setter und Getter 19.5.2 Property-Attribute definieren 19.6 Statische Methoden 19.6.1 Statische Methoden definieren 19.7 Klassenmethoden 19.8 Klassenattribute 19.9 Built-in Functions für die objektorientierte Programmierung 19.9.1 Funktionen für die Verwaltung der Attribute einer Instanz 19.9.2 Funktionen für Informationen über die Klassenhierarchie 19.10 Erben von eingebauten Datentypen 19.11 Magic Methods und Magic Attributes 19.11.1 Allgemeine Magic Methods 19.11.2 Operatoren überladen 19.11.3 Datentypen emulieren – Duck-Typing 19.12 Datenklassen 19.12.1 Veränderliche Datenklassen 19.12.2 Unveränderliche Datenklassen 19.12.3 Defaultwerte in Datenklassen 20 Ausnahmebehandlung 20.1 Exceptions 20.1.1 Eingebaute Exceptions 20.1.2 Das Werfen einer Exception 20.1.3 Das Abfangen einer Exception 20.1.4 Eigene Exceptions 20.1.5 Erneutes Werfen einer Exception 20.1.6 Exception Chaining 20.2 Zusicherungen – assert 20.3 Warnungen 21 Generatoren und Iteratoren 21.1 Generatoren 21.1.1 Subgeneratoren 21.1.2 Generator Expressions 21.2 Iteratoren 21.2.1 Das Iteratorprotokoll 21.2.2 Beispiel: Die Fibonacci-Folge 21.2.3 Beispiel: Der Goldene Schnitt 21.2.4 Ein Generator zur Implementierung von __iter__ 21.2.5 Verwendung von Iteratoren 21.2.6 Mehrere Iteratoren für dieselbe Instanz 21.2.7 Nachteile von Iteratoren gegenüber dem direkten Zugriff über Indizes 21.2.8 Alternative Definition für iterierbare Objekte 21.2.9 Funktionsiteratoren 21.3 Spezielle Generatoren – itertools 21.3.1 accumulate(iterable, [func]) 21.3.2 chain([*iterables]) 21.3.3 combinations(iterable, r) 21.3.4 combinations_with_replacement(iterable, r) 21.3.5 compress(data, selectors) 21.3.6 count([start, step]) 21.3.7 cycle(iterable) 21.3.8 dropwhile(predicate, iterable) 21.3.9 filterfalse(predicate, iterable) 21.3.10 groupby(iterable, [key]) 21.3.11 islice(iterable, [start], stop, [step]) 21.3.12 permutations(iterable, [r]) 21.3.13 product([*iterables], [repeat]) 21.3.14 repeat(object, [times]) 21.3.15 starmap(function, iterable) 21.3.16 takewhile(predicate, iterable) 21.3.17 tee(iterable, [n]) 21.3.18 zip_longest([*iterables], {fillvalue}) 22 Kontext-Manager 22.1 Die with-Anweisung 22.2 Hilfsfunktionen für with-Kontexte – contextlib 22.2.1 Dynamisch zusammengestellte Kontext-Kombinationen – ExitStack 22.2.2 Bestimmte Exception-Typen unterdrücken 22.2.3 Den Standard-Ausgabestrom umleiten 22.2.4 Optionale Kontexte 22.2.5 Einfache Funktionen als Kontext-Manager 23 Dekoratoren 23.1 Funktionsdekoratoren 23.1.1 Das Dekorieren von Funktionen und Methoden 23.1.2 Name und Docstring nach Anwendung eines Dekorators 23.1.3 Verschachtelte Dekoratoren 23.1.4 Beispiel: Ein Cache-Dekorator 23.2 Klassendekoratoren 23.3 Das Modul functools 23.3.1 Funktionsschnittstellen vereinfachen 23.3.2 Methodenschnittstellen vereinfachen 23.3.3 Caches 23.3.4 Ordnungsrelationen vervollständigen 23.3.5 Überladen von Funktionen 24 Annotationen und statische Typprüfung 24.1 Annotationen 24.1.1 Die Annotation von Funktionen und Methoden 24.1.2 Die Annotation von Variablen und Attributen 24.1.3 Der Zugriff auf Annotationen zur Laufzeit 24.1.4 Wann werden Annotationen evaluiert? 24.2 Type Hints – das Modul typing 24.2.1 Gültige Type Hints 24.2.2 Containertypen 24.2.3 Abstrakte Containertypen 24.2.4 Typ-Aliasse 24.2.5 Type Unions und optionale Werte 24.2.6 Typvariablen 24.3 Statische Typprüfung in Python – mypy 24.3.1 Installation 24.3.2 Beispiel 25 Structural Pattern Matching 25.1 Die match-Anweisung 25.2 Arten von Mustern in der case-Anweisung 25.2.1 Literal- und Wertmuster 25.2.2 Oder-Muster 25.2.3 Muster mit Typprüfung 25.2.4 Bedingungen für Matches formulieren 25.2.5 Teilmuster gruppieren 25.2.6 Capture- und Wildcard-Muster 25.2.7 Sequenzmuster 25.2.8 Zuordnungsmuster 25.2.9 Muster für Objekte und ihre Attributwerte Teil IV Die Standardbibliothek 26 Mathematik 26.1 Mathematische Funktionen – math, cmath 26.1.1 Allgemeine mathematische Funktionen 26.1.2 Exponential- und Logarithmusfunktionen 26.1.3 Trigonometrische und hyperbolische Funktionen 26.1.4 Distanzen und Normen 26.1.5 Umrechnen von Winkeln 26.1.6 Darstellungsformen komplexer Zahlen 26.2 Zufallszahlengenerator – random 26.2.1 Den Status des Zufallszahlengenerators speichern und laden 26.2.2 Zufällige ganze Zahlen erzeugen 26.2.3 Zufällige Gleitkommazahlen erzeugen 26.2.4 Zufallsgesteuerte Operationen auf Sequenzen 26.2.5 SystemRandom([seed]) 26.3 Statistische Berechnungen – statistics 26.4 Intuitive Dezimalzahlen – decimal 26.4.1 Verwendung des Datentyps 26.4.2 Nichtnumerische Werte 26.4.3 Das Context-Objekt 26.5 Hash-Funktionen – hashlib 26.5.1 Verwendung des Moduls 26.5.2 Weitere Hash-Algorithmen 26.5.3 Vergleich großer Dateien 26.5.4 Passwörter 27 Bildschirmausgaben und Logging 27.1 Übersichtliche Ausgabe komplexer Objekte – pprint 27.2 Logdateien – logging 27.2.1 Das Meldungsformat anpassen 27.2.2 Logging-Handler 28 Reguläre Ausdrücke 28.1 Die Syntax regulärer Ausdrücke 28.1.1 Beliebige Zeichen 28.1.2 Zeichenklassen 28.1.3 Quantoren 28.1.4 Vordefinierte Zeichenklassen 28.1.5 Weitere Sonderzeichen 28.1.6 Genügsame Quantoren 28.1.7 Gruppen 28.1.8 Alternativen 28.1.9 Extensions 28.2 Verwendung des Moduls re 28.2.1 Searching 28.2.2 Matching 28.2.3 Einen String aufspalten 28.2.4 Teile eines Strings ersetzen 28.2.5 Problematische Zeichen ersetzen 28.2.6 Einen regulären Ausdruck kompilieren 28.2.7 Flags 28.2.8 Das Match-Objekt 28.3 Ein einfaches Beispielprogramm – Searching 28.4 Ein komplexeres Beispielprogramm – Matching 28.5 Kommentare in regulären Ausdrücken 29 Schnittstellen zum Betriebssystem und zur Laufzeitumgebung 29.1 Funktionen des Betriebssystems – os 29.1.1 environ 29.1.2 getpid() 29.1.3 cpu_count() 29.1.4 system(cmd) 29.1.5 popen(command, [mode, buffering]) 29.2 Zugriff auf die Laufzeitumgebung – sys 29.2.1 Kommandozeilenparameter 29.2.2 Standardpfade 29.2.3 Standard-Ein-/Ausgabeströme 29.2.4 Das Programm beenden 29.2.5 Details zur Python-Version 29.2.6 Details zum Betriebssystem 29.2.7 Hooks 29.3 Kommandozeilenparameter – argparse 29.3.1 Taschenrechner – ein einfaches Beispiel 29.3.2 Ein komplexeres Beispiel 30 Das Dateisystem 30.1 Zugriff auf das Dateisystem mit os 30.2 Dateipfade – os.path 30.3 Zugriff auf das Dateisystem – shutil 30.3.1 Verzeichnis- und Dateioperationen 30.3.2 Archivoperationen 30.4 Temporäre Dateien – tempfile 31 Parallele Programmierung 31.1 Prozesse, Multitasking und Threads 31.1.1 Die Leichtgewichte unter den Prozessen – Threads 31.1.2 Threads oder Prozesse? 31.1.3 Kooperatives Multitasking – ein dritter Weg 31.2 Pythons Schnittstellen zur Parallelisierung 31.3 Die abstrakte Schnittstelle – concurrent.futures 31.3.1 Ein Beispiel mit einem futures.ThreadPoolExecutor 31.3.2 Executor-Instanzen als Kontext-Manager 31.3.3 Die Verwendung von futures.ProcessPoolExecutor 31.3.4 Die Verwaltung der Aufgaben eines Executors 31.4 Die flexible Schnittstelle – threading und multiprocessing 31.4.1 Threads in Python – threading 31.4.2 Prozesse in Python – multiprocessing 31.5 Die kooperative Schnittstelle – asyncio 31.5.1 Kooperative Funktionen – Koroutinen 31.5.2 Erwartbare Objekte 31.5.3 Die Kooperation von Koroutinen – Tasks 31.5.4 Ein kooperativer Webcrawler 31.5.5 Blockierende Operationen in Koroutinen 31.5.6 Weitere asynchrone Sprachmerkmale 31.6 Fazit: Welche Schnittstelle ist die richtige? 32 Datenspeicherung 32.1 XML 32.1.1 ElementTree 32.1.2 SAX – Simple API for XML 32.2 Datenbanken 32.2.1 Pythons eingebaute Datenbank – sqlite3 32.3 Komprimierte Dateien und Archive 32.3.1 gzip.open(filename, [mode, compressleve]) 32.3.2 Andere Module für den Zugriff auf komprimierte Daten 32.4 Serialisierung von Instanzen – pickle 32.4.1 Funktionale Schnittstelle 32.4.2 Objektorientierte Schnittstelle 32.5 Das Datenaustauschformat JSON – json 32.6 Das Tabellenformat CSV – csv 32.6.1 reader-Objekte – Daten aus einer CSV-Datei lesen 32.6.2 Dialect-Objekte – eigene Dialekte verwenden 33 Netzwerkkommunikation 33.1 Die Socket API 33.1.1 Client-Server-Systeme 33.1.2 UDP 33.1.3 TCP 33.1.4 Blockierende und nichtblockierende Sockets 33.1.5 Erzeugen eines Sockets 33.1.6 Die Socket-Klasse 33.1.7 Netzwerk-Byte-Order 33.1.8 Multiplexende Server – selectors 33.1.9 Objektorientierte Serverentwicklung – socketserver 33.2 XML-RPC 33.2.1 Der Server 33.2.2 Der Client 33.2.3 Multicall 33.2.4 Einschränkungen 34 Zugriff auf Ressourcen im Internet 34.1 Protokolle 34.1.1 Hypertext Transfer Protocol – HTTP 34.1.2 File Transfer Protocol – FTP 34.2 Lösungen 34.2.1 Veraltete Lösungen für Python 2 34.2.2 Lösungen der Standardbibliothek 34.2.3 Lösungen von Drittanbietern 34.3 Der einfache Weg – requests 34.3.1 Einfache Anfragen via GET und POST 34.3.2 Web-APIs 34.4 URLs – urllib 34.4.1 Zugriff auf entfernte Ressourcen – urllib.request 34.4.2 Das Einlesen und Verarbeiten von URLs – urllib.parse 34.5 FTP – ftplib 34.5.1 Mit einem FTP-Server verbinden 34.5.2 FTP-Kommandos ausführen 34.5.3 Mit Dateien und Verzeichnissen arbeiten 34.5.4 Übertragen von Dateien 35 E-Mail 35.1 SMTP – smtplib 35.1.1 SMTP([host, port, local_hostname, timeout, source_address]) 35.1.2 Eine Verbindung aufbauen und beenden 35.1.3 Eine E-Mail versenden 35.1.4 Beispiel 35.2 POP3 – poplib 35.2.1 POP3(host, [port, timeout]) 35.2.2 Eine Verbindung aufbauen und beenden 35.2.3 Vorhandene E-Mails auflisten 35.2.4 E-Mails abrufen und löschen 35.2.5 Beispiel 35.3 IMAP4 – imaplib 35.3.1 IMAP4([host, port, timeout]) 35.3.2 Eine Verbindung aufbauen und beenden 35.3.3 Eine Mailbox suchen und auswählen 35.3.4 Operationen mit Mailboxen 35.3.5 E-Mails suchen 35.3.6 E-Mails abrufen 35.3.7 Beispiel 35.4 Erstellen komplexer E-Mails – email 35.4.1 Eine einfache E-Mail erstellen 35.4.2 Eine E-Mail mit Anhängen erstellen 35.4.3 Eine E-Mail einlesen 36 Debugging und Qualitätssicherung 36.1 Der Debugger 36.2 Automatisiertes Testen 36.2.1 Testfälle in Docstrings – doctest 36.2.2 Unit Tests – unittest 36.3 Analyse des Laufzeitverhaltens 36.3.1 Laufzeitmessung – timeit 36.3.2 Profiling – cProfile 36.3.3 Tracing – trace 37 Dokumentation 37.1 Docstrings 37.2 Automatisches Erstellen einer Dokumentation – pydoc Teil V Weiterführende Themen 38 Distribution von Python-Projekten 38.1 Eine Geschichte der Distributionen in Python 38.1.1 Der klassische Ansatz – distutils 38.1.2 Der neue Standard – setuptools 38.1.3 Der Paketindex – PyPI 38.2 Erstellen von Distributionen – setuptools 38.2.1 Installation 38.2.2 Schreiben des Moduls 38.2.3 Das Installationsskript 38.2.4 Erstellen einer Quellcodedistribution 38.2.5 Erstellen einer Binärdistribution 38.2.6 Distributionen installieren 38.3 Erstellen von EXE-Dateien – cx_Freeze 38.4 Paketmanager 38.4.1 Der Python-Paketmanager – pip 38.4.2 Der Paketmanager conda 38.5 Lokalisierung von Programmen – gettext 38.5.1 Beispiel für die Verwendung von gettext 38.5.2 Erstellen des Sprachkompilats 39 Virtuelle Umgebungen 39.1 Das Arbeiten mit virtuellen Umgebungen – venv 39.1.1 Eine virtuelle Umgebung aktivieren 39.1.2 In einer virtuellen Umgebung arbeiten 39.1.3 Eine virtuelle Umgebung deaktivieren 39.2 Virtuelle Umgebungen in Anaconda 40 Alternative Interpreter und Compiler 40.1 Just-in-Time-Kompilierung – PyPy 40.1.1 Installation und Verwendung 40.1.2 Beispiel 40.2 Numba 40.2.1 Installation 40.2.2 Beispiel 40.3 Anbindung an C und C++ – Cython 40.3.1 Installation 40.3.2 Die Funktionsweise von Cython 40.3.3 Ein Cython-Programm kompilieren 40.3.4 Ein Cython-Programm mit statischer Typisierung 40.3.5 Eine C-Bibliothek verwenden 40.4 Die interaktive Python-Shell – IPython 40.4.1 Installation 40.4.2 Die interaktive Shell 40.4.3 Das Jupyter Notebook 41 Grafische Benutzeroberflächen 41.1 Toolkits 41.1.1 Tkinter (Tk) 41.1.2 PyGObject (Gtk) 41.1.3 Qt for Python (Qt) 41.1.4 wxPython (wxWidgets) 41.2 Einführung in tkinter 41.2.1 Ein einfaches Beispiel 41.2.2 Steuerelementvariablen 41.2.3 Der Packer 41.2.4 Events 41.2.5 Steuerelemente 41.2.6 Zeichnungen – das Canvas-Widget 41.2.7 Weitere Module 41.3 Einführung in PySide6 41.3.1 Installation 41.3.2 Grundlegende Konzepte von Qt 41.3.3 Der Entwicklungsprozess 41.4 Signale und Slots 41.5 Wichtige Widgets 41.5.1 QCheckBox 41.5.2 QComboBox 41.5.3 QDateEdit, QtimeEdit und QDateTimeEdit 41.5.4 QDialog 41.5.5 QLineEdit 41.5.6 QlistWidget und QListView 41.5.7 QProgressBar 41.5.8 QPushButton 41.5.9 QRadioButton 41.5.10 QSlider und QDial 41.5.11 QTextEdit 41.5.12 QWidget 41.6 Die Zeichenfunktionalität von Qt 41.6.1 Werkzeuge 41.6.2 Das Koordinatensystem 41.6.3 Einfache Formen 41.6.4 Grafiken 41.6.5 Text 41.6.6 Eye Candy 41.7 Die Model-View-Architektur 41.7.1 Beispielprojekt: ein Adressbuch 41.7.2 Auswählen von Einträgen 41.7.3 Bearbeiten von Einträgen 42 Python als serverseitige Programmiersprache im WWW – ein Einstieg in Django 42.1 Konzepte und Besonderheiten von Django 42.2 Installation von Django 42.3 Ein neues Django-Projekt erstellen 42.3.1 Der Entwicklungswebserver 42.3.2 Konfiguration des Projekts 42.4 Eine Applikation erstellen 42.4.1 Die Applikation in das Projekt einbinden 42.4.2 Ein Model definieren 42.4.3 Beziehungen zwischen Modellen 42.4.4 Übertragung des Modells in die Datenbank 42.4.5 Die Model-API 42.4.6 Unser Projekt bekommt ein Gesicht 42.4.7 Djangos Template-System 42.4.8 Verarbeitung von Formulardaten 42.4.9 Djangos Administrationsoberfläche 43 Wissenschaftliches Rechnen und Data Science 43.1 Installation 43.2 Das Modellprogramm 43.2.1 Der Import von numpy, scipy und matplotlib 43.2.2 Vektorisierung und der Datentyp numpy.ndarray 43.2.3 Visualisieren von Daten mit matplotlib.pyplot 43.3 Überblick über die Module numpy und scipy 43.3.1 Überblick über den Datentyp numpy.ndarray 43.3.2 Überblick über scipy 43.4 Eine Einführung in die Datenanalyse mit pandas 43.4.1 Das DataFrame-Objekt 43.4.2 Selektiver Datenzugriff 43.4.3 Löschen von Zeilen und Spalten 43.4.4 Einfügen von Zeilen und Spalten 43.4.5 Logische Ausdrücke auf Datensätzen 43.4.6 Manipulation von Datensätzen 43.4.7 Ein- und Ausgabe 43.4.8 Visualisierung 44 Insiderwissen 44.1 URLs im Standardbrowser öffnen – webbrowser 44.2 Interpretieren von Binärdaten – struct 44.3 Versteckte Passworteingabe – getpass 44.4 Kommandozeilen-Interpreter – cmd 44.5 Dateiinterface für Strings – io.StringIO 44.6 Generatoren als Konsumenten 44.6.1 Ein Decorator für konsumierende Generatorfunktionen 44.6.2 Auslösen von Exceptions in einem Generator 44.6.3 Eine Pipeline als Verkettung konsumierender Generatorfunktionen 44.7 Kopieren von Instanzen – copy 44.8 Bildverarbeitung – Pillow 44.8.1 Installation 44.8.2 Bilddateien laden und speichern 44.8.3 Zugriff auf einzelne Pixel 44.8.4 Manipulation von Bildern 44.8.5 Interoperabilität 45 Von Python 2 nach Python 3 45.1 Die wichtigsten Unterschiede 45.1.1 Ein-/Ausgabe 45.1.2 Iteratoren 45.1.3 Strings 45.1.4 Ganze Zahlen 45.1.5 Exception Handling 45.1.6 Standardbibliothek 45.2 Automatische Konvertierung A Anhang A.1 Reservierte Wörter A.2 Operatorrangfolge A.3 Eingebaute Funktionen A.4 Eingebaute Exceptions A.5 Python-IDEs A.5.1 PyCharm A.5.2 Visual Studio Code A.5.3 PyDev A.5.4 Spyder Stichwortverzeichnis Rechtliche Hinweise Über das Autorenteam