0% fanden dieses Dokument nützlich (0 Abstimmungen)
845 Ansichten1.073 Seiten

Python Language de

Das Dokument behandelt die Python-Programmiersprache und beschreibt verschiedene Themen wie Erste Schritte, Datentypen, Module, Arrays und Asyncio. Es enthält viele Beispiele und Informationen zu den Grundlagen und fortgeschrittenen Konzepten von Python.

Hochgeladen von

Hoschang Mirsa
Copyright
© © All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen
0% fanden dieses Dokument nützlich (0 Abstimmungen)
845 Ansichten1.073 Seiten

Python Language de

Das Dokument behandelt die Python-Programmiersprache und beschreibt verschiedene Themen wie Erste Schritte, Datentypen, Module, Arrays und Asyncio. Es enthält viele Beispiele und Informationen zu den Grundlagen und fortgeschrittenen Konzepten von Python.

Hochgeladen von

Hoschang Mirsa
Copyright
© © All Rights Reserved
Wir nehmen die Rechte an Inhalten ernst. Wenn Sie vermuten, dass dies Ihr Inhalt ist, beanspruchen Sie ihn hier.
Verfügbare Formate
Als PDF, TXT herunterladen oder online auf Scribd lesen
Sie sind auf Seite 1/ 1073

Python Language

#python
Inhaltsverzeichnis
Über 1

Kapitel 1: Erste Schritte mit Python Language 2

Bemerkungen 2

Versionen 3

Python 3.x 3

Python 2.x 3

Examples 4

Fertig machen 4

Überprüfen Sie, ob Python installiert ist 4

Hallo, World in Python mit IDLE 5

Hallo Welt Python-Datei 5

Starten Sie eine interaktive Python-Shell 6

Andere Online-Shells 7

Befehle als String ausführen 8

Muscheln und jenseits 8

Variablen anlegen und Werte zuweisen 9

Benutzereingabe 13

IDLE - Python-GUI 14

Fehlerbehebung 15

Datentypen 15

Eingebaute Typen 15

Booleaner 16

Zahlen 16

Zeichenketten 17

Sequenzen und Sammlungen 17

Eingebaute Konstanten 18

Testen des Variablentyps 18

Konvertierung zwischen Datentypen 19

Expliziter Zeichenfolgentyp bei der Definition von Literalen 19


Veränderliche und unveränderliche Datentypen 20

Eingebaute Module und Funktionen 21

Einrückung blockieren 25

Leerzeichen vs. Tabs 26

Auflistungsarten 27

Hilfsprogramm 31

Ein Modul erstellen 33

String-Funktion - str () und repr () 34

repr () 34

str () 34

Installation externer Module mit pip 35

Paket suchen / installieren 35

Installierte Pakete aktualisieren 36

Pip aufrüsten 36

Installation von Python 2.7.x und 3.x 36

Kapitel 2: * args und ** kwargs 40

Bemerkungen 40

h11 40

h12 40

h13 40

Examples 41

Verwenden von * args beim Schreiben von Funktionen 41

Verwenden von ** Warnungen beim Schreiben von Funktionen 41

Verwendung von * args beim Aufruf von Funktionen 42

Verwenden von ** Warnungen beim Aufruf von Funktionen 43

Verwendung von * args beim Aufruf von Funktionen 43

Nur für Schlüsselwörter und für Schlüsselwörter erforderliche Argumente 44

Kwarg-Werte mit einem Wörterbuch füllen 44

** Warnungen und Standardwerte 44

Kapitel 3: 2to3 Werkzeug 45

Syntax 45
Parameter 45

Bemerkungen 46

Examples 46

Grundlegende Verwendung 46

Unix 46

Windows 46

Unix 47

Windows 47

Kapitel 4: Abstrakte Basisklassen (abc) 48

Examples 48

Einstellen der ABCMeta-Metaklasse 48

Warum / Wie werden ABCMeta und @abstractmethod verwendet? 49

Kapitel 5: Abstrakter Syntaxbaum 51

Examples 51

Analysieren Sie Funktionen in einem Python-Skript 51

Kapitel 6: Ähnlichkeiten in der Syntax, Bedeutungsunterschiede: Python vs. JavaScript 53

Einführung 53

Examples 53

`in` mit Listen 53

Kapitel 7: Alternativen zum Wechseln von Anweisungen aus anderen Sprachen 54

Bemerkungen 54

Examples 54

Verwenden Sie das, was die Sprache bietet: das if / else-Konstrukt. 54

Benutze ein Diktat von Funktionen 55

Verwenden Sie die Klassenprüfung 55

Verwenden eines Kontextmanagers 56

Kapitel 8: ArcPy 58

Bemerkungen 58

Examples 58

Der Wert eines Feldes für alle Zeilen der Feature-Class in der File-Geodatabase mit dem Su 58

createDissolvedGDB zum Erstellen einer Datei gdb im Arbeitsbereich 58


Kapitel 9: Arrays 59

Einführung 59

Parameter 59

Examples 59

Grundlegende Einführung in Arrays 59

Zugriff auf einzelne Elemente über Indizes 60

Hängen Sie mithilfe der append () -Methode einen beliebigen Wert an das Array an 61

Fügen Sie mit der Methode insert () einen Wert in ein Array ein 61

Erweitern Sie das Python-Array mit der extend () -Methode 61

Fügen Sie mithilfe der fromlist () -Methode Elemente aus der Liste in das Array ein 61

Entfernen Sie ein Arrayelement mit der remove () - Methode 62

Entferne das letzte Array-Element mit der pop () -Methode 62

Rufen Sie mit Hilfe der index () -Methode jedes Element über seinen Index ab 62

Umkehren eines Python-Arrays mithilfe der reverse () -Methode 62

Abrufen von Array-Pufferinformationen über die buffer_info () -Methode 62

Überprüfen Sie die Anzahl der Vorkommen eines Elements mithilfe der Methode count () 63

Konvertieren Sie das Array mithilfe der tostring () -Methode in einen String 63

Konvertieren Sie das Array mithilfe der tolist () -Methode in eine Python-Liste mit densel 63

Hängen Sie einen String mit der fromstring () -Methode an das Char-Array an 63

Kapitel 10: Asyncio-Modul 64

Examples 64

Coroutine und Delegation Syntax 64

Asynchrone Executoren 65

UVLoop verwenden 66

Synchronisationsprimitiv: Ereignis 66

Konzept 66

Beispiel 67

Ein einfacher Websocket 67

Häufiges Missverständnis über Asyncio 68

Kapitel 11: Attribut-Zugriff 70

Syntax 70

Examples 70
Grundlegender Attributzugriff mit der Punktnotation 70

Setter, Getter & Eigenschaften 70

Kapitel 12: Audio 73

Examples 73

Audio mit Pyglet 73

Mit WAV-Dateien arbeiten 73

gewinnt 73

Welle 73

Konvertieren Sie eine beliebige Sounddatei mit Python und ffmpeg 74

Die Windows-Pieptöne werden abgespielt 74

Kapitel 13: Ausnahmen 75

Einführung 75

Syntax 75

Examples 75

Ausnahmen aufwerfen 75

Ausnahmen fangen 75

Ausführen von Bereinigungscode mit 76

Ausnahmen erneut erhöhen 76

Kettenausnahmen mit Raise from 77

Ausnahmehierarchie 77

Ausnahmen sind auch Objekte 80

Benutzerdefinierte Ausnahmetypen erstellen 80

Fangen Sie nicht alles! 81

Mehrere Ausnahmen abfangen 82

Praktische Beispiele für die Behandlung von Ausnahmen 82

Benutzereingabe 82

Wörterbücher 83

Sonst 83

Kapitel 14: Bedienmodul 85

Examples 85

Operatoren als Alternative zu einem Infix-Operator 85

Methodenaufruf 85
Itemgetter 85

Kapitel 15: Befehlszeilenargumente analysieren 87

Einführung 87

Examples 87

Hallo Welt in Schwierigkeiten 87

Grundlegendes Beispiel mit docopt 88

Setzen Sie sich gegenseitig ausschließende Argumente mit argparse 88

Befehlszeilenargumente mit argv verwenden 89

Benutzerdefinierte Parser-Fehlernachricht mit Argumenten 90

Konzeptionelle Gruppierung von Argumenten mit argparse.add_argument_group () 90

Erweitertes Beispiel mit docopt und docopt_dispatch 92

Kapitel 16: Benutzerdefinierte Fehler / Ausnahmen auslösen 93

Einführung 93

Examples 93

Benutzerdefinierte Ausnahme 93

Fange eine benutzerdefinierte Ausnahme 93

Kapitel 17: Benutzerdefinierte Methoden 95

Examples 95

Benutzerdefinierte Methodenobjekte erstellen 95

Schildkröte zum Beispiel 96

Kapitel 18: Binärdaten 97

Syntax 97

Examples 97

Formatieren Sie eine Liste von Werten in ein Byteobjekt 97

Entpacken Sie ein Byte-Objekt gemäß einer Formatzeichenfolge 97

Struktur verpacken 97

Kapitel 19: Bitweise Operatoren 99

Einführung 99

Syntax 99

Examples 99

Bitweises AND 99

Bitweises ODER 99
Bitweises XOR (exklusives ODER) 100

Bitweise Linksverschiebung 100

Bitweise Rechtsverschiebung 101

Bitweises NICHT 101

Inplace-Operationen 103

Kapitel 20: Boolesche Operatoren 104

Examples 104

und 104

oder 104

nicht 105

Kurzschlussauswertung 105

"und" und "oder" geben nicht garantiert einen Boolean zurück 106

Ein einfaches Beispiel 106

Kapitel 21: ChemPy - Python-Paket 107

Einführung 107

Examples 107

Analysieren von Formeln 107

Ausgleichende Stöchiometrie einer chemischen Reaktion 107

Ausgleichende Reaktionen 107

Chemische Gleichgewichte 108

Ionenstärke 108

Chemische Kinetik (System gewöhnlicher Differentialgleichungen) 108

Kapitel 22: CLI-Unterbefehle mit präziser Hilfeausgabe 110

Einführung 110

Bemerkungen 110

Examples 110

Nativer Weg (keine Bibliotheken) 110

argparse (Standard-Hilfeformatierer) 111

argparse (benutzerdefinierte Formatierungshilfe) 112

Kapitel 23: Codeblöcke, Ausführungsrahmen und Namespaces 114

Einführung 114

Examples 114
Codeblock-Namespaces 114

Kapitel 24: Commonwealth-Ausnahmen 115

Einführung 115

Examples 115

Einrückungsfehler (oder EinzugssyntaxErrors) 115

IndentationError / SyntaxError: unerwarteter Einzug 115

Beispiel 115

IndentationError / SyntaxError: unindent passt zu keiner äußeren Einrückungsebene 116

Beispiel 116

IndentationError: Ein eingerückter Block wurde erwartet 116

Beispiel 116

IndentationError: Inkonsistente Verwendung von Tabulatoren und Leerzeichen beim Einzug 116

Beispiel 117

So vermeiden Sie diesen Fehler 117

TypeErrors 117

TypeError: [Definition / Methode] dauert? Positionsargumente aber? wurde gegeben 117

Beispiel 117

TypeError: nicht unterstützte Operandentypen für [Operand]: '???' und '???' 118

Beispiel 118

TypeError: '???' Objekt ist nicht iterierbar / subskribierbar: 118

Beispiel 119

TypeError: '???' Objekt ist nicht aufrufbar 119

Beispiel 119

NameFehler: Name "???" ist nicht definiert 119

Es ist einfach nirgendwo im Code definiert 119

Vielleicht ist es später definiert: 120

Oder es wurde nicht import : 120

Python-Bereiche und die LEGB-Regel: 120

Andere Fehler 120

AssertError 120

KeyboardInterrupt 121
ZeroDivisionError 121

Syntaxfehler bei gutem Code 122

Kapitel 25: Conditionals 123

Einführung 123

Syntax 123

Examples 123

wenn, elif und sonst 123

Bedingter Ausdruck (oder "Der ternäre Operator") 123

Wenn Aussage 124

Else Aussage 124

Boolesche Logikausdrücke 125

Und Betreiber 125

Oder Betreiber 125

Faule Auswertung 125

Testen auf mehrere Bedingungen 126

Wahrheitswerte 127

Verwenden der Funktion cmp zum Abrufen des Vergleichsergebnisses zweier Objekte 127

Bedingte Ausdrucksauswertung mit List Comprehensions 128

Testen Sie, ob ein Objekt Keine ist, und weisen Sie es zu 129

Kapitel 26: configparser 130

Einführung 130

Syntax 130

Bemerkungen 130

Examples 130

Grundlegende Verwendung 130

Konfigurationsdatei programmatisch erstellen 131

Kapitel 27: CSV lesen und schreiben 132

Examples 132

TSV-Datei schreiben 132

Python 132

Ausgabedatei 132
Pandas benutzen 132

Kapitel 28: ctypes 133

Einführung 133

Examples 133

Grundlegende Verwendung 133

Häufige Fehler 133

Laden einer Datei fehlgeschlagen 133

Fehler beim Zugriff auf eine Funktion 134

Basisobjekt für ctypes 134

ctypes Arrays 135

Wrapping-Funktionen für ctypes 136

Komplexe Verwendung 136

Kapitel 29: Das base64-Modul 138

Einführung 138

Syntax 138

Parameter 138

Bemerkungen 140

Examples 140

Codierung und Decodierung von Base64 140

Codierung und Decodierung von Base32 142

Codierung und Decodierung von Base16 142

Kodierung und Dekodierung von ASCII85 143

Codierung und Decodierung von Base85 144

Kapitel 30: Das dis-Modul 145

Examples 145

Konstanten im dis-Modul 145

Was ist Python-Bytecode? 145

Module demontieren 146

Kapitel 31: Das Ländereinstellungsmodul 147

Bemerkungen 147

Examples 147
Währungsformatierung in US-Dollar mit dem Gebietsschema-Modul 147

Kapitel 32: Das os-Modul 148

Einführung 148

Syntax 148

Parameter 148

Examples 148

Erstellen Sie ein Verzeichnis 148

Aktuelles Verzeichnis abrufen 148

Bestimmen Sie den Namen des Betriebssystems 148

Ein Verzeichnis entfernen 149

Einem Symlink folgen (POSIX) 149

Ändern Sie die Berechtigungen für eine Datei 149

Makedirs - rekursive Verzeichniserstellung 149

Kapitel 33: Dateien entpacken 151

Einführung 151

Examples 151

Verwenden Sie Python ZipFile.extractall (), um eine ZIP-Datei zu dekomprimieren 151

Verwenden von Python TarFile.extractall () zum Dekomprimieren eines Tarballs 151

Kapitel 34: Dateien und Ordner E / A 152

Einführung 152

Syntax 152

Parameter 152

Bemerkungen 152

Vermeiden Sie das plattformübergreifende Encoding Hell 152

Examples 153

Dateimodi 153

Zeile für Zeile eine Datei lesen 155

Den vollständigen Inhalt einer Datei abrufen 155

In eine Datei schreiben 156

Inhalte einer Datei in eine andere Datei kopieren 157

Prüfen Sie, ob eine Datei oder ein Pfad vorhanden ist 157

Kopieren Sie eine Verzeichnisstruktur 158


Dateien iterieren (rekursiv) 158

Lesen Sie eine Datei zwischen einem Zeilenbereich 159

Zufälliger Dateizugriff mit mmap 159

Ersetzen von Text in einer Datei 160

Prüfen, ob eine Datei leer ist 160

Kapitel 35: Daten kopieren 161

Examples 161

Durchführen einer flachen Kopie 161

Durchführen einer tiefen Kopie 161

Durchführen einer flachen Kopie einer Liste 161

Wörterbuch kopieren 161

Ein Set kopieren 162

Kapitel 36: Datenbankzugriff 163

Bemerkungen 163

Examples 163

Zugriff auf MySQL-Datenbank mit MySQLdb 163

SQLite 164

Die SQLite-Syntax: Eine eingehende Analyse 165

Fertig machen 165

h21 165

Wichtige Eigenschaften und Funktionen der Connection 166

Wichtige Funktionen des Cursor 167

SQLite- und Python-Datentypen 170

PostgreSQL-Datenbankzugriff mit psycopg2 170

Herstellen einer Verbindung zur Datenbank und Erstellen einer Tabelle 170

Daten in die Tabelle einfügen: 171

Tabellendaten abrufen: 171

Oracle-Datenbank 171

Verbindung 173

Sqlalchemy verwenden 174

Kapitel 37: Datenserialisierung 175

Syntax 175
Parameter 175

Bemerkungen 175

Examples 176

Serialisierung mit JSON 176

Serialisierung mit Pickle 176

Kapitel 38: Datenserialisierung von Pickles 178

Syntax 178

Parameter 178

Bemerkungen 178

Pickleable Typen 178

pickle und Sicherheit 178

Examples 179

Verwenden von Pickle zum Serialisieren und Deserialisieren eines Objekts 179

Das Objekt wird serialisiert 179

Das Objekt deserialisieren 179

Pickle- und Byte-Objekte verwenden 179

Angepasste Daten anpassen 180

Kapitel 39: Datenvisualisierung mit Python 182

Examples 182

Matplotlib 182

Seaborn 183

MayaVI 186

Plotly 187

Kapitel 40: Datum und Uhrzeit 190

Bemerkungen 190

Examples 190

Parsen einer Zeichenfolge in ein Zeitzonenobjekt mit Zeitzone 190

Einfache Datumsberechnung 190

Grundlegende Verwendung von datetime-Objekten 191

Iteriere über Termine 191

Analysieren einer Zeichenfolge mit einem kurzen Zeitzonennamen in ein Zeitzonenobjekt mit 192
Zeitzonenbasierte Datenzeiten erstellen 193

Fuzzy-Datetime-Analyse (Extrahieren von Datetime aus einem Text) 195

Zwischen Zeitzonen wechseln 195

Parsen eines beliebigen ISO 8601-Zeitstempels mit minimalen Bibliotheken 196

Zeitstempel in Datumszeit konvertieren 196

Monate genau von einem Datum abziehen 197

Zeitunterschiede berechnen 197

Erhalten Sie einen Zeitstempel nach ISO 8601 198

Ohne Zeitzone mit Mikrosekunden 198

Mit Zeitzone, mit Mikrosekunden 198

Mit Zeitzone, ohne Mikrosekunden 198

Kapitel 41: Datumsformatierung 199

Examples 199

Zeit zwischen zwei Datumszeiten 199

Zeichenfolge in ein datetime-Objekt analysieren 199

Ausgeben des datetime-Objekts in eine Zeichenfolge 199

Kapitel 42: Debuggen 200

Examples 200

Der Python-Debugger: Schrittweises Debuggen mit _pdb_ 200

Über IPython und ipdb 202

Remote-Debugger 202

Kapitel 43: Dekorateure 204

Einführung 204

Syntax 204

Parameter 204

Examples 204

Dekorateurfunktion 204

Dekorateur Klasse 205

Dekorationsmethoden 206

Warnung! 207

Einen Dekorateur wie eine dekorierte Funktion aussehen lassen 207


Als eine Funktion 208

Als eine Klasse 208

Dekorateur mit Argumenten (Dekorateurfabrik) 208

Dekorateurfunktionen 208

Wichtige Notiz: 209

Dekorateur Klassen 209

Erstellen Sie eine Einzelklasse mit einem Dekorateur 209

Verwenden eines Dekorators, um eine Funktion festzulegen 210

Kapitel 44: Deque-Modul 211

Syntax 211

Parameter 211

Bemerkungen 211

Examples 211

Basic Deque mit 211

Begrenzung der Deque-Größe 212

Verfügbare Methoden in deque 212

Breite erste Suche 213

Kapitel 45: Der Dolmetscher (Befehlszeilenkonsole) 214

Examples 214

Allgemeine Hilfe anfordern 214

Bezugnehmend auf den letzten Ausdruck 214

Öffnen der Python-Konsole 215

Die PYTHONSTARTUP-Variable 215

Kommandozeilenargumente 215

Hilfe zu einem Objekt erhalten 216

Kapitel 46: Designmuster 218

Einführung 218

Examples 218

Strategiemuster 218

Einführung in Design Patterns und Singleton Pattern 219

Proxy 221
Kapitel 47: Deskriptor 224

Examples 224

Einfacher Deskriptor 224

Zwei-Wege-Konvertierungen 225

Kapitel 48: Die Druckfunktion 227

Examples 227

Grundlagen zum Drucken 227

Parameter drucken 228

Kapitel 49: Die Pass-Anweisung 230

Syntax 230

Bemerkungen 230

Examples 232

Ausnahme ignorieren 232

Erstellen Sie eine neue Ausnahme, die abgefangen werden kann 232

Kapitel 50: Die spezielle Variable __name__ 233

Einführung 233

Bemerkungen 233

Examples 233

__name__ == '__main__' 233

Situation 1 233

Situation 2 233

Funktionsklasse_oder_Modul .__ Name__ 234

Zur Protokollierung verwenden 235

Kapitel 51: Django 236

Einführung 236

Examples 236

Hallo Welt mit Django 236

Kapitel 52: Dynamische Code-Ausführung mit "exec" und "eval" 238

Syntax 238

Parameter 238

Bemerkungen 238
Examples 239

Aussagen mit exec auswerten 239

Auswerten eines Ausdrucks mit eval 239

Einen Ausdruck vorkompilieren, um ihn mehrmals auszuwerten 239

Auswerten eines Ausdrucks mit eval mit benutzerdefinierten Globals 239

Auswertung eines Strings, der ein Python-Literal enthält, mit ast.literal_eval 240

Ausführen von Code, der von nicht vertrauenswürdigem Benutzer mit exec, eval oder ast.lite 240

Kapitel 53: Eigenschaftsobjekte 242

Bemerkungen 242

Examples 242

Verwenden des @property-Dekorators 242

Verwenden des @property-Dekorators für Lese- und Schreibeigenschaften 242

Nur einen Getter, Setter oder Deleter eines Eigenschaftsobjekts überschreiben 243

Eigenschaften ohne Dekorateure verwenden 243

Kapitel 54: Einfache mathematische Operatoren 246

Einführung 246

Bemerkungen 246

Numerische Typen und ihre Metaklassen 246

Examples 246

Zusatz 246

Subtraktion 247

Multiplikation 247

Einteilung 248

Exponentierung 250

Spezialfunktionen 250

Logarithmen 251

Inplace-Operationen 251

Trigonometrische Funktionen 252

Modul 252

Kapitel 55: Einführung in RabbitMQ mit AMQPStorm 254

Bemerkungen 254

Examples 254
So verwenden Sie Nachrichten von RabbitMQ 254

So veröffentlichen Sie Nachrichten an RabbitMQ 255

So erstellen Sie eine verzögerte Warteschlange in RabbitMQ 256

Kapitel 56: Einsatz 258

Examples 258

Conda-Paket hochladen 258

Kapitel 57: einstellen 260

Syntax 260

Bemerkungen 260

Examples 260

Holen Sie sich die einzigartigen Elemente einer Liste 260

Operationen an Sets 261

Sets im Vergleich zu Multisets 262

Festlegen von Operationen mit Methoden und eingebauten Elementen 263

Überschneidung 263

Union 263

Unterschied 263

Symmetrischer Unterschied 264

Teilmenge und Obermenge 264

Disjunkte Sätze 264

Mitgliedschaft testen 265

Länge 265

Satz von Sets 265

Kapitel 58: Enum 266

Bemerkungen 266

Examples 266

Erstellen einer Enumeration (Python 2.4 bis 3.3) 266

Iteration 266

Kapitel 59: Erste Schritte mit GZip 267

Einführung 267

Examples 267
Lesen und Schreiben von GNU-ZIP-Dateien 267

Kapitel 60: Erstellen eines Windows-Dienstes mit Python 268

Einführung 268

Examples 268

Ein Python-Skript, das als Dienst ausgeführt werden kann 268

Ausführen einer Flask-Webanwendung als Dienst 269

Kapitel 61: Erstellen Sie eine virtuelle Umgebung mit Virtualenvwrapper in Windows 271

Examples 271

Virtuelle Umgebung mit Virtualenvwrapper für Windows 271

Kapitel 62: Erweiterungen schreiben 273

Examples 273

Hallo Welt mit C-Erweiterung 273

Eine offene Datei an C-Erweiterungen übergeben 274

C-Erweiterung mit c ++ und Boost 274

C ++ - Code 274

Kapitel 63: Externe Datendateien mit Pandas eingeben, unterteilen und ausgeben 276

Einführung 276

Examples 276

Grundlegender Code zum Importieren, Subset und Schreiben von externen Datendateien mit Pan 276

Kapitel 64: Filter 278

Syntax 278

Parameter 278

Bemerkungen 278

Examples 278

Grundlegende Verwendung des Filters 278

Filter ohne Funktion 279

Als Kurzschlussprüfung filtern 279

Komplementärfunktion: filterfalse, ifilterfalse 280

Kapitel 65: Flasche 282

Einführung 282

Syntax 282
Examples 282

Die Grundlagen 282

Routing-URLs 283

HTTP-Methoden 283

Dateien und Vorlagen 284

Jinja Templating 285

Das Anforderungsobjekt 286

URL-Parameter 286

Datei-Uploads 287

Kekse 287

Kapitel 66: Functools-Modul 288

Examples 288

teilweise 288

total_ordering 288

reduzieren 289

lru_cache 289

cmp_to_key 290

Kapitel 67: Funktionale Programmierung in Python 291

Einführung 291

Examples 291

Lambda-Funktion 291

Kartenfunktion 291

Funktion reduzieren 291

Filterfunktion 291

Kapitel 68: Funktionen 293

Einführung 293

Syntax 293

Parameter 293

Bemerkungen 293

Zusätzliche Ressourcen 294

Examples 294

Einfache Funktionen definieren und aufrufen 294


Werte von Funktionen zurückgeben 296

Funktion mit Argumenten definieren 297

Definieren einer Funktion mit optionalen Argumenten 297

Warnung 298

Funktion mit mehreren Argumenten definieren 298

Definieren einer Funktion mit einer beliebigen Anzahl von Argumenten 298

Beliebige Anzahl von Positionsargumenten: 298

Beliebige Anzahl von Schlüsselwortargumenten 299

Warnung 300

Hinweis zum Benennen 301

Hinweis zur Einzigartigkeit 301

Hinweis zu Verschachtelungsfunktionen mit optionalen Argumenten 301

Definieren einer Funktion mit optionalen veränderbaren Argumenten 301

Erläuterung 302

Lösung 302

Lambda (Inline / Anonym) Funktionen 303

Argumentübergabe und Veränderlichkeit 305

Schließung 307

Rekursive Funktionen 307

Rekursionslimit 308

Verschachtelte Funktionen 309

Iterable und Wörterbuch auspacken 309

Erzwingen die Verwendung benannter Parameter 311

Rekursives Lambda mit zugewiesener Variable 311

Beschreibung des Codes 312

Kapitel 69: Funktionen mit Listenargumenten definieren 313

Examples 313

Funktion und Anruf 313

Kapitel 70: Generatoren 314

Einführung 314

Syntax 314

Examples 314
Iteration 314

Die nächste () Funktion 314

Objekte an einen Generator senden 315

Generatorausdrücke 316

Einführung 316

Verwenden eines Generators, um Fibonacci-Nummern zu finden 319

Unendliche Sequenzen 319

Klassisches Beispiel - Fibonacci-Zahlen 320

Alle Werte aus einem anderen iterierbar 320

Coroutinen 321

Rendite mit Rekursion: Alle Dateien in einem Verzeichnis werden rekursiv aufgelistet 321

Parallele Iteration über Generatoren 322

Code zum Erstellen von Listen umgestalten 323

Suchen 323

Kapitel 71: Graph-Werkzeug 325

Einführung 325

Examples 325

PyDotPlus 325

Installation 325

PyGraphviz 326

Kapitel 72: Grundflüche mit Python 328

Bemerkungen 328

Examples 328

Beispiel für ein einfaches Aufruf 328

Die helper-Funktion wrapper (). 328

Kapitel 73: Grundlegende Eingabe und Ausgabe 330

Examples 330

Input () und raw_input () verwenden 330

Verwendung der Druckfunktion 330

Funktion, um den Benutzer zur Eingabe einer Nummer aufzufordern 331

Einen String ohne Zeilenumbruch am Ende drucken 331

Aus stdin lesen 332


Eingabe aus einer Datei 332

Kapitel 74: gruppiere nach() 335

Einführung 335

Syntax 335

Parameter 335

Bemerkungen 335

Examples 335

Beispiel 1 335

Beispiel 2 337

Beispiel 3 337

Beispiel 4 338

Kapitel 75: Hashlib 340

Einführung 340

Examples 340

MD5-Hash einer Zeichenfolge 340

Algorithmus von OpenSSL 341

Kapitel 76: Häufige Fehler 342

Einführung 342

Examples 342

Ändern Sie die Reihenfolge, die Sie durchlaufen 342

Veränderliches Standardargument 345

Listenmultiplikation und gemeinsame Referenzen 346

Integer- und String-Identität 350

Zugriff auf Attribute von Int-Literalen 351

Verkettung oder Operator 352

sys.argv [0] ist der Name der ausgeführten Datei 353

h14 353

Wörterbücher sind nicht geordnet 353

Globale Interpreter-Sperre (GIL) und blockierende Threads 354

Variables Durchsickern in Listenverständnissen und für Schleifen 355

Mehrfachrückgabe 356

Pythonic JSON-Schlüssel 356


Kapitel 77: Heapq 358

Examples 358

Größte und kleinste Objekte einer Kollektion 358

Kleinster Artikel in einer Kollektion 358

Kapitel 78: HTML-Analyse 360

Examples 360

Suchen Sie nach einem Element in BeautifulSoup einen Text 360

CSS-Selektoren in BeautifulSoup verwenden 360

PyQuery 361

Kapitel 79: Ijson 362

Einführung 362

Examples 362

Einfaches Beispiel 362

Kapitel 80: In CSV von String oder List schreiben 363

Einführung 363

Parameter 363

Bemerkungen 363

Examples 363

Grundlegendes Schreibbeispiel 363

Anhängen eines Strings als Newline in einer CSV-Datei 364

Kapitel 81: Indizieren und Schneiden 365

Syntax 365

Parameter 365

Bemerkungen 365

Examples 365

Grundschneiden 365

Erstellen einer flachen Kopie eines Arrays 367

Objekt umkehren 367

Indizierung benutzerdefinierter Klassen: __getitem__, __setitem__ und __delitem__ 367

Slice-Zuordnung 368

Schneiden Sie Objekte 369

Grundlegende Indizierung 369


Kapitel 82: Inkompatibilitäten von Python 2 zu Python 3 371

Einführung 371

Bemerkungen 371

Examples 372

Anweisung drucken vs. Druckfunktion 372

Zeichenfolgen: Bytes im Vergleich zu Unicode 373

Integer Division 375

Reduzieren ist kein integrierter Bestandteil mehr 377

Unterschiede zwischen Range- und Xrange-Funktionen 378

Kompatibilität 379

Iterables auspacken 380

Ausnahmen erhöhen und behandeln 382

.next () -Methode für Iteratoren umbenannt 384

Vergleich verschiedener Typen 384

Benutzereingabe 385

Wörterbuchmethode ändert sich 386

exec-Anweisung ist eine Funktion in Python 3 387

hasattr-Funktionsfehler in Python 2 387

Umbenannte Module 388

Kompatibilität 389

Oktalkonstanten 389

Alle Klassen sind in Python 3 neue Klassen. 389

Entfernte Operatoren <> und ``, auch mit! = Und repr () 390

encode / decode to hex nicht mehr verfügbar 391

CMP-Funktion in Python 3 entfernt 392

Durchgesickerte Variablen im Listenverständnis 392

Karte() 393

filter (), map () und zip () geben Iteratoren statt Sequenzen zurück 394

Absolute / Relative Importe 395

Mehr zu den relativen Importen 395

Datei I / O 397

Die Funktion round () ist die Funktion "break-break" und "return" 397

runde () krawatte brechen 397


round () Rückgabetyp 398

Richtig, Falsch und Keiner 398

Rückgabewert beim Schreiben in ein Dateiobjekt 399

long vs. int 399

Klasse Boolescher Wert 400

Kapitel 83: IoT-Programmierung mit Python und Himbeer-PI 401

Examples 401

Beispiel - Temperatursensor 401

Kapitel 84: Iterables und Iteratoren 404

Examples 404

Iterator vs Iterable vs Generator 404

Was kann iterierbar sein 405

Iteration über ganze iterable 406

Überprüfen Sie nur ein Element in iterable 406

Extrahieren Sie die Werte einzeln 406

Iterator ist nicht wiedereintrittsfähig! 406

Kapitel 85: Itertools-Modul 408

Syntax 408

Examples 408

Elemente aus einem iterierbaren Objekt mithilfe einer Funktion gruppieren 408

Nehmen Sie ein Stück eines Generators 409

itertools.product 410

itertools.count 410

itertools.takewhile 411

itertools 412

Zippen Sie zwei Iteratoren, bis beide erschöpft sind 413

Kombinationsmethode im Itertools-Modul 413

Mehrere Iteratoren miteinander verketten 414

itertools.repeat 414

Erhalten Sie eine kumulierte Summe von Zahlen in einem iterierbaren Element 414

Durchlaufen Sie Elemente in einem Iterator 415

itertools.permutations 415
Kapitel 86: JSON-Modul 416

Bemerkungen 416

Typen 416

Standardwerte 416

Deserialisierungsarten: 416

Serialisierungsarten: 416

Kundenspezifische (De-) Serialisierung 417

Serialisierung: 417

De-Serialisierung: 417

Weitere benutzerdefinierte (De) Serialisierung: 418

Examples 418

JSON aus Python-Diktieren erstellen 418

Erstellen von Python-Diktaten aus JSON 418

Daten in einer Datei speichern 419

Daten aus einer Datei abrufen 419

`load` vs.` load`, `dump` vs.` dumps` 419

Aufruf von "json.tool" von der Befehlszeile aus, um die JSON-Ausgabe zu drucken 420

JSON-Ausgabe formatieren 421

Einzug festlegen, um eine schönere Ausgabe zu erhalten 421

Schlüssel alphabetisch sortieren, um eine konsistente Ausgabe zu erhalten 421

Whitespace entfernen, um kompakte Ausgabe zu erhalten 422

JSON-Codierung von benutzerdefinierten Objekten 422

Kapitel 87: Kartenfunktion 424

Syntax 424

Parameter 424

Bemerkungen 424

Examples 424

Grundlegende Verwendung von map, itertools.imap und future_builtins.map 424

Zuordnen jedes Werts in einem iterierbaren Element 425

Zuordnungswerte verschiedener iterables 426

Transponieren mit Map: Verwenden von "None" als Funktionsargument (nur Python 2.x) 427

Serien- und Parallelmapping 428


Kapitel 88: Kissen 431

Examples 431

Bilddatei lesen 431

Konvertieren Sie Dateien in JPEG 431

Kapitel 89: kivy - Plattformübergreifendes Python-Framework für die NUI-Entwicklung 432

Einführung 432

Examples 432

Erste App 432

Kapitel 90: Klassen 435

Einführung 435

Examples 435

Grundvererbung 435

Integrierte Funktionen, die mit Vererbung arbeiten 436

Klassen- und Instanzvariablen 437

Gebundene, ungebundene und statische Methoden 438

Klassen im neuen Stil und im alten Stil 440

Standardwerte für Instanzvariablen 441

Mehrfachvererbung 442

Deskriptoren und gepunktete Lookups 444

Klassenmethoden: alternative Initialisierer 445

Klassenaufbau 447

Affen-Patching 447

Alle Klassenmitglieder auflisten 448

Einführung in den Unterricht 449

Eigenschaften 451

Singleton-Klasse 453

Kapitel 91: Kommentare und Dokumentation 455

Syntax 455

Bemerkungen 455

Examples 455

Einzeilige, inline und mehrzeilige Kommentare 455


Programmgesteuerter Zugriff auf Docstrings 456

Eine Beispielfunktion 456

Eine weitere Beispielfunktion 456

Vorteile von Docstrings gegenüber regulären Kommentaren 456

Schreiben Sie Dokumentation mit docstrings 457

Syntaxkonventionen 457

PEP 257 457

Sphinx 458

Google Python Style Guide 459

Kapitel 92: Komplexe Mathematik 460

Syntax 460

Examples 460

Fortgeschrittene komplexe Arithmetik 460

Grundlegende komplexe Arithmetik 461

Kapitel 93: Kontextmanager ("mit" -Anweisung) 462

Einführung 462

Syntax 462

Bemerkungen 462

Examples 463

Einführung in Kontextmanager und die with-Anweisung 463

Einem Ziel zuweisen 463

Schreiben Sie Ihren eigenen Kontextmanager 464

Schreiben Sie Ihren eigenen Kontextmanager mit der Generatorsyntax 465

Mehrere Kontextmanager 466

Ressourcen verwalten 466

Kapitel 94: Leistungsoptimierung 468

Bemerkungen 468

Examples 468

Code-Profiling 468

Kapitel 95: List Destructuring (auch bekannt als Ein- und Auspacken) 471

Examples 471

Zerstörungsauftrag 471
Zerstörung als Werte 471

Zerstörung als Liste 471

Werte in Destructuring-Zuweisungen ignorieren 472

Ignorieren von Listen in Zerstörungszuweisungen 472

Argumente für Verpackungsfunktionen 472

Eine Liste mit Argumenten packen 473

Schlüsselwortargumente packen 473

Funktionsargumente auspacken 475

Kapitel 96: Liste 476

Einführung 476

Syntax 476

Bemerkungen 476

Examples 476

Auf Listenwerte zugreifen 476

Listen Sie Methoden und unterstützte Operatoren auf 478

Länge einer Liste 483

Iteration über eine Liste 484

Prüfen, ob ein Element in einer Liste enthalten ist 484

Listenelemente umkehren 485

Überprüfen, ob die Liste leer ist 485

Listen verketten und zusammenführen 486

Alle und alle 487

Entfernen Sie doppelte Werte in der Liste 487

Zugriff auf Werte in der verschachtelten Liste 488

Listenvergleich 489

Initialisieren einer Liste mit einer festen Anzahl von Elementen 490

Kapitel 97: Listen Sie Verständnis auf 491

Einführung 491

Syntax 491

Bemerkungen 491

Examples 491

Listenverständnisse 491
sonst 492

Doppelte Iteration 493

In-Place-Mutation und andere Nebenwirkungen 493

Whitespace in Listenverständnissen 494

Wörterbuch Verständnis 495

Generator-Ausdrücke 496

Anwendungsfälle 498

Verstehen festlegen 499

Vermeiden Sie sich wiederholende und teure Operationen mit Bedingungsklausel 499

Verständnis für Tupel 501

Zählen von Vorkommnissen anhand des Verständnisses 502

Typen in einer Liste ändern 502

Kapitel 98: Listenaufteilung (Auswählen von Listenteilen) 503

Syntax 503

Bemerkungen 503

Examples 503

Verwenden Sie das dritte Argument "step" 503

Auswahl einer Unterliste aus einer Liste 503

Umkehren einer Liste mit dem Schneiden 504

Verschieben einer Liste mit dem Schneiden 504

Kapitel 99: Listenverständnisse 506

Einführung 506

Syntax 506

Bemerkungen 506

Examples 506

Bedingte Listenverständnisse 506

Listenverständnisse mit verschachtelten Schleifen 508

Refactoring-Filter und Karte zum Auflisten von Verständnis 509

Refactoring - Kurzanleitung 510

Verschachtelte Listenverständnisse 510

Iteriere zwei oder mehr Listen gleichzeitig innerhalb des Listenverständnisses 511
Kapitel 100: Mathematik-Modul 513

Examples 513

Rundung: rund, Boden, Decke, Rumpf 513

Warnung! 514

Warnung vor der Boden-, Abbruch- und Ganzzahlteilung negativer Zahlen 514

Logarithmen 514

Zeichen kopieren 515

Trigonometrie 515

Länge der Hypotenuse berechnen 515

Grad in Radiant umrechnen 515

Sinus-, Cosinus-, Tangenten- und Umkehrfunktionen 515

Hyperbolischer Sinus, Cosinus und Tangens 516

Konstanten 516

Imaginäre Zahlen 517

Infinity und NaN ("keine Zahl") 517

Pow für schnellere Potenzierung 520

Komplexe Zahlen und das cmath-Modul 520

Kapitel 101: Mehrdimensionale Arrays 524

Examples 524

Listen in Listen 524

Listen in Listen in Listen in ... 525

Kapitel 102: Metaklassen 526

Einführung 526

Bemerkungen 526

Examples 526

Grundlegende Metaklassen 526

Singletons mit Metaklassen 527

Verwenden einer Metaklasse 528

Metaklassensyntax 528

Python 2 und 3 Kompatibilität mit six 528

Benutzerdefinierte Funktionalität mit Metaklassen 528

Einführung in Metaklassen 529


Was ist eine Metaklasse? 529

Die einfachste Metaclass 529

Eine Metaklasse, die etwas tut 530

Die Standard-Metaklasse 530

Kapitel 103: Mit ZIP-Archiven arbeiten 532

Syntax 532

Bemerkungen 532

Examples 532

Zip-Dateien öffnen 532

Inhalt der Zipdatei überprüfen 532

Extrahieren der ZIP-Datei in ein Verzeichnis 533

Neue Archive erstellen 533

Kapitel 104: Mixins 535

Syntax 535

Bemerkungen 535

Examples 535

Mixin 535

Methoden in Mixins überschreiben 536

Kapitel 105: Module importieren 538

Syntax 538

Bemerkungen 538

Examples 538

Modul importieren 538

Bestimmte Namen aus einem Modul importieren 540

Importieren aller Namen aus einem Modul 540

Die spezielle Variable __all__ 541

Programmatisches Importieren 542

Importieren Sie Module von einem beliebigen Dateisystemort aus 542

PEP8-Regeln für Importe 543

Submodule importieren 543

__import __ () - Funktion 543

Ein Modul erneut importieren 544


Python 2 544

Python 3 545

Kapitel 106: Müllsammlung 546

Bemerkungen 546

Generationsmüllsammlung 546

Examples 548

Referenzzählung 548

Speicherbereiniger für Referenzzyklen 549

Auswirkungen des Befehls del 550

Wiederverwendung von primitiven Objekten 551

Anzeige der Refcount eines Objekts 551

Objekte zwangsweise freigeben 551

Verwalten der Speicherbereinigung 552

Warten Sie nicht, bis die Müllsammlung aufgeräumt ist 553

Kapitel 107: Multiprocessing 555

Examples 555

Zwei einfache Prozesse ausführen 555

Pool und Karte verwenden 556

Kapitel 108: Multithreading 557

Einführung 557

Examples 557

Grundlagen des Multithreading 557

Kommunikation zwischen Threads 558

Anlegen eines Worker-Pools 559

Erweiterte Verwendung von Multithreads 560

Erweiterter Drucker (Logger) 560

Stoppbarer Thread mit einer while-Schleife 561

Kapitel 109: Mutable vs. Immutable (und Hashable) in Python 563

Examples 563

Veränderlich vs. unveränderlich 563

Unveränderliche 563

Übung 564
Mutables 564

Übung 565

Veränderlich und unveränderlich als Argumente 565

Übung 566

Kapitel 110: Neo4j und Cypher mit Py2Neo 568

Examples 568

Importieren und Authentifizieren 568

Knoten zum Neo4j-Diagramm hinzufügen 568

Hinzufügen von Beziehungen zum Neo4j-Diagramm 568

Abfrage 1: Autovervollständigung bei Nachrichtentiteln 569

Abfrage 2: Abrufen von Nachrichtenartikeln an einem bestimmten Datum nach Standort 569

Cypher Query Samples 569

Kapitel 111: Nicht offizielle Python-Implementierungen 571

Examples 571

IronPython 571

Hallo Welt 571

Externe Links 571

Jython 571

Hallo Welt 572

Externe Links 572

Verschlüsseln 572

Codegröße und Geschwindigkeit 572

Integration mit HTML 573

Integration mit JavaScript und DOM 573

Integration mit anderen JavaScript-Bibliotheken 573

Beziehung zwischen Python- und JavaScript-Code 574

Externe Links 575

Kapitel 112: Optische Zeichenerkennung 576

Einführung 576

Examples 576

PyTesseract 576
PyOCR 576

Kapitel 113: os.path 578

Einführung 578

Syntax 578

Examples 578

Pfade beitreten 578

Absoluter Pfad vom relativen Pfad 578

Pfadkomponenten-Manipulation 579

Holen Sie sich das übergeordnete Verzeichnis 579

Wenn der angegebene Pfad existiert 579

Prüfen Sie, ob der angegebene Pfad ein Verzeichnis, eine Datei, ein symbolischer Link, ein 579

Kapitel 114: Pandas-Transformation: Vorformung von Operationen in Gruppen und Verketten de


581

Examples 581

Einfache umwandlung 581

Zuerst lassen wir einen Dummy-Datenrahmen erstellen 581

Jetzt werden wir die Pandas- transform verwenden, um die Anzahl der Bestellungen pro Kunde 581

Mehrere Ergebnisse pro Gruppe 582

Verwenden von transform , die Teilberechnungen pro Gruppe zurückgeben 582

Kapitel 115: Parallele Berechnung 584

Bemerkungen 584

Examples 584

Verwenden des Multiprocessing-Moduls zum Parallelisieren von Aufgaben 584

Übergeordnete und untergeordnete Skripts verwenden, um Code parallel auszuführen 584

Verwendung einer C-Erweiterung zum Parallelisieren von Aufgaben 585

Verwenden des PyPar-Moduls zum Parallelisieren 585

Kapitel 116: pip: PyPI-Paketmanager 587

Einführung 587

Syntax 587

Bemerkungen 587

Examples 588

Pakete installieren 588


Installieren Sie aus Anforderungsdateien 588

Pakete deinstallieren 588

Um alle Pakete aufzulisten, die mit `pip` installiert wurden 589

Aktualisieren Sie Pakete 589

Aktualisierung aller veralteten Pakete unter Linux 589

Aktualisierung aller veralteten Pakete unter Windows 590

Erstellen Sie eine Requirements.txt-Datei aller Pakete im System 590

Erstellen Sie eine Requirements.txt-Datei mit Paketen nur in der aktuellen virtualenv 590

Verwenden einer bestimmten Python-Version mit Pip 590

Pakete installieren, die noch nicht auf dem Rohr als Räder montiert sind 591

Hinweis zum Installieren von Pre-Releases 593

Hinweis zum Installieren von Entwicklungsversionen 593

Kapitel 117: Plotten mit Matplotlib 596

Einführung 596

Examples 596

Ein einfaches Diagramm in Matplotlib 596

Hinzufügen weiterer Funktionen zu einer einfachen Zeichnung: Achsenbeschriftungen, Titel, 597

Erstellen mehrerer Plots in derselben Figur durch Überlagerung ähnlich wie bei MATLAB 598

Erstellen mehrerer Plots in derselben Figur mithilfe der Plotüberlagerung mit separaten Pl 599

Diagramme mit gemeinsamer X-Achse, aber unterschiedlicher Y-Achse: Verwendung von twinx () 600

Diagramme mit gemeinsamer Y-Achse und unterschiedlicher X-Achse mit twiny () 602

Kapitel 118: Plugin- und Erweiterungsklassen 605

Examples 605

Mixins 605

Plugins mit benutzerdefinierten Klassen 606

Kapitel 119: Polymorphismus 608

Examples 608

Grundpolymorphismus 608

Ente tippen 610

Kapitel 120: PostgreSQL 612

Examples 612
Fertig machen 612

Installation mit Pip 612

Grundlegende Verwendung 612

Kapitel 121: Potenzierung 614

Syntax 614

Examples 614

Quadratwurzel: math.sqrt () und cmath.sqrt 614

Potenzierung mit Builtins: ** und pow () 615

Potenzierung mit dem math Modul: math.pow () 615

Exponentialfunktion: math.exp () und cmath.exp () 616

Exponentialfunktion minus 1: math.expm1 () 616

Magische Methoden und Exponentiation: Builtin, Mathe und Cmath 617

Modulare Exponentiation: pow () mit 3 Argumenten 618

Wurzeln: n-te Wurzel mit gebrochenen Exponenten 619

Berechnen großer ganzzahliger Wurzeln 619

Kapitel 122: Profilierung 621

Examples 621

%% Zeit und% Zeit in IPython 621

Funktion timeit () 621

timeit Befehlszeile 621

line_profiler in der Befehlszeile 622

CProfile (Preferred Profiler) verwenden 622

Kapitel 123: Protokollierung 624

Examples 624

Einführung in die Python-Protokollierung 624

Ausnahmen für die Protokollierung 625

Kapitel 124: Prozesse und Threads 628

Einführung 628

Examples 628

Globale Interpreter-Sperre 628

Ausführen in mehreren Threads 630

Ausführen in mehreren Prozessen 630


Status zwischen Threads teilen 631

Status zwischen Prozessen teilen 631

Kapitel 125: py.test 633

Examples 633

Py.test einrichten 633

Der zu testende Code 633

Der Prüfcode 633

Den Test ausführen 633

Fehlgeschlagene Tests 634

Einführung in Test-Fixtures 634

py.test Geräte zur Rettung! 636

Nach den Tests aufräumen. 637

Kapitel 126: pyaudio 639

Einführung 639

Bemerkungen 639

Examples 639

Callback-Modus Audio-E / A 639

Audio-E / A im Blockierungsmodus 640

Kapitel 127: Pyautogui-Modul 642

Einführung 642

Examples 642

Mausfunktionen 642

Tastaturfunktionen 642

ScreenShot und Bilderkennung 642

Kapitel 128: Pygame 643

Einführung 643

Syntax 643

Parameter 643

Examples 643

Pygame installieren 643

Pygame's Mischermodul 644


Initialisierung 644

Mögliche Aktionen 644

Channels 644

Kapitel 129: Pyglet 646

Einführung 646

Examples 646

Hallo Welt in Pyglet 646

Installation von Pyglet 646

Sound in Pyglet abspielen 646

Pyglet für OpenGL verwenden 646

Zeichnungspunkte mit Pyglet und OpenGL 647

Kapitel 130: PyInstaller - Verteilen von Python-Code 648

Syntax 648

Bemerkungen 648

Examples 648

Installation und Einrichtung 648

Pyinstaller verwenden 649

In einem Ordner bündeln 649

Vorteile: 649

Nachteile 650

Bündeln in eine einzelne Datei 650

Kapitel 131: Python aus C # aufrufen 651

Einführung 651

Bemerkungen 651

Examples 652

Python-Skript, das von der C # -Anwendung aufgerufen werden soll 652

C # -Code, der ein Python-Skript aufruft 653

Kapitel 132: Python Lex-Yacc 655

Einführung 655

Bemerkungen 655

Examples 655
Erste Schritte mit PLY 655

Das "Hallo, Welt!" of PLY - Ein einfacher Rechner 655

Teil 1: Tokenisierung mit Lex 657

Nervenzusammenbruch 658

h22 659

h23 659

h24 660

h25 660

h26 660

h27 660

h28 661

h29 661

h210 661

h211 661

Teil 2: Analyse von getakteten Eingaben mit Yacc 661

Nervenzusammenbruch 662

h212 664

Kapitel 133: Python mit SQL Server verbinden 665

Examples 665

Verbindung zum Server herstellen, Tabelle erstellen, Abfragedaten 665

Kapitel 134: Python Parallelität 667

Bemerkungen 667

Examples 667

Das Einfädelmodul 667

Das Multiprocessing-Modul 667

Übergabe von Daten zwischen Multiprozessoren 668

Kapitel 135: Python Requests Post 671

Einführung 671

Examples 671

Einfacher Beitrag 671

Formularcodierte Daten 672


Datei-Upload 673

Antworten 673

Authentifizierung 674

Proxies 675

Kapitel 136: Python serielle Kommunikation (pyserial) 677

Syntax 677

Parameter 677

Bemerkungen 677

Examples 677

Initialisieren Sie das serielle Gerät 677

Vom seriellen Port lesen 677

Prüfen Sie, welche seriellen Anschlüsse auf Ihrem Computer verfügbar sind 678

Kapitel 137: Python Server - Gesendete Ereignisse 679

Einführung 679

Examples 679

Flasche SSE 679

Asyncio SSE 679

Kapitel 138: Python und Excel 680

Examples 680

Geben Sie Listendaten in eine Excel-Datei ein. 680

OpenPyXL 680

Erstellen Sie mit xlsxwriter Excel-Diagramme 681

Lesen Sie die Excel-Daten mit dem xlrd-Modul 683

Formatieren Sie Excel-Dateien mit xlsxwriter 684

Kapitel 139: Python-Anti-Patterns 686

Examples 686

Übereifrig mit Ausnahme der Klausel 686

Schauen Sie, bevor Sie mit einer prozessorintensiven Funktion springen 687

Wörterbuchschlüssel 687

Kapitel 140: Python-Datentypen 689

Einführung 689

Examples 689
Datentyp Zahlen 689

String-Datentyp 689

List Datentyp 689

Tupel-Datentyp 689

Wörterbuch-Datentyp 690

Datentypen festlegen 690

Kapitel 141: Python-Geschwindigkeit des Programms 691

Examples 691

Notation 691

Operationen auflisten 691

Deque-Operationen 692

Operationen einstellen 693

Algorithmische Notationen ... 693

Kapitel 142: Python-HTTP-Server 695

Examples 695

Einen einfachen HTTP-Server ausführen 695

Dateien bereitstellen 695

Programmatische API von SimpleHTTPServer 697

Grundlegende Handhabung von GET, POST, PUT mit BaseHTTPRequestHandler 698

Kapitel 143: Python-Netzwerk 700

Bemerkungen 700

Examples 700

Das einfachste Python-Socket-Client-Server-Beispiel 700

Einen einfachen HTTP-Server erstellen 700

TCP-Server erstellen 701

Erstellen eines UDP-Servers 702

Starten Sie Simple HttpServer in einem Thread und öffnen Sie den Browser 702

Kapitel 144: Python-Pakete erstellen 704

Bemerkungen 704

Examples 704

Einführung 704

Hochladen in PyPI 705


Richten Sie eine .pypirc-Datei ein 705

Registrieren und Hochladen zu testpypi (optional) 705

Testen 706

Registrieren und Hochladen auf PyPI 706

Dokumentation 707

Readme 707

Lizenzierung 707

Paket ausführbar machen 707

Kapitel 145: Python-Persistenz 709

Syntax 709

Parameter 709

Examples 709

Python-Persistenz 709

Funktionsprogramm zum Speichern und Laden 710

Kapitel 146: Redewendungen 711

Examples 711

Wörterbuch-Schlüsselinitialisierungen 711

Variablen wechseln 711

Verwenden Sie die Wahrheitswertprüfung 711

Testen Sie "__main__", um unerwartete Codeausführung zu vermeiden 712

Kapitel 147: Reduzieren 713

Syntax 713

Parameter 713

Bemerkungen 713

Examples 713

Überblick 713

Verwenden Sie reduzieren 714

Kumulatives Produkt 715

Nicht-Kurzschlussvariante von any / all 715

Erstes Wahrheits- / Falsches Element einer Sequenz (oder letztes Element, wenn es keine gi 715

Kapitel 148: Reguläre Ausdrücke (Regex) 716


Einführung 716

Syntax 716

Examples 716

Den Anfang einer Zeichenfolge abgleichen 717

Suchen 718

Gruppierung 718

Benannte Gruppen 719

Nicht einfangende Gruppen 719

Sonderzeichen entkommen 720

Ersetzen 720

Zeichenketten ersetzen 720

Gruppenreferenzen verwenden 721

Ersatzfunktion verwenden 721

Alle nicht überlappenden Übereinstimmungen suchen 721

Vorkompilierte Muster 722

Auf zulässige Zeichen prüfen 722

Zeichenfolge mit regulären Ausdrücken aufteilen 723

Flaggen 723

Flaggen-Schlüsselwort 723

Inline-Flags 724

Iteration über Matches mit `re.finditer` 724

Stimmen Sie einen Ausdruck nur an bestimmten Orten ab 724

Kapitel 149: Rekursion 726

Bemerkungen 726

Examples 726

Summe der Zahlen von 1 bis n 726

Was, Wie und Wann der Rekursion 726

Baumerkundung mit Rekursion 730

Maximale Rekursionstiefe erhöhen 731

Schwanzrekursion - schlechte Praxis 732

Rekursionsoptimierung durch Stack-Introspection 732


Kapitel 150: Sammlungen-Modul 735

Einführung 735

Bemerkungen 735

Examples 735

Sammlungen. Zähler 735

collection.defaultdict 737

Collections.OrderedDict 738

collection.namedtuple 739

Collections.deque 740

Collections.ChainMap 741

Kapitel 151: Schildkröte-Grafiken 743

Examples 743

Ninja Twist (Schildkrötengrafik) 743

Kapitel 152: Schleifen 744

Einführung 744

Syntax 744

Parameter 744

Examples 744

Iterieren über Listen 744

Für Schleifen 745

Iterierbare Objekte und Iteratoren 746

Brechen Sie in Loops und fahren Sie fort 746

Anweisung break 746

continue Aussage 747

Verschachtelte Loops 748

Verwenden Sie return aus einer Funktion als break 748

Loops mit einer "else" -Klausel 749

Warum sollte man dieses seltsame Konstrukt verwenden? 750

Wörterbücher iterieren 751

While-Schleife 752

Die Pass-Erklärung 753


Verschiedene Teile einer Liste mit unterschiedlicher Schrittweite iterieren 753

Iteration über die ganze Liste 754

Iteriere über Unterliste 754

Die "halbe Schleife" machen 755

Schleifen und Auspacken 755

Kapitel 153: setup.py 757

Parameter 757

Bemerkungen 757

Examples 757

Zweck von setup.py 757

Hinzufügen von Befehlszeilenskripten zu Ihrem Python-Paket 758

Verwenden der Quellcodeverwaltungsmetadaten in setup.py 759

Installationsoptionen hinzufügen 759

Kapitel 154: Sichere Shell-Verbindung in Python 761

Parameter 761

Examples 761

SSH-Verbindung 761

Kapitel 155: Sicherheit und Kryptographie 762

Einführung 762

Syntax 762

Bemerkungen 762

Examples 762

Berechnen eines Message-Digest 762

Verfügbare Hash-Algorithmen 763

Sicheres Passwort-Hashing 763

Hashing von Dateien 764

Symmetrische Verschlüsselung mit Pycrypto 764

Generierung von RSA-Signaturen mit pycrypto 765

Asymmetrische RSA-Verschlüsselung mit Pycrypto 766

Kapitel 156: Sockets und Nachrichtenverschlüsselung / Entschlüsselung zwischen Client und 768

Einführung 768

Bemerkungen 768
Examples 772

Serverseitige Implementierung 772

Client-seitige Implementierung 773

Kapitel 157: Sortierung, Minimum und Maximum 776

Examples 776

Holen Sie sich das Minimum oder Maximum von mehreren Werten 776

Verwenden Sie das Schlüsselargument 776

Default Argument auf max, min 777

Sonderfall: Wörterbücher 777

Nach Wert 777

Eine sortierte Reihenfolge erhalten 778

Minimum und Maximum einer Sequenz 778

Machen Sie benutzerdefinierte Klassen bestellbar 779

Extrahieren von N größten oder N kleinsten Elementen aus einer iterierbaren 781

Kapitel 158: Sqlite3-Modul 783

Examples 783

Sqlite3 - Kein separater Serverprozess erforderlich. 783

Abrufen der Werte aus der Datenbank und Fehlerbehandlung 783

Kapitel 159: Stapel 785

Einführung 785

Syntax 785

Bemerkungen 785

Examples 785

Erstellen einer Stack-Klasse mit einem Listenobjekt 785

Parsen von Klammern 787

Kapitel 160: Steckdosen 788

Einführung 788

Parameter 788

Examples 788

Senden von Daten über UDP 788

Daten über UDP empfangen 789

Senden von Daten über TCP 789


TCP-Socket-Server mit mehreren Threads 790

Raw Sockets unter Linux 791

Kapitel 161: String-Formatierung 793

Einführung 793

Syntax 793

Bemerkungen 793

Examples 793

Grundlagen der String-Formatierung 793

Ausrichtung und Polsterung 795

Format Literale (F-String) 795

String-Formatierung mit datetime 796

Formatieren Sie mit Getitem und Getattr 797

Float-Formatierung 797

Numerische Werte formatieren 798

Benutzerdefinierte Formatierung für eine Klasse 799

Verschachtelte Formatierung 800

Saiten auffüllen und abschneiden, kombiniert 800

Benannte Platzhalter 801

Wörterbuch verwenden (Python 2.x) 801

Wörterbuch verwenden (Python 3.2+) 801

Ohne Wörterbuch: 801

Kapitel 162: String-Methoden 803

Syntax 803

Bemerkungen 804

Examples 804

Ändern der Großschreibung einer Zeichenfolge 804

str.casefold() 804

str.upper() 805

str.lower() 805

str.capitalize() 805

str.title() 805

str.swapcase() 805
Verwendung als str Klassenmethoden 805

Teilen Sie eine Zeichenfolge basierend auf einem Trennzeichen in eine Liste von Zeichenfol 806

str.split(sep=None, maxsplit=-1) 806

str.rsplit(sep=None, maxsplit=-1) 807

Ersetzen Sie alle Vorkommen einer Teilzeichenfolge durch eine andere Teilzeichenfolge 807

str.replace(old, new[, count]) : 807

str.format und f-strings: Formatiert Werte in einen String 808

Zählt, wie oft ein Teilstring in einem String erscheint 809

str.count(sub[, start[, end]]) 809

Testen Sie die Start- und Endzeichen einer Zeichenfolge 810

str.startswith(prefix[, start[, end]]) 810

str.endswith(prefix[, start[, end]]) 810

Testen, woraus eine Zeichenfolge besteht 811

str.isalpha 811

str.isupper , str.islower , str.istitle 811

str.isdecimal , str.isdigit , str.isnumeric 812

str.isalnum 813

str.isspace 813

str.translate: Zeichen in einer Zeichenfolge übersetzen 813

Entfernen Sie unerwünschte führende / nachgestellte Zeichen aus einer Zeichenfolge 814

str.strip([chars]) 814

str.rstrip([chars]) und str.lstrip([chars]) 815

String-Vergleiche ohne Berücksichtigung von Groß- und Kleinschreibung 815

Verknüpfen Sie eine Liste von Zeichenfolgen in einer Zeichenfolge 816

Nützliche Konstanten des String-Moduls 817

string.ascii_letters : 817

string.ascii_lowercase : 817

string.ascii_uppercase : 817

string.digits : 817

string.hexdigits : 817

string.octaldigits : 818

string.punctuation : 818

string.whitespace : 818
string.printable : 818

Einen String umkehren 818

Zeichenfolgen rechtfertigen 819

Konvertierung zwischen Str. Oder Byte-Daten und Unicode-Zeichen 819

String enthält 821

Kapitel 163: Subprozess-Bibliothek 822

Syntax 822

Parameter 822

Examples 822

Externe Befehle aufrufen 822

Mehr Flexibilität mit Popen 823

Subprozess starten 823

Warten auf den Abschluss eines Unterprozesses 823

Ausgabe aus einem Unterprozess lesen 823

Interaktiver Zugriff auf laufende Unterprozesse 823

In einen Teilprozess schreiben 823

Einen Stream aus einem Unterprozess lesen 824

So erstellen Sie das Befehlslistenargument 824

Kapitel 164: Suchen 826

Bemerkungen 826

Examples 826

Den Index für Strings abrufen: str.index (), str.rindex () und str.find (), str.rfind () 826

Nach einem Element suchen 826

Liste 827

Tupel 827

String 827

einstellen 827

Dikt 827

Abrufen der Indexliste und der Tupel: list.index (), tuple.index () 827

Suchschlüssel nach einem Wert in dict 828

Den Index für sortierte Sequenzen abrufen: bisect.bisect_left () 829

Verschachtelte Sequenzen durchsuchen 829


Suchen in benutzerdefinierten Klassen: __contains__ und __iter__ 830

Kapitel 165: sys 832

Einführung 832

Syntax 832

Bemerkungen 832

Examples 832

Kommandozeilenargumente 832

Skriptname 832

Standardfehlerstrom 833

Den Prozess vorzeitig beenden und einen Beendigungscode zurückgeben 833

Kapitel 166: Teilfunktionen 834

Einführung 834

Syntax 834

Parameter 834

Bemerkungen 834

Examples 834

Erhöhen Sie die Kraft 834

Kapitel 167: tempfile NamedTemporaryFile 836

Parameter 836

Examples 836

Erstellen (und Schreiben) einer bekannten, permanenten temporären Datei 836

Kapitel 168: tkinter 838

Einführung 838

Bemerkungen 838

Examples 838

Eine minimale Tkinter-Anwendung 838

Geometrie-Manager 839

Platz 839

Pack 840

Gitter 840

Kapitel 169: Tupel 842


Einführung 842

Syntax 842

Bemerkungen 842

Examples 842

Indexierung von Tupeln 842

Tupel sind unveränderlich 843

Tuple sind elementweise Hashfähig und gleichwertig 843

Tupel 844

Verpacken und Auspacken von Tupeln 845

Elemente umkehren 846

Eingebaute Tupel-Funktionen 846

Vergleich 846

Tupel-Länge 847

Max eines Tupels 847

Min von einem Tupel 847

Konvertieren Sie eine Liste in ein Tupel 847

Tuple-Verkettung 848

Kapitel 170: Typ Hinweise 849

Syntax 849

Bemerkungen 849

Examples 849

Generische Typen 849

Hinzufügen von Typen zu einer Funktion 849

Klassenmitglieder und Methoden 850

Variablen und Attribute 851

NamedTuple 852

Geben Sie Hinweise für Schlüsselwortargumente ein 852

Kapitel 171: Überlastung 853

Examples 853

Magie / Dunder-Methoden 853

Container- und Sequenztypen 854

Aufrufbare Typen 855


Umgang mit nicht implementiertem Verhalten 855

Überlastung des Bedieners 856

Kapitel 172: Überprüfen der Pfadexistenz und der Berechtigungen 859

Parameter 859

Examples 859

Überprüfen Sie mit os.access 859

Kapitel 173: Überschreiben der Methode 861

Examples 861

Grundlegende Methode überschreiben 861

Kapitel 174: Umgang mit der Global Interpreter Lock (GIL) 862

Bemerkungen 862

Warum gibt es eine GIL? 862

Details zur Funktionsweise der GIL: 862

Vorteile der GIL 863

Folgen der GIL 863

Verweise: 863

Examples 863

Multiprocessing.Pool 864

David Beazleys Code, der Probleme beim Einfädeln von GIL zeigte 864

Cython Nogil: 865

David Beazleys Code, der Probleme beim Einfädeln von GIL zeigte 865

Mit Nogil neu geschrieben (NUR FUNKTIONIERT IN CYTHON): 865

Kapitel 175: Unicode 867

Examples 867

Kodierung und Dekodierung 867

Kapitel 176: Unicode und Bytes 868

Syntax 868

Parameter 868

Examples 868

Grundlagen 868

Unicode in Bytes 868


Bytes bis Unicode 869

Behandlung von Codierungs- / Decodierungsfehlern 869

Codierung 870

Dekodierung 870

Moral 870

Datei I / O 870

Kapitel 177: Unit Testing 872

Bemerkungen 872

Examples 872

Ausnahmen testen 872

Verspottungsfunktionen mit unittest.mock.create_autospec 873

Testen Sie Setup und Teardown innerhalb eines Tests. TestCase 874

Ausnahmen geltend machen 875

Assertions innerhalb Unittests auswählen 876

Unit-Tests mit Pytest 877

Kapitel 178: Unterschied zwischen Modul und Paket 881

Bemerkungen 881

Examples 881

Module 881

Pakete 881

Kapitel 179: Unveränderbare Datentypen (int, float, str, tuple und frozensets) 883

Examples 883

Einzelne Zeichen von Strings können nicht zugewiesen werden 883

Die einzelnen Mitglieder von Tuple können nicht zugewiesen werden 883

Frozensets sind unveränderlich und nicht zuordenbar 883

Kapitel 180: Urllib 884

Examples 884

HTTP GET 884

Python 2 884

Python 3 884

HTTP POST 885


Python 2 885

Python 3 885

Empfangene Bytes nach Inhaltstypen codieren 885

Kapitel 181: Variabler Geltungsbereich und Bindung 887

Syntax 887

Examples 887

Globale Variablen 887

Lokale Variablen 888

Nichtlokale Variablen 889

Verbindliches Vorkommen 890

Funktionen überspringen Klassenbereich beim Nachschlagen von Namen 890

Der Befehl del 891

del v 891

del v.name 891

del v[item] 892

del v[a:b] 892

Lokaler vs Globaler Geltungsbereich 892

Was ist lokal und global? 892

Was passiert bei Namenskonflikten? 893

Funktionen innerhalb von Funktionen 894

global vs. nonlocal (nur Python 3) 894

Kapitel 182: Vergleiche 896

Syntax 896

Parameter 896

Examples 896

Größer oder kleiner als 896

Nicht gleichzusetzen mit 897

Gleich 897

Kettenvergleiche 898

Stil 898

Nebenwirkungen 898
Vergleich von `is` vs` == ` 899

Objekte vergleichen 900

Common Gotcha: Python erzwingt keine Eingabe 901

Kapitel 183: Verknüpfte Listen 902

Einführung 902

Examples 902

Beispiel für eine einzelne verknüpfte Liste 902

Kapitel 184: Verknüpfter Listenknoten 906

Examples 906

Schreiben Sie einen einfachen Linked List-Knoten in Python 906

Kapitel 185: Versteckte Funktionen 907

Examples 907

Überladung des Bedieners 907

Kapitel 186: Verteilung 909

Examples 909

py2app 909

cx_Freeze 910

Kapitel 187: Vertiefung 912

Examples 912

Einrückungsfehler 912

Einfaches Beispiel 912

Leerzeichen oder Tabs? 913

Wie wird Einrückung analysiert? 913

Kapitel 188: Verwenden von Schleifen innerhalb von Funktionen 915

Einführung 915

Examples 915

Anweisung innerhalb einer Schleife in einer Funktion zurückgeben 915

Kapitel 189: Verwendung des "pip" -Moduls: PyPI Package Manager 916

Einführung 916

Syntax 916

Examples 917
Beispiel für die Verwendung von Befehlen 917

Behandlung der ImportError-Ausnahme 917

Installation erzwingen 918

Kapitel 190: Virtuelle Python-Umgebung - virtualenv 919

Einführung 919

Examples 919

Installation 919

Verwendungszweck 919

Installieren Sie ein Paket in Ihrer Virtualenv 920

Andere nützliche Virtualenv-Befehle 920

Kapitel 191: virtuelle Umgebung mit Virtualenvwrapper 921

Einführung 921

Examples 921

Erstellen Sie eine virtuelle Umgebung mit Virtualenvwrapper 921

Kapitel 192: Virtuelle Umgebungen 923

Einführung 923

Bemerkungen 923

Examples 923

Erstellen und Verwenden einer virtuellen Umgebung 923

Das Virtualenv-Tool installieren 923

Erstellen einer neuen virtuellen Umgebung 923

Aktivieren einer vorhandenen virtuellen Umgebung 924

Abhängigkeiten speichern und wiederherstellen 924

Beenden einer virtuellen Umgebung 925

Verwenden einer virtuellen Umgebung in einem gemeinsam genutzten Host 925

Eingebaute virtuelle Umgebungen 925

Pakete in einer virtuellen Umgebung installieren 926

Erstellen einer virtuellen Umgebung für eine andere Python-Version 927

Verwalten mehrerer virtueller Umgebungen mit virtualenvwrapper 927

Installation 928

Verwendungszweck 928
Projektverzeichnisse 928

Ermitteln, welche virtuelle Umgebung Sie verwenden 929

Festlegen einer bestimmten Python-Version zur Verwendung in Skripten unter Unix / Linux 929

Verwendung von Virtualenv mit Fischmuschel 930

Erstellen von virtuellen Umgebungen mit Anaconda 931

Erstellen Sie eine Umgebung 931

Aktivieren und deaktivieren Sie Ihre Umgebung 931

Zeigen Sie eine Liste der erstellten Umgebungen an 931

Entfernen Sie eine Umgebung 931

Überprüfen, ob in einer virtuellen Umgebung ausgeführt wird 932

Kapitel 193: Vorlagen in Python 933

Examples 933

Einfaches Datenausgabeprogramm mit Vorlage 933

Trennzeichen ändern 933

Kapitel 194: Vorrang des Bedieners 934

Einführung 934

Bemerkungen 934

Examples 935

Beispiele für einfache Operator-Priorität in Python. 935

Kapitel 195: Warteschlangenmodul 936

Einführung 936

Examples 936

Einfaches Beispiel 936

Kapitel 196: Webbrowser-Modul 937

Einführung 937

Syntax 937

Parameter 937

Bemerkungen 938

Examples 939

URL mit dem Standardbrowser öffnen 939

URL mit verschiedenen Browsern öffnen 939

Kapitel 197: Web-Scraping mit Python 941


Einführung 941

Bemerkungen 941

Nützliche Python-Pakete für das Web-Scraping (alphabetische Reihenfolge) 941

Anfragen stellen und Daten sammeln 941

requests 941

requests-cache 941

scrapy 941

selenium 941

HTML-Analyse 941

BeautifulSoup 942

lxml 942

Examples 942

Ein einfaches Beispiel für die Verwendung von Anforderungen und lxml zum Abwischen einiger 942

Web-Scraping-Sitzung mit Anforderungen verwalten 942

Scraping mit dem Scrapy-Framework 943

Ändern Sie den Scrapy-Benutzeragenten 943

Kratzen mit BeautifulSoup4 944

Kratzen mit Selenium WebDriver 944

Einfacher Download von Webinhalten mit urllib.request 945

Kratzen mit Locken 945

Kapitel 198: Webserver-Gateway-Schnittstelle (WSGI) 946

Parameter 946

Examples 946

Serverobjekt (Methode) 946

Kapitel 199: Websockets 948

Examples 948

Einfaches Echo mit aiohttp 948

Wrapper-Klasse mit aiohttp 948

Autobahn als Websocket-Fabrik nutzen 949

Kapitel 200: Wörterbuch 952

Syntax 952

Parameter 952
Bemerkungen 952

Examples 952

Zugriff auf Werte eines Wörterbuchs 952

Der dict () -Konstruktor 953

Vermeiden von KeyError-Ausnahmen 953

Zugriff auf Schlüssel und Werte 954

Einführung in das Wörterbuch 955

ein dikt erstellen 955

wörtliche Syntax 955

Diktierverständnis 955

eingebaute Klasse: dict() 956

ein dikt ändern 956

Wörterbuch mit Standardwerten 956

Ein geordnetes Wörterbuch erstellen 957

Wörterbücher mit dem Operator ** auspacken 957

Wörterbücher zusammenführen 958

Python 3.5+ 958

Python 3.3+ 958

Python 2.x, 3.x 958

Das nachfolgende Komma 959

Alle Kombinationen von Wörterbuchwerten 959

Iteration über ein Wörterbuch 960

Wörterbuch erstellen 960

Wörterbücher Beispiel 961

Kapitel 201: XML bearbeiten 963

Bemerkungen 963

Examples 963

Öffnen und Lesen mit einem ElementTree 963

Ändern einer XML-Datei 963

Erstellen und erstellen Sie XML-Dokumente 964

Öffnen und Lesen großer XML-Dateien mithilfe von iterparse (inkrementelles Parsing) 964
Durchsuchen des XML mit XPath 965

Kapitel 202: Zählen 967

Examples 967

Zählen aller Vorkommen aller Elemente in einer iterierbaren: collection.Counter 967

Den häufigsten Wert (-s) ermitteln: Collections.Counter.most_common () 967

Zählen der Vorkommen eines Elements in einer Sequenz: list.count () und tuple.count () 968

Zählen der Vorkommen eines Teilstrings in einem String: str.count () 968

Zählung von Vorkommen im numpy-Array 968

Kapitel 203: Zeichenfolgendarstellungen von Klasseninstanzen: __str__- und __repr__-Method


970

Bemerkungen 970

Ein Hinweis zum Implementieren beider Methoden 970

Anmerkungen 970

Examples 971

Motivation 971

Das Problem 972

Die Lösung (Teil 1) 972

Die Lösung (Teil 2) 973

Über diese duplizierten Funktionen ... 975

Zusammenfassung 975

Beide Methoden implementiert, Eval-Round-Trip-Stil __repr __ () 976

Kapitel 204: Zufälliges Modul 977

Syntax 977

Examples 977

Zufall und Sequenzen: Mischen, Auswahl und Probe 977

Mischen() 977

Wahl() 977

Probe() 977

Erstellen von zufälligen Ganzzahlen und Floats: Randint, Randrange, Random und Uniform 978

randint () 978

randrange () 978
zufällig 979

Uniform 979

Reproduzierbare Zufallszahlen: Samen und Zustand 979

Erstellen Sie kryptografisch sichere Zufallszahlen 980

Ein zufälliges Benutzerpasswort erstellen 981

Zufällige binäre Entscheidung 982

Kapitel 205: Zugriff auf Python-Quellcode und Bytecode 983

Examples 983

Zeigt den Bytecode einer Funktion an 983

Das Code-Objekt einer Funktion untersuchen 983

Zeigen Sie den Quellcode eines Objekts an 983

Objekte, die nicht eingebaut sind 983

Objekte interaktiv definiert 984

Eingebaute Objekte 984

Kapitel 206: zurückstellen 986

Einführung 986

Bemerkungen 986

Warnung: 986

Beschränkungen 986

Examples 987

Beispielcode für Regal 987

Um die Schnittstelle zusammenzufassen (Schlüssel ist eine Zeichenfolge, Daten ist ein beli 987

Ein neues Regal erstellen 987

Schreib zurück 988

Credits 991
Über
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: python-language

It is an unofficial and free Python Language ebook created for educational purposes. All the
content is extracted from Stack Overflow Documentation, which is written by many hardworking
individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official Python
Language.

The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.

Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to [email protected]

https://riptutorial.com/de/home 1
Kapitel 1: Erste Schritte mit Python Language
Bemerkungen

Python ist eine weit verbreitete Programmiersprache. Es ist:

• High-Level : Python automatisiert Low-Level-Vorgänge wie die Speicherverwaltung. Der


Programmierer hat etwas weniger Kontrolle, hat aber viele Vorteile, einschließlich Lesbarkeit
des Codes und minimale Code-Ausdrücke.

• Allzweck : Python kann in allen Kontexten und Umgebungen verwendet werden. Ein
Beispiel für eine nicht-allgemeinsprachliche Sprache ist PHP: PHP wurde speziell als
serverseitige Skriptsprache für die Webentwicklung entwickelt. Im Gegensatz dazu kann
Python für die serverseitige Web-Entwicklung verwendet werden, sondern auch Desktop -
Anwendungen für den Aufbau.

• Dynamisch geschrieben : Jede Variable in Python kann auf jeden Datentyp verweisen. Ein
einzelner Ausdruck kann zu unterschiedlichen Zeitpunkten Daten verschiedener Typen
auswerten. Daher ist folgender Code möglich:

if something:
x = 1
else:
x = 'this is a string'
print(x)

• Stark typisiert : Während der Programmausführung dürfen Sie nichts tun, was mit dem
Datentyp, mit dem Sie arbeiten, nicht kompatibel ist. Beispielsweise gibt es keine
versteckten Konvertierungen von Zeichenfolgen in Zahlen. Eine aus Ziffern bestehende
Zeichenfolge wird niemals als Zahl behandelt, wenn Sie sie nicht explizit konvertieren:

1 + '1' # raises an error


1 + int('1') # results with 2

• Anfängerfreundlich :) : Pythons Syntax und Struktur sind sehr intuitiv. Es ist auf hohem
Niveau und enthält Konstrukte, die das Schreiben klarer Programme in kleinem und großem
Maßstab ermöglichen. Python unterstützt mehrere Programmierparadigmen, einschließlich
objektorientierter, imperativer und funktionaler Programmierung oder prozeduraler Stile. Es
verfügt über eine umfangreiche, umfassende Standardbibliothek und viele einfach zu
installierende Bibliotheken von Drittanbietern.

Seine Gestaltungsprinzipien werden im Zen of Python beschrieben .

Derzeit gibt es zwei Hauptveröffentlichungszweige von Python, die einige signifikante

https://riptutorial.com/de/home 2
Unterschiede aufweisen. Python 2.x ist die Legacy-Version, obwohl sie immer noch weit verbreitet
ist. Python 3.x führt eine Reihe rückwärtskompatibler Änderungen durch, um die Duplizierung von
Funktionen zu reduzieren. In diesem Artikel erfahren Sie, wie Sie entscheiden können, welche
Version für Sie am besten geeignet ist .

Die offizielle Python-Dokumentation ist auch eine umfassende und nützliche Ressource, die
Dokumentation für alle Python-Versionen sowie Tutorials enthält, die Ihnen den Einstieg
erleichtern.

Es gibt eine offizielle Implementierung der von Python.org bereitgestellten Sprache, die im
Allgemeinen als CPython bezeichnet wird, und mehrere alternative Implementierungen der
Sprache auf anderen Laufzeitplattformen. Dazu gehören IronPython (auf dem .NET Python
ausgeführt wird), Jython (auf der Java-Laufzeitumgebung) und PyPy (das Python in einer
Teilmenge von sich selbst implementiert).

Versionen

Python 3.x

Ausführung Veröffentlichungsdatum

[3.7] 2017-05-08

3.6 2016-12-23

3,5 2015-09-13

3.4 2014-03-17

3.3 2012-09-29

3.2 2011-02-20

3.1 2009-06-26

3,0 2008-12-03

Python 2.x

Ausführung Veröffentlichungsdatum

2,7 2010-07-03

2.6 2008-10-02

2,5 2006-09-19

https://riptutorial.com/de/home 3
Ausführung Veröffentlichungsdatum

2.4 2004-11-30

2.3 2003-07-29

2.2 2001-12-21

2.1 2001-04-15

2,0 2000-10-16

Examples
Fertig machen

Python ist eine weit verbreitete Programmiersprache für allgemeine Zwecke, die von Guido van
Rossum entwickelt und erstmals 1991 veröffentlicht wurde. Python verfügt über ein dynamisches
Typsystem und eine automatische Speicherverwaltung und unterstützt mehrere
Programmierparadigmen, einschließlich objektorientierter, funktionale Programmierung und
prozedurale Stile. Es verfügt über eine große und umfassende Standardbibliothek.

Derzeit sind zwei Hauptversionen von Python aktiv:

• Python 3.x ist die aktuelle Version und wird derzeit weiterentwickelt.
• Python 2.x ist die ältere Version und wird bis 2020 nur Sicherheitsupdates erhalten. Es
werden keine neuen Funktionen implementiert. Beachten Sie, dass viele Projekte weiterhin
Python 2 verwenden, obwohl die Migration zu Python 3 einfacher wird.

Sie können beide Versionen von Python hier herunterladen und installieren. Siehe Python 3 vs.
Python 2 für einen Vergleich. Darüber hinaus bieten einige Drittanbieter neu verpackte Versionen
von Python an, die häufig verwendete Bibliotheken und andere Funktionen hinzufügen, um das
Einrichten allgemeiner Anwendungsfälle wie Mathematik, Datenanalyse oder wissenschaftliche
Verwendung zu erleichtern. Siehe die Liste auf der offiziellen Website .

Überprüfen Sie, ob Python installiert ist


Um zu bestätigen, dass Python korrekt installiert wurde, können Sie dies überprüfen, indem Sie
den folgenden Befehl in Ihrem bevorzugten Terminal ausführen (Wenn Sie ein Windows-
Betriebssystem verwenden, müssen Sie der Umgebungsvariablen den Pfad von Python
hinzufügen, bevor Sie ihn in der Eingabeaufforderung verwenden):

$ python --version

Python 3.x 3.0

Wenn Sie Python 3 installiert haben und dies Ihre Standardversion ist (weitere Informationen
finden Sie unter Fehlerbehebung ), sollten Sie etwa Folgendes sehen:

https://riptutorial.com/de/home 4
$ python --version
Python 3.6.0

Python 2.x 2.7

Wenn Sie Python 2 installiert haben und dies Ihre Standardversion ist (weitere Informationen
finden Sie unter Fehlerbehebung ), sollten Sie etwa Folgendes sehen:

$ python --version
Python 2.7.13

Wenn Sie Python 3 installiert haben, aber $ python --version eine Python 2-Version ausgibt,
haben Sie auch Python 2 installiert. Dies ist häufig auf MacOS und vielen Linux-Distributionen der
Fall. Verwenden $ python3 stattdessen $ python3 , um den Python 3-Interpreter explizit zu
verwenden.

Hallo, World in Python mit IDLE

IDLE ist ein einfacher Editor für Python, der im Lieferumfang von Python enthalten ist.

So erstellen Sie ein Hello, World-Programm in IDLE

• Öffnen Sie IDLE auf Ihrem System Ihrer Wahl.


○In älteren Windows-Versionen finden Sie es unter All Programs im Windows-Menü.
○Suchen Sie in Windows 8+ nach IDLE oder suchen Sie nach den Apps, die in Ihrem
System vorhanden sind.
○Auf Unix-basierten (einschließlich Mac) Systemen können Sie es von der Shell aus
öffnen, indem Sie $ idle python_file.py .
• Es wird eine Shell mit Optionen oben geöffnet.

In der Schale werden drei rechtwinklige Klammern angezeigt:

>>>

Schreiben Sie nun den folgenden Code in die Eingabeaufforderung:

>>> print("Hello, World")

Drücken Sie die Eingabetaste .

>>> print("Hello, World")


Hello, World

Hallo Welt Python-Datei


Erstellen Sie eine neue Datei hello.py , die die folgende Zeile enthält:

https://riptutorial.com/de/home 5
Python 3.x 3.0

print('Hello, World')

Python 2.x 2.6

Sie können die Python 3- print in Python 2 mit der folgenden import :

from __future__ import print_function

Python 2 verfügt über eine Reihe von Funktionalitäten, die optional mit dem Modul __future__ aus
Python 3 __future__ werden können, wie hier beschrieben .

Python 2.x 2.7

Wenn Sie Python 2 verwenden, können Sie auch die folgende Zeile eingeben. Beachten Sie, dass
dies in Python 3 nicht gültig ist und daher nicht empfohlen wird, da es die Kompatibilität von
Cross-Versionscode reduziert.

print 'Hello, World'

Navigieren Sie in Ihrem Terminal zu dem Verzeichnis, in dem sich die Datei hello.py .

python hello.py und python hello.py die Eingabetaste .

$ python hello.py
Hello, World

Sie sollten Hello, World auf der Konsole anzeigen.

Sie können auch hello.py durch den Pfad zu Ihrer Datei hello.py . Wenn sich die Datei
beispielsweise in Ihrem Home-Verzeichnis befindet und Ihr Benutzer unter Linux "Benutzer" ist,
können Sie python /home/user/hello.py .

Starten Sie eine interaktive Python-Shell


Durch Ausführen (Ausführen) des python Befehls in Ihrem Terminal wird eine interaktive Python-
Shell angezeigt. Dies wird auch als Python-Interpreter oder REPL (für "Read Evaluate Print Loop")
bezeichnet.

$ python
Python 2.7.12 (default, Jun 28 2016, 08:46:01)
[GCC 6.1.1 20160602] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print 'Hello, World'
Hello, World
>>>

Wenn Sie Python 3 von Ihrem Terminal aus ausführen python3 , führen Sie den Befehl python3 .

https://riptutorial.com/de/home 6
$ python3
Python 3.6.0 (default, Jan 13 2017, 00:00:00)
[GCC 6.1.1 20160602] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Hello, World')
Hello, World
>>>

Alternativ können Sie die interaktive Eingabeaufforderung starten und die Datei mit python -i
<file.py> .

Führen Sie in der Befehlszeile Folgendes aus:

$ python -i hello.py
"Hello World"
>>>

Es gibt mehrere Möglichkeiten, die Python-Shell zu schließen:

>>> exit()

oder

>>> quit()

Alternativ schließen Sie STRG + D die Shell und setzen Sie wieder in die Befehlszeile Ihres
Terminals.

Wenn Sie einen Befehl abbrechen möchten, befinden Sie sich mitten in der Eingabe und kehren
zu einer Eingabeaufforderung zum Reinigen zurück, während Sie sich in der Interpreter-Shell
befinden, und drücken Sie STRG + C.

Testen Sie eine interaktive Python-Shell online .

Andere Online-Shells
Verschiedene Websites bieten Online-Zugriff auf Python-Shells.

Online-Shells können für folgende Zwecke nützlich sein:

• Führen Sie ein kleines Code-Snippet von einer Maschine aus, auf der Python-Installation
fehlt (Smartphones, Tablets usw.).
• Lernen oder lehren Sie grundlegende Python.
• Lösen Sie Online-Richterprobleme.

Beispiele:

Haftungsausschluss: Dokumentationsautor (en) sind nicht mit den unten aufgeführten


Ressourcen verbunden.

https://riptutorial.com/de/home 7
• https://www.python.org/shell/ - Die auf der offiziellen Python-Website gehostete Online-
Python-Shell.
• https://ideone.com/ - Wird im Internet häufig verwendet, um das Verhalten von
Codeausschnitten darzustellen.
• https://repl.it/languages/python3 - Leistungsfähiger und einfacher Online-Compiler, IDE und
Interpreter. Code programmieren, kompilieren und Code in Python ausführen.
• https://www.tutorialspoint.com/execute_python_online.php - Eine voll funktionsfähige UNIX-
Shell und ein benutzerfreundlicher Projektexplorer.
• http://rextester.com/l/python3_online_compiler - Einfache und benutzerfreundliche IDE, die
die Ausführungszeit anzeigt

Befehle als String ausführen


Python kann beliebigen Code als String in der Shell übergeben werden:

$ python -c 'print("Hello, World")'


Hello, World

Dies kann hilfreich sein, wenn Sie die Ergebnisse von Skripts in der Shell miteinander verketten.

Muscheln und jenseits


Paketverwaltung - Das von PyPA empfohlene Werkzeug zum Installieren von Python-Paketen ist
PIP . Zur Installation führen Sie auf Ihrer Kommandozeile pip install <the package name> . Zum
Beispiel pip install numpy . (Hinweis: Unter Windows müssen Sie den PATH-
Umgebungsvariablen pip hinzufügen. Um dies zu vermeiden, verwenden Sie python -m pip
install <the package name> )

Shells - Bisher haben wir verschiedene Möglichkeiten zur Ausführung von Code mit Pythons
nativer interaktiver Shell beschrieben. Shells verwenden Pythons Interpretationskraft, um mit Code
in Echtzeit zu experimentieren. Zu den alternativen Shells gehören IDLE - eine vorgefertigte GUI,
IPython -, die für die Erweiterung der interaktiven Erfahrung usw. bekannt ist.

Programme - Zur Langzeitspeicherung können Sie Inhalte in .py-Dateien speichern und als
Skripte oder Programme mit externen Tools wie Shell, IDEs (wie PyCharm ), Jupyter-Notebooks
usw. bearbeiten / ausführen. Benutzer mit Zwischenspeicher können diese Tools verwenden. Die
hier besprochenen Methoden reichen jedoch für den Einstieg aus.

Mit dem Python-Tutor können Sie schrittweise durch den Python-Code navigieren, um zu
visualisieren, wie das Programm abläuft, und hilft Ihnen zu verstehen, wo Ihr Programm fehlerhaft
ist.

PEP8 definiert Richtlinien zum Formatieren von Python-Code. Das Formatieren von Code ist
wichtig, damit Sie schnell lesen können, was der Code bewirkt.

https://riptutorial.com/de/home 8
Variablen anlegen und Werte zuweisen

Um eine Variable in Python zu erstellen, müssen Sie nur den Variablennamen angeben und
dieser einen Wert zuweisen.

<variable name> = <value>

Python verwendet = , um Variablen Werte zuzuweisen. Es ist nicht erforderlich, eine Variable im
Voraus zu deklarieren (oder ihr einen Datentyp zuzuweisen). Wenn Sie einer Variablen einen Wert
zuweisen, deklariert und initialisiert sie die Variable mit diesem Wert. Es gibt keine Möglichkeit,
eine Variable zu deklarieren, ohne ihr einen Anfangswert zuzuweisen.

# Integer
a = 2
print(a)
# Output: 2

# Integer
b = 9223372036854775807
print(b)
# Output: 9223372036854775807

# Floating point
pi = 3.14
print(pi)
# Output: 3.14

# String
c = 'A'
print(c)
# Output: A

# String
name = 'John Doe'
print(name)
# Output: John Doe

# Boolean
q = True
print(q)
# Output: True

# Empty value or null data type


x = None
print(x)
# Output: None

Die variable Zuweisung funktioniert von links nach rechts. Im Folgenden erhalten Sie einen
Syntaxfehler.

0 = x
=> Output: SyntaxError: can't assign to literal

Sie können die Schlüsselwörter von python nicht als gültigen Variablennamen verwenden. Sie
können die Liste der Keywords anzeigen:

https://riptutorial.com/de/home 9
import keyword
print(keyword.kwlist)

Regeln für die Benennung von Variablen:

1. Variablennamen müssen mit einem Buchstaben oder einem Unterstrich beginnen.

x = True # valid
_y = True # valid

9x = False # starts with numeral


=> SyntaxError: invalid syntax

$y = False # starts with symbol


=> SyntaxError: invalid syntax

2. Der Rest Ihres Variablennamens kann aus Buchstaben, Zahlen und Unterstrichen bestehen.

has_0_in_it = "Still Valid"

3. Namen sind case sensitive.

x = 9
y = X*5
=>NameError: name 'X' is not defined

Obwohl bei der Deklaration einer Variablen in Python kein Datentyp angegeben werden muss,
während der erforderliche Speicherbereich für die Variable reserviert wird, wählt der Python-
Interpreter automatisch den am besten geeigneten integrierten Typ dafür aus:

a = 2
print(type(a))
# Output: <type 'int'>

b = 9223372036854775807
print(type(b))
# Output: <type 'int'>

pi = 3.14
print(type(pi))
# Output: <type 'float'>

c = 'A'
print(type(c))
# Output: <type 'str'>

name = 'John Doe'


print(type(name))
# Output: <type 'str'>

q = True
print(type(q))
# Output: <type 'bool'>

https://riptutorial.com/de/home 10
x = None
print(type(x))
# Output: <type 'NoneType'>

Jetzt kennen Sie die Grundlagen der Zuweisung. Lassen Sie uns diese Feinheiten über die
Zuweisung in Python aus dem Weg räumen.

Wenn Sie = für eine Zuweisungsoperation verwenden, ist links von = ein Name für das Objekt auf
der rechten Seite. Schließlich , was = tut , ist die Referenz des Objekts auf der linken Seite auf der
rechten Seite auf den Namen zuweisen.

Das ist:

a_name = an_object # "a_name" is now a name for the reference to the object "an_object"

Wenn wir also aus vielen Zuordnungsbeispielen oben pi = 3.14 auswählen, ist pi ein Name (nicht
der Name, da ein Objekt mehrere Namen haben kann) für das Objekt 3.14 . Wenn Sie unten
etwas nicht verstehen, kommen Sie zu diesem Punkt zurück und lesen Sie das noch einmal! Sie
können dies auch zum besseren Verständnis betrachten.

Sie können mehreren Variablen in einer Zeile mehrere Werte zuweisen. Beachten Sie, dass auf
der rechten und linken Seite des Operators = die gleiche Anzahl von Argumenten vorhanden sein
muss:

a, b, c = 1, 2, 3
print(a, b, c)
# Output: 1 2 3

a, b, c = 1, 2
=> Traceback (most recent call last):
=> File "name.py", line N, in <module>
=> a, b, c = 1, 2
=> ValueError: need more than 2 values to unpack

a, b = 1, 2, 3
=> Traceback (most recent call last):
=> File "name.py", line N, in <module>
=> a, b = 1, 2, 3
=> ValueError: too many values to unpack

Der Fehler im letzten Beispiel kann vermieden werden, indem der gleichen Anzahl von beliebigen
Variablen verbleibende Werte zugewiesen werden. Diese Dummy-Variable kann einen beliebigen
Namen haben, es ist jedoch üblich, den Unterstrich ( _ ) zum Zuweisen unerwünschter Werte zu
verwenden:

a, b, _ = 1, 2, 3
print(a, b)
# Output: 1, 2

Beachten Sie, dass die Anzahl von _ und die Anzahl der verbleibenden Werte gleich sein müssen.

https://riptutorial.com/de/home 11
Andernfalls wird "zu viele Werte zum Auspacken des Fehlers" wie oben ausgegeben:

a, b, _ = 1,2,3,4
=>Traceback (most recent call last):
=>File "name.py", line N, in <module>
=>a, b, _ = 1,2,3,4
=>ValueError: too many values to unpack (expected 3)

Sie können auch mehreren Variablen gleichzeitig einen einzelnen Wert zuweisen.

a = b = c = 1
print(a, b, c)
# Output: 1 1 1

Wenn Sie eine solche kaskadierende Zuweisung verwenden, ist es wichtig zu beachten, dass sich
alle drei Variablen a , b und c auf dasselbe Objekt im Speicher beziehen, ein int Objekt mit dem
Wert 1. Mit anderen Worten sind a , b und c drei verschiedene Namen auf dasselbe int Objekt
gegeben. Wenn Sie einem Objekt anschließend ein anderes Objekt zuweisen, werden die
anderen Objekte nicht wie erwartet geändert:

a = b = c = 1 # all three names a, b and c refer to same int object with value 1
print(a, b, c)
# Output: 1 1 1
b = 2 # b now refers to another int object, one with a value of 2
print(a, b, c)
# Output: 1 2 1 # so output is as expected.

Das Obige gilt auch für veränderliche Typen (wie list , dict usw.), ebenso wie für unveränderliche
Typen (wie int , string , tuple usw.):

x = y = [7, 8, 9] # x and y refer to the same list object just created, [7, 8, 9]
x = [13, 8, 9] # x now refers to a different list object just created, [13, 8, 9]
print(y) # y still refers to the list it was first assigned
# Output: [7, 8, 9]

So weit, ist es gut. Bei der Änderung des Objekts sieht die Sache etwas anders aus (im
Gegensatz zur Zuweisung des Namens zu einem anderen Objekt, wie oben beschrieben), wenn
die kaskadierende Zuordnung für veränderliche Typen verwendet wird. Schauen Sie unten, und
Sie werden es aus erster Hand sehen:

x = y = [7, 8, 9] # x and y are two different names for the same list object just created,
[7, 8, 9]
x[0] = 13 # we are updating the value of the list [7, 8, 9] through one of its
names, x in this case
print(y) # printing the value of the list using its other name
# Output: [13, 8, 9] # hence, naturally the change is reflected

Verschachtelte Listen sind auch in Python gültig. Das bedeutet, dass eine Liste eine andere Liste
als Element enthalten kann.

https://riptutorial.com/de/home 12
x = [1, 2, [3, 4, 5], 6, 7] # this is nested list
print x[2]
# Output: [3, 4, 5]
print x[2][1]
# Output: 4

Schließlich müssen Variablen in Python nicht den Typ beibehalten, für den sie zuerst definiert
wurden. Sie können einfach = , um einer Variablen einen neuen Wert zuzuweisen, selbst wenn
dieser Wert einen anderen Typ hat.

a = 2
print(a)
# Output: 2

a = "New value"
print(a)
# Output: New value

Wenn dies Sie stört, denken Sie darüber nach, dass das, was links von = ist, nur ein Name für ein
Objekt ist. Zuerst Sie den Anruf int mit dem Wert 2 Objekt a , dann ändern Sie Ihre Meinung und
entscheiden , den Namen zu geben , a zu einem string - Objekt, Wert ‚Neuer Wert‘ mit. Einfach,
richtig?

Benutzereingabe

Interaktive Eingabe

Um vom Benutzer Eingaben zu erhalten, verwenden Sie die input ( Hinweis : In Python 2.x heißt
die Funktion stattdessen raw_input , obwohl Python 2.x eine eigene input , die sich völlig
unterscheidet):

Python 2.x 2.3

name = raw_input("What is your name? ")


# Out: What is your name? _

Sicherheitshinweis Verwenden Sie input() in Python2 - der eingegebene Text wird


wie ein Python-Ausdruck (entspricht eval(input()) in Python3) ausgewertet, der leicht
zu einer Sicherheitsanfälligkeit werden kann. In diesem Artikel finden Sie weitere
Informationen zu den Risiken bei der Verwendung dieser Funktion.

Python 3.x 3.0

name = input("What is your name? ")


# Out: What is your name? _

Der Rest dieses Beispiels verwendet die Python 3-Syntax.

Die Funktion nimmt ein Zeichenfolgenargument an, das es als Eingabeaufforderung anzeigt und
eine Zeichenfolge zurückgibt. Der obige Code bietet eine Eingabeaufforderung, die auf die
Eingabe des Benutzers wartet.

https://riptutorial.com/de/home 13
name = input("What is your name? ")
# Out: What is your name?

Wenn der Benutzer „Bob“ und Hits eingeben, der Variable name wird mit dem String zugewiesen
werden "Bob" :

name = input("What is your name? ")


# Out: What is your name? Bob
print(name)
# Out: Bob

Beachten Sie, dass die input immer vom Typ str ist. str ist wichtig, wenn der Benutzer Zahlen
eingeben soll. Daher müssen Sie den str konvertieren, bevor Sie ihn als Zahl verwenden str :

x = input("Write a number:")
# Out: Write a number: 10
x / 2
# Out: TypeError: unsupported operand type(s) for /: 'str' and 'int'
float(x) / 2
# Out: 5.0

Hinweis: Es wird empfohlen, try / except Blöcke zu verwenden, um Ausnahmen bei


Benutzereingaben abzufangen . Wenn zum Beispiel Ihr Code einen raw_input in ein int
umwandeln möchte und der Benutzer nichts zu schreiben hat, ist dies nicht der ValueError . Dies
führt zu einem ValueError .

IDLE - Python-GUI

IDLE ist die integrierte Entwicklungs- und Lernumgebung von Python und ist eine Alternative zur
Befehlszeile. Wie der Name schon sagt, ist IDLE sehr nützlich, um neuen Code zu entwickeln
oder Python zu lernen. Unter Windows wird dieser mit dem Python-Interpreter ausgeliefert. Bei
anderen Betriebssystemen müssen Sie ihn möglicherweise über Ihren Paketmanager installieren.

Die Hauptziele von IDLE sind:

• Texteditor für mehrere Fenster mit Syntaxhervorhebung, Autovervollständigung und


intelligentem Einzug
• Python-Shell mit Syntaxhervorhebung
• Integrierter Debugger mit schrittweisen, dauerhaften Haltepunkten und Sichtbarkeit der
Aufrufstapel
• Automatische Einrückung (nützlich für Anfänger, die etwas über Pythons Einzug erfahren)
• Speichern Sie das Python-Programm als .py-Dateien, führen Sie sie aus und bearbeiten Sie
sie später mit IDLE.

Drücken Sie unter IDLE die Taste F5 oder run Python Shell , um einen Interpreter zu starten. Die
Verwendung von IDLE kann für neue Benutzer eine bessere Lernerfahrung sein, da Code beim
Schreiben des Benutzers interpretiert wird.

Beachten Sie, dass es viele Alternativen gibt, siehe zum Beispiel diese Diskussion oder diese

https://riptutorial.com/de/home 14
Liste .

Fehlerbehebung
• Windows

Unter Windows ist der Standardbefehl python . Wenn Sie den Fehler "'python' is not
recognized" , liegt die wahrscheinlichste Ursache darin, dass sich der Ort von Python nicht in
der Umgebungsvariablen PATH Ihres Systems befindet. Sie können auf diesen zugreifen,
indem Sie mit der rechten Maustaste auf 'Arbeitsplatz' klicken und 'Eigenschaften'
auswählen oder über 'Systemsteuerung' zu 'System' navigieren. Klicken Sie auf "Erweiterte
Systemeinstellungen" und dann auf "Umgebungsvariablen ...". Bearbeiten Sie die PATH
Variable, um das Verzeichnis Ihrer Python-Installation sowie den
C:\Python27;C:\Python27\Scripts (normalerweise C:\Python27;C:\Python27\Scripts )
C:\Python27;C:\Python27\Scripts . Dies erfordert Administratorrechte und erfordert
möglicherweise einen Neustart.

Wenn Sie mehrere Versionen von Python auf demselben Computer verwenden, können Sie
eine der python.exe Dateien umbenennen. Wenn Sie beispielsweise eine Version
python27.exe python27 , wird python27 zum Python-Befehl für diese Version.

Sie können auch den Python Launcher für Windows verwenden, der im
Installationsprogramm verfügbar ist und standardmäßig enthalten ist. Sie können die Version
von Python auswählen, indem Sie py -[xy] anstelle von python[xy] . Sie können die neueste
Version von Python 2 verwenden, indem Sie Skripts mit py -2 und die neueste Version von
Python 3 py -3 indem Sie Skripts mit py -3 .

• Debian / Ubuntu / MacOS

In diesem Abschnitt wird davon ausgegangen, dass die Position der ausführbaren python
Datei der Umgebungsvariablen PATH hinzugefügt wurde.

Wenn Sie Debian / Ubuntu / MacOS verwenden, öffnen Sie das Terminal und geben Sie
python für Python 2.x oder python3 für Python 3.x ein.

Geben Sie which python zu sehen, welcher Python-Interpreter verwendet wird.

• Arch Linux

Der Standard-Python für Arch Linux (und seine Nachkommen) ist Python 3. Verwenden Sie
daher python oder python3 für Python 3.x und python2 für Python 2.x.

• Andere Systeme

Python 3 ist manchmal an python statt an python3 gebunden. Um Python 2 auf diesen
Systemen, auf denen es installiert ist, zu verwenden, können Sie python2 .

Datentypen

https://riptutorial.com/de/home 15
Eingebaute Typen
Booleaner
bool: Ein boolescher Wert von " True oder " False . Logische Operationen wie and , or , not auf
booleans durchgeführt werden.

x or y # if x is False then y otherwise x


x and y # if x is False then x otherwise y
not x # if x is True then False, otherwise True

In Python 2.x und Python 3.x ist ein Boolean auch ein int . Der bool Typ ist eine Unterklasse des
int Typs, und True und False sind die einzigen Instanzen:

issubclass(bool, int) # True

isinstance(True, bool) # True


isinstance(False, bool) # True

Wenn boolesche Werte in arithmetischen Operationen verwendet werden, werden ihre


ganzzahligen Werte ( 1 und 0 für True und False ) verwendet, um ein ganzzahliges Ergebnis
zurückzugeben:

True + False == 1 # 1 + 0 == 1
True * True == 1 # 1 * 1 == 1

Zahlen
• int : Ganzzahl

a = 2
b = 100
c = 123456789
d = 38563846326424324

Ganzzahlen in Python sind von beliebiger Größe.

Hinweis: In älteren Versionen von Python war ein long Typ verfügbar, der sich von int . Die
beiden wurden vereinheitlicht.

• float: Fließkommazahl; Die Genauigkeit hängt von der Implementierung und der
Systemarchitektur ab. Bei CPython entspricht der float Datentyp einem C-Double.

a = 2.0
b = 100.e0
c = 123456789.e1

• complex

https://riptutorial.com/de/home 16
: Komplexe Zahlen

a = 2 + 1j
b = 100 + 10j

Die Operatoren < , <= , > und >= TypeError eine TypeError Exception aus, wenn ein Operand eine
komplexe Zahl ist.

Zeichenketten
Python 3.x 3.0

• str : eine Unicode-Zeichenfolge . Die Art von 'hello'


• bytes : eine Bytefolge . Die Art von b'hello'

Python 2.x 2.7

• str : eine Bytefolge . Die Art von 'hello'


• bytes : synonym für str
• unicode : eine Unicode-Zeichenfolge . Die Art von u'hello'

Sequenzen und Sammlungen


Python unterscheidet zwischen geordneten Sequenzen und ungeordneten Sammlungen (wie set
und dict ).

• Zeichenfolgen ( str , bytes , unicode ) sind Sequenzen

• reversed : Eine umgekehrte Reihenfolge von str mit reversed Funktion

a = reversed('hello')

• tuple : Eine geordnete Sammlung von n Werten eines beliebigen Typs ( n >= 0 ).

a = (1, 2, 3)
b = ('a', 1, 'python', (1, 2))
b[2] = 'something else' # returns a TypeError

Unterstützt die Indizierung; unveränderlich; hashable, wenn alle seine Mitglieder hashable
sind

• list : Eine geordnete Sammlung von n Werten ( n >= 0 )

a = [1, 2, 3]
b = ['a', 1, 'python', (1, 2), [1, 2]]
b[2] = 'something else' # allowed

Nicht hashbar; veränderlich.

https://riptutorial.com/de/home 17
• set : Eine ungeordnete Sammlung eindeutiger Werte. Elemente müssen hashbar sein .

a = {1, 2, 'a'}

• dict: Eine ungeordnete Sammlung eindeutiger Schlüssel-Wert-Paare. Schlüssel müssen


hashbar sein .

a = {1: 'one',
2: 'two'}

b = {'a': [1, 2, 3],


'b': 'a string'}

Ein Objekt ist hashbar, wenn es einen Hashwert hat, der sich während seiner
Lebensdauer niemals ändert (es benötigt eine __hash__() Methode) und kann mit
anderen Objekten verglichen werden (es benötigt eine __eq__() Methode). Hashfähige
Objekte, die Gleichheit vergleichen, müssen denselben Hashwert haben.

Eingebaute Konstanten
In Verbindung mit den integrierten Datentypen gibt es eine kleine Anzahl von eingebauten
Konstanten im integrierten Namespace:

• : Der wahre Wert des eingebauten bool


True
• False : Der False-Wert des integrierten Typs bool
• None : Ein Einzelobjekt, das signalisiert, dass ein Wert nicht vorhanden ist.
• Ellipsis oder ... : Wird in Core Python3 + überall und in Python2.7 + als Teil der Array-
Notation verwendet. numpy und verwandte Pakete verwenden dies als Referenz für "alles
einschließen" in Arrays.
• NotImplemented : Ein Singleton, der Python NotImplemented , dass eine spezielle Methode die
bestimmten Argumente nicht unterstützt, und Python versucht Alternativen, falls verfügbar.

a = None # No value will be assigned. Any valid datatype can be assigned later

Python 3.x 3.0

None hat keine natürliche Reihenfolge. Die Verwendung von Sortiervergleichsoperatoren ( < , <= , >=
, > ) wird nicht mehr unterstützt und führt zu einem TypeError .

Python 2.x 2.7

None ist immer kleiner als eine beliebige Zahl ( None < -32 zu True ausgewertet).

Testen des Variablentyps


In Python können wir den Datentyp eines Objekts überprüfen Sie die integrierte Funktion mit type .

https://riptutorial.com/de/home 18
a = '123'
print(type(a))
# Out: <class 'str'>
b = 123
print(type(b))
# Out: <class 'int'>

In Bedingungsanweisungen ist es möglich, den Datentyp mit einer isinstance zu testen. Es wird
jedoch normalerweise nicht empfohlen, sich auf den Typ der Variablen zu verlassen.

i = 7
if isinstance(i, int):
i += 1
elif isinstance(i, str):
i = int(i)
i += 1

Informationen zu den Unterschieden zwischen type() und isinstance() Sie unter: Unterschiede
zwischen isinstance und type in Python

So testen Sie, ob etwas von NoneType :

x = None
if x is None:
print('Not a surprise, I just defined x as None.')

Konvertierung zwischen Datentypen


Sie können eine explizite Datentypkonvertierung durchführen.

Zum Beispiel ist '123' vom Typ str und kann mit int Funktion in eine Ganzzahl umgewandelt
werden.

a = '123'
b = int(a)

Die Konvertierung von einem Float-String wie '123.456' kann mit der float Funktion erfolgen.

a = '123.456'
b = float(a)
c = int(a) # ValueError: invalid literal for int() with base 10: '123.456'
d = int(b) # 123

Sie können auch Sequenz- oder Sammlungstypen konvertieren

a = 'hello'
list(a) # ['h', 'e', 'l', 'l', 'o']
set(a) # {'o', 'e', 'l', 'h'}
tuple(a) # ('h', 'e', 'l', 'l', 'o')

https://riptutorial.com/de/home 19
Expliziter Zeichenfolgentyp bei der Definition
von Literalen
Mit einem Buchstaben vor den Anführungszeichen können Sie feststellen, welche Art von
Zeichenfolge Sie definieren möchten.

• b'foo bar' : Ergebnisse bytes in Python 3 str in Python 2


• u'foo bar' : Ergebnisse str in Python 3, unicode in Python 2
• 'foo bar' : Ergebnisse str
• r'foo bar' : führt zu einer so genannten rohen Zeichenfolge, bei der das r'foo bar'
Sonderzeichen nicht erforderlich ist. Während der Eingabe wird alles wörtlich genommen

normal = 'foo\nbar' # foo


# bar
escaped = 'foo\\nbar' # foo\nbar
raw = r'foo\nbar' # foo\nbar

Veränderliche und unveränderliche


Datentypen
Ein Objekt wird als veränderlich bezeichnet, wenn es geändert werden kann. Wenn Sie
beispielsweise eine Liste an eine Funktion übergeben, kann die Liste geändert werden:

def f(m):
m.append(3) # adds a number to the list. This is a mutation.

x = [1, 2]
f(x)
x == [1, 2] # False now, since an item was added to the list

Ein Objekt wird als unveränderlich bezeichnet, wenn es in keiner Weise geändert werden kann.
Zum Beispiel sind Ganzzahlen unveränderlich, da sie nicht geändert werden können:

def bar():
x = (1, 2)
g(x)
x == (1, 2) # Will always be True, since no function can change the object (1, 2)

Beachten Sie, dass Variablen selbst veränderbar sind, sodass wir die Variable x neu zuweisen
können. Dies ändert jedoch nicht das Objekt, auf das x zuvor gezeigt hat. Es wurde nur x auf ein
neues Objekt gesetzt.

Datentypen, deren Instanzen veränderlich sind, werden als veränderliche Datentypen bezeichnet
und für unveränderliche Objekte und Datentypen gleichermaßen.

https://riptutorial.com/de/home 20
Beispiele für unveränderliche Datentypen:

• int , long , float , complex


• str
• bytes
• tuple
• frozenset

Beispiele für veränderliche Datentypen:

• bytearray
• list
• set
• dict

Eingebaute Module und Funktionen

Ein Modul ist eine Datei, die Python-Definitionen und Anweisungen enthält. Funktion ist ein Stück
Code, der einige Logik ausführt.

>>> pow(2,3) #8

Um die eingebaute Funktion in Python zu überprüfen, können wir dir(). Wenn Sie ohne Argument
aufgerufen werden, geben Sie die Namen im aktuellen Bereich zurück. Andernfalls wird eine
alphabetische Liste von Namen zurückgegeben, die (einige) das Attribut des angegebenen
Objekts sowie die von ihm erreichbaren Attribute enthalten.

>>> dir(__builtins__)
[
'ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'BufferError',
'BytesWarning',
'DeprecationWarning',
'EOFError',
'Ellipsis',
'EnvironmentError',
'Exception',
'False',
'FloatingPointError',
'FutureWarning',
'GeneratorExit',
'IOError',
'ImportError',
'ImportWarning',
'IndentationError',
'IndexError',
'KeyError',
'KeyboardInterrupt',
'LookupError',
'MemoryError',
'NameError',
'None',

https://riptutorial.com/de/home 21
'NotImplemented',
'NotImplementedError',
'OSError',
'OverflowError',
'PendingDeprecationWarning',
'ReferenceError',
'RuntimeError',
'RuntimeWarning',
'StandardError',
'StopIteration',
'SyntaxError',
'SyntaxWarning',
'SystemError',
'SystemExit',
'TabError',
'True',
'TypeError',
'UnboundLocalError',
'UnicodeDecodeError',
'UnicodeEncodeError',
'UnicodeError',
'UnicodeTranslateError',
'UnicodeWarning',
'UserWarning',
'ValueError',
'Warning',
'ZeroDivisionError',
'__debug__',
'__doc__',
'__import__',
'__name__',
'__package__',
'abs',
'all',
'any',
'apply',
'basestring',
'bin',
'bool',
'buffer',
'bytearray',
'bytes',
'callable',
'chr',
'classmethod',
'cmp',
'coerce',
'compile',
'complex',
'copyright',
'credits',
'delattr',
'dict',
'dir',
'divmod',
'enumerate',
'eval',
'execfile',
'exit',
'file',
'filter',

https://riptutorial.com/de/home 22
'float',
'format',
'frozenset',
'getattr',
'globals',
'hasattr',
'hash',
'help',
'hex',
'id',
'input',
'int',
'intern',
'isinstance',
'issubclass',
'iter',
'len',
'license',
'list',
'locals',
'long',
'map',
'max',
'memoryview',
'min',
'next',
'object',
'oct',
'open',
'ord',
'pow',
'print',
'property',
'quit',
'range',
'raw_input',
'reduce',
'reload',
'repr',
'reversed',
'round',
'set',
'setattr',
'slice',
'sorted',
'staticmethod',
'str',
'sum',
'super',
'tuple',
'type',
'unichr',
'unicode',
'vars',
'xrange',
'zip'
]

Um die Funktionalität einer beliebigen Funktion kennen, können wir in Funktion nutzen gebaut
help .

https://riptutorial.com/de/home 23
>>> help(max)
Help on built-in function max in module __builtin__:
max(...)
max(iterable[, key=func]) -> value
max(a, b, c, ...[, key=func]) -> value
With a single iterable argument, return its largest item.
With two or more arguments, return the largest argument.

Eingebaute Module enthalten zusätzliche Funktionalitäten. Um beispielsweise Quadratwurzeln


einer Zahl zu erhalten, müssen wir ein math hinzufügen.

>>> import math


>>> math.sqrt(16) # 4.0

Um alle Funktionen in einem Modul zu kennen, können wir die Funktionsliste einer Variablen
zuweisen und dann die Variable drucken.

>>> import math


>>> dir(math)

['__doc__', '__name__', '__package__', 'acos', 'acosh',


'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign',
'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1',
'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma',
'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10',
'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt',
'tan', 'tanh', 'trunc']

Es scheint, dass __doc__ nützlich ist, um beispielsweise in Funktionen einige Dokumentation


bereitzustellen

>>> math.__doc__
'This module is always available. It provides access to the\nmathematical
functions defined by the C standard.'

Neben Funktionen kann Dokumentation auch in Modulen bereitgestellt werden. Wenn Sie also
eine Datei namens helloWorld.py wie helloWorld.py :

"""This is the module docstring."""

def sayHello():
"""This is the function docstring."""
return 'Hello World'

Sie können auf die Dokumentstrings folgendermaßen zugreifen:

>>> import helloWorld


>>> helloWorld.__doc__
'This is the module docstring.'
>>> helloWorld.sayHello.__doc__
'This is the function docstring.'

• Für jeden benutzerdefinierten Typ können seine Attribute, die Attribute seiner Klasse und

https://riptutorial.com/de/home 24
rekursiv die Attribute der Basisklassen seiner Klasse mit dir () abgerufen werden.

>>> class MyClassObject(object):


... pass
...
>>> dir(MyClassObject)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

Jeder Datentyp kann einfach mit einer eingebauten Funktion namens str in String konvertiert
werden. Diese Funktion wird standardmäßig aufgerufen, wenn ein Datentyp an den print

>>> str(123) # "123"

Einrückung blockieren

Python verwendet Einrückungen zum Definieren von Steuerungs- und Schleifenkonstrukten. Dies
trägt zur Lesbarkeit von Python bei, erfordert jedoch, dass der Programmierer der Verwendung
von Leerzeichen große Aufmerksamkeit widmet. Die Fehlkalibrierung des Editors kann daher zu
Code führen, der sich unerwartet verhält.

Python verwendet das Doppelpunkt - Zeichen ( : ) und Vertiefung zu zeigen , wo Codeblocks


beginnen und enden (Wenn Sie aus einer anderen Sprache kommen, nicht zu verwechseln diese
mit irgendwie mit dem zusammenhängt ternären Operator ). Das heißt, Blöcke in Python, wie z. B.
Funktionen, Schleifen, if Klauseln und andere Konstrukte, haben keine Endekennungen. Alle
Blöcke beginnen mit einem Doppelpunkt und enthalten dann die eingerückten Zeilen darunter.

Zum Beispiel:

def my_function(): # This is a function definition. Note the colon (:)


a = 2 # This line belongs to the function because it's indented
return a # This line also belongs to the same function
print(my_function()) # This line is OUTSIDE the function block

oder

if a > b: # If block starts here


print(a) # This is part of the if block
else: # else must be at the same level as if
print(b) # This line is part of the else block

Blöcke, die genau eine einzeilige Anweisung enthalten, können in dieselbe Zeile eingefügt
werden, obwohl dieses Formular im Allgemeinen nicht als guter Stil gilt:

if a > b: print(a)
else: print(b)

Der Versuch, dies mit mehr als einer einzelnen Anweisung zu tun, funktioniert nicht :

https://riptutorial.com/de/home 25
if x > y: y = x
print(y) # IndentationError: unexpected indent

if x > y: while y != z: y -= 1 # SyntaxError: invalid syntax

Ein leerer Block verursacht einen IndentationError . Verwenden Sie pass (ein Befehl, der nichts
tut), wenn Sie einen Block ohne Inhalt haben:

def will_be_implemented_later():
pass

Leerzeichen vs. Tabs


Kurz gesagt: Verwenden Sie immer 4 Felder für die Einrückung.

Die ausschließliche Verwendung von Registerkarten ist möglich, PEP 8 , der Style-Guide für
Python-Code, besagt, dass Leerzeichen bevorzugt werden.

Python 3.x 3.0

In Python 3 ist das Mischen von Tabs und Leerzeichen für die Einrückung nicht zulässig. In
diesem Fall wird ein Fehler bei der Kompilierung generiert: Inconsistent use of tabs and spaces in
indentation und das Programm wird nicht ausgeführt.

Python 2.x 2.7

Python 2 erlaubt das Mischen von Tabs und Leerzeichen beim Einrücken. Dies wird dringend
empfohlen. Das Tabulatorzeichen schließt den vorherigen Einzug mit einem Vielfachen von 8
Leerzeichen ab . Da Editoren üblicherweise so konfiguriert sind, dass Registerkarten als mehrere
von vier Leerzeichen angezeigt werden, kann dies zu geringfügigen Fehlern führen.

Zitieren von PEP 8 :

Wenn Sie den Python 2-Befehlszeileninterpreter mit der Option -t aufrufen, werden
Warnungen über Code ausgegeben, der Tabulatoren und Leerzeichen illegal mischt.
Bei Verwendung von -tt diese Warnungen zu Fehlern. Diese Optionen werden
dringend empfohlen!

Viele Editoren haben "Tabs to Spaces" -Konfiguration. Wenn Sie den Editor konfiguriert, sollte
man zwischen den Tab - Zeichen ( ‚\ t‘) und der Tab - Taste unterscheiden.

• Die Tabulatorzeichen sollten zu zeigen , 8 Räume so konfiguriert werden, um die


Sprachsemantik entsprechen - zumindest in den Fällen , wenn (versehentliche) gemischte
Einrückung möglich ist. Editoren können das Tabulatorzeichen auch automatisch in
Leerzeichen umwandeln.
• Es kann jedoch hilfreich sein, den Editor so zu konfigurieren, dass durch Drücken der
Tabulatortaste 4 Leerzeichen anstelle eines Tabulatorzeichens eingefügt werden.

https://riptutorial.com/de/home 26
Python Quellcode mit einer Mischung aus tabs geschrieben und Räumen oder mit Nicht-Standard
- Zahl der Einrückung Räume kann Pep8-konforme Verwendung gemacht werden autopep8 .
(Eine weniger leistungsfähige Alternative ist bei den meisten Python-Installationen enthalten:
reindent.py. )

Auflistungsarten

Es gibt eine Reihe von Auflistungstypen in Python. Während Typen wie int und str einen
einzelnen Wert enthalten, enthalten Auflistungstypen mehrere Werte.

Listen

Der list ist wahrscheinlich der am häufigsten verwendete Auflistungstyp in Python. Trotz ihres
Namens ähnelt eine Liste eher einem Array in anderen Sprachen, meistens JavaScript. In Python
ist eine Liste lediglich eine geordnete Sammlung gültiger Python-Werte. Eine Liste kann erstellt
werden, indem Werte, die durch Kommas getrennt sind, in eckige Klammern gesetzt werden:

int_list = [1, 2, 3]
string_list = ['abc', 'defghi']

Eine Liste kann leer sein:

empty_list = []

Die Elemente einer Liste sind nicht auf einen einzelnen Datentyp beschränkt. Dies ist sinnvoll,
wenn Python eine dynamische Sprache ist:

mixed_list = [1, 'abc', True, 2.34, None]

Eine Liste kann eine andere Liste als Element enthalten:

nested_list = [['a', 'b', 'c'], [1, 2, 3]]

Auf die Elemente einer Liste kann über einen Index oder eine numerische Darstellung ihrer
Position zugegriffen werden. Listen in Python sind nullindiziert, was bedeutet, dass das erste
Element in der Liste den Index 0 hat, das zweite Element den Index 1 und so weiter:

names = ['Alice', 'Bob', 'Craig', 'Diana', 'Eric']


print(names[0]) # Alice
print(names[2]) # Craig

Indizes können auch negativ sein, dh ab dem Ende der Liste zählen ( -1 ist der Index des letzten
Elements). Verwenden Sie also die Liste aus dem obigen Beispiel:

print(names[-1]) # Eric
print(names[-4]) # Bob

Listen sind veränderbar, sodass Sie die Werte in einer Liste ändern können:

https://riptutorial.com/de/home 27
names[0] = 'Ann'
print(names)
# Outputs ['Ann', 'Bob', 'Craig', 'Diana', 'Eric']

Außerdem können Sie Elemente zu einer Liste hinzufügen und / oder daraus entfernen:

Objekt mit L.append(object) an das Ende der Liste L.append(object) , gibt None .

names = ['Alice', 'Bob', 'Craig', 'Diana', 'Eric']


names.append("Sia")
print(names)
# Outputs ['Alice', 'Bob', 'Craig', 'Diana', 'Eric', 'Sia']

Fügen Sie ein neues Element zur Liste an einem bestimmten Index hinzu. L.insert(index, object)

names.insert(1, "Nikki")
print(names)
# Outputs ['Alice', 'Nikki', 'Bob', 'Craig', 'Diana', 'Eric', 'Sia']

Entfernen Sie das erste Vorkommen eines Werts mit L.remove(value) None

names.remove("Bob")
print(names) # Outputs ['Alice', 'Nikki', 'Craig', 'Diana', 'Eric', 'Sia']

Rufen Sie den Index in der Liste des ersten Elements ab, dessen Wert x ist. Wenn kein solcher
Artikel vorhanden ist, wird ein Fehler angezeigt.

name.index("Alice")
0

Länge der Liste zählen

len(names)
6

Zählen Sie das Vorkommen eines Elements in der Liste

a = [1, 1, 1, 2, 3, 4]
a.count(1)
3

Kehren Sie die Liste um

a.reverse()
[4, 3, 2, 1, 1, 1]
# or
a[::-1]
[4, 3, 2, 1, 1, 1]

Artikel mit Index L.pop([index]) der letzte Artikel) mit L.pop([index]) und den Artikel zurückgeben

https://riptutorial.com/de/home 28
names.pop() # Outputs 'Sia'

Sie können die Listenelemente wie folgt durchlaufen:

for element in my_list:


print (element)

Tuples

Ein tuple ähnelt einer Liste mit der Ausnahme, dass es eine feste Länge und unveränderlich ist.
Daher können die Werte im Tupel nicht geändert werden, und die Werte können nicht zum Tupel
hinzugefügt oder daraus entfernt werden. Tupel werden im Allgemeinen für kleine Sammlungen
von Werten verwendet, die nicht geändert werden müssen, z. B. eine IP-Adresse und einen Port.
Tupel werden mit Klammern anstelle von eckigen Klammern dargestellt:

ip_address = ('10.20.30.40', 8080)

Die gleichen Indexierungsregeln für Listen gelten auch für Tupel. Tupel können auch verschachtelt
sein und die Werte können alle gültigen gültigen Python-Werte sein.

Ein Tupel mit nur einem Member muss folgendermaßen definiert werden (beachten Sie das
Komma):

one_member_tuple = ('Only member',)

oder

one_member_tuple = 'Only member', # No brackets

oder einfach mit der tuple

one_member_tuple = tuple(['Only member'])

Wörterbücher

Ein dictionary in Python ist eine Sammlung von Schlüssel-Wert-Paaren. Das Wörterbuch ist von
geschweiften Klammern umgeben. Jedes Paar wird durch ein Komma getrennt, und der Schlüssel
und der Wert werden durch einen Doppelpunkt getrennt. Hier ist ein Beispiel:

state_capitals = {
'Arkansas': 'Little Rock',
'Colorado': 'Denver',
'California': 'Sacramento',
'Georgia': 'Atlanta'
}

Um einen Wert zu erhalten, beziehen Sie sich auf seinen Schlüssel:

https://riptutorial.com/de/home 29
ca_capital = state_capitals['California']

Sie können auch alle Schlüssel in einem Wörterbuch abrufen und diese dann durchlaufen:

for k in state_capitals.keys():
print('{} is the capital of {}'.format(state_capitals[k], k))

Wörterbücher ähneln stark der JSON-Syntax. Das native json Modul in der Python-
Standardbibliothek kann zum Konvertieren zwischen JSON und Wörterbüchern verwendet
werden.

einstellen

Ein set ist eine Sammlung von Elementen ohne Wiederholungen und ohne Einfügereihenfolge,
aber sortierte Reihenfolge. Sie werden in Situationen verwendet, in denen es nur wichtig ist, dass
einige Dinge zusammengruppiert werden und nicht in welcher Reihenfolge. Bei großen
Datengruppen ist es viel schneller zu prüfen, ob ein Element in einer set ist oder nicht set als
dasselbe für eine list .

Das Definieren eines set ist dem Definieren eines dictionary sehr ähnlich:

first_names = {'Adam', 'Beth', 'Charlie'}

Oder Sie können einen set mit einer vorhandenen list erstellen:

my_list = [1,2,3]
my_set = set(my_list)

Überprüfen Sie die Mitgliedschaft in der set mit in :

if name in first_names:
print(name)

Sie können eine set genau wie eine Liste durchlaufen, aber denken Sie daran: Die Werte werden
in einer beliebigen, von der Implementierung definierten Reihenfolge angezeigt.

defaultdict

Ein defaultdict ist ein Wörterbuch mit einem Standardwert für Schlüssel, sodass auf Schlüssel, für
die kein expliziter Wert definiert wurde, fehlerfrei zugegriffen werden kann. defaultdict ist
besonders nützlich, wenn es sich bei den Werten im Wörterbuch um Sammlungen (Listen,
Diagramme usw.) handelt, die nicht jedes Mal initialisiert werden müssen, wenn ein neuer
Schlüssel verwendet wird.

Ein defaultdict niemals einen KeyError aus. Für einen nicht vorhandenen Schlüssel wird der
Standardwert zurückgegeben.

Betrachten Sie beispielsweise das folgende Wörterbuch

https://riptutorial.com/de/home 30
>>> state_capitals = {
'Arkansas': 'Little Rock',
'Colorado': 'Denver',
'California': 'Sacramento',
'Georgia': 'Atlanta'
}

Wenn wir versuchen, auf einen nicht vorhandenen Schlüssel zuzugreifen, gibt Python einen
Fehler wie folgt zurück

>>> state_capitals['Alabama']
Traceback (most recent call last):

File "<ipython-input-61-236329695e6f>", line 1, in <module>


state_capitals['Alabama']

KeyError: 'Alabama'

Versuchen wir es mit einem defaultdict . Es befindet sich im Kollektionsmodul.

>>> from collections import defaultdict


>>> state_capitals = defaultdict(lambda: 'Boston')

Wir haben hier einen Standardwert ( Boston ) festgelegt, falls der Schlüssel nicht vorhanden ist.
Füllen Sie nun das Diktat wie zuvor:

>>> state_capitals['Arkansas'] = 'Little Rock'


>>> state_capitals['California'] = 'Sacramento'
>>> state_capitals['Colorado'] = 'Denver'
>>> state_capitals['Georgia'] = 'Atlanta'

Wenn wir versuchen, mit einem nicht vorhandenen Schlüssel auf das Diktat zuzugreifen, gibt
Python den Standardwert zurück, z. B. Boston

>>> state_capitals['Alabama']
'Boston'

und gibt die erstellten Werte für einen vorhandenen Schlüssel wie ein normales dictionary

>>> state_capitals['Arkansas']
'Little Rock'

Hilfsprogramm

Python hat mehrere Funktionen, die in den Interpreter integriert sind. Wenn Sie Informationen zu
Schlüsselwörtern, integrierten Funktionen, Modulen oder Themen erhalten möchten, öffnen Sie
eine Python-Konsole und geben Sie Folgendes ein:

>>> help()

https://riptutorial.com/de/home 31
Sie erhalten Informationen, indem Sie die Schlüsselwörter direkt eingeben:

>>> help(help)

oder innerhalb des Dienstprogramms:

help> help

die eine Erklärung zeigen wird:

Help on _Helper in module _sitebuiltins object:

class _Helper(builtins.object)
| Define the builtin 'help'.
|
| This is a wrapper around pydoc.help that provides a helpful message
| when 'help' is typed at the Python interactive prompt.
|
| Calling help() at the Python prompt starts an interactive help session.
| Calling help(thing) prints help for the python object 'thing'.
|
| Methods defined here:
|
| __call__(self, *args, **kwds)
|
| __repr__(self)
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)

Sie können auch Unterklassen von Modulen anfordern:

help(pymysql.connections)

Sie können die Hilfe verwenden, um auf die Dokumentfolgen der verschiedenen importierten
Module zuzugreifen. Versuchen Sie beispielsweise Folgendes:

>>> help(math)

und Sie erhalten einen Fehler

>>> import math


>>> help(math)

Nun erhalten Sie eine Liste der verfügbaren Methoden im Modul, jedoch erst, nachdem Sie es
importiert haben.

https://riptutorial.com/de/home 32
Schließen Sie den Helfer mit quit

Ein Modul erstellen

Ein Modul ist eine importierbare Datei, die Definitionen und Anweisungen enthält.

Ein Modul kann durch Erstellen einer .py Datei erstellt werden.

# hello.py
def say_hello():
print("Hello!")

Funktionen in einem Modul können durch Importieren des Moduls verwendet werden.

Für von Ihnen erstellte Module müssen sich diese im selben Verzeichnis befinden wie die Datei, in
die Sie sie importieren. (Sie können sie jedoch auch mit den im Lieferumfang enthaltenen
Modulen im Python-Verzeichnis lib ablegen, sollten aber möglichst vermieden werden.)

$ python
>>> import hello
>>> hello.say_hello()
=> "Hello!"

Module können von anderen Modulen importiert werden.

# greet.py
import hello
hello.say_hello()

Bestimmte Funktionen eines Moduls können importiert werden.

# greet.py
from hello import say_hello
say_hello()

Module können Aliasing sein.

# greet.py
import hello as ai
ai.say_hello()

Ein Modul kann ein eigenständiges ausführbares Skript sein.

# run_hello.py
if __name__ == '__main__':
from hello import say_hello
say_hello()

Starte es!

https://riptutorial.com/de/home 33
$ python run_hello.py
=> "Hello!"

Wenn sich das Modul in einem Verzeichnis befindet und von Python erkannt werden muss, sollte
das Verzeichnis eine Datei mit dem Namen __init__.py .

String-Funktion - str () und repr ()

Es gibt zwei Funktionen, mit denen eine lesbare Darstellung eines Objekts erhalten werden kann.

repr(x)ruft x.__repr__() : eine Darstellung von x . eval konvertiert das Ergebnis dieser Funktion
normalerweise zurück in das ursprüngliche Objekt.

str(x)ruft x.__str__() : Eine vom Menschen lesbare Zeichenfolge, die das Objekt beschreibt. Dies
kann einige technische Details auslassen.

repr ()

Bei vielen Typen versucht diese Funktion, eine Zeichenfolge zurückzugeben, die ein Objekt mit
demselben Wert ergibt, wenn es an eval() . Ansonsten handelt es sich bei der Darstellung um
eine in spitze Klammern eingeschlossene Zeichenfolge, die den Namen des Objekttyps sowie
zusätzliche Informationen enthält. Dies beinhaltet häufig den Namen und die Adresse des Objekts.

str ()

Bei Strings wird der String selbst zurückgegeben. Der Unterschied zwischen diesem und
repr(object) besteht darin, dass str(object) nicht immer versucht, einen String zurückzugeben,
der für eval() zulässig ist. Vielmehr ist es das Ziel, eine druckbare oder "lesbare" Zeichenfolge
zurückzugeben. Wenn kein Argument angegeben ist, wird der leere String '' .

Beispiel 1:

s = """w'o"w"""
repr(s) # Output: '\'w\\\'o"w\''
str(s) # Output: 'w\'o"w'
eval(str(s)) == s # Gives a SyntaxError
eval(repr(s)) == s # Output: True

Beispiel 2

import datetime
today = datetime.datetime.now()
str(today) # Output: '2016-09-15 06:58:46.915000'
repr(today) # Output: 'datetime.datetime(2016, 9, 15, 6, 58, 46, 915000)'

Beim Schreiben einer Klasse können Sie diese Methoden überschreiben, um zu tun, was Sie
möchten:

https://riptutorial.com/de/home 34
class Represent(object):

def __init__(self, x, y):


self.x, self.y = x, y

def __repr__(self):
return "Represent(x={},y=\"{}\")".format(self.x, self.y)

def __str__(self):
return "Representing x as {} and y as {}".format(self.x, self.y)

Mit der obigen Klasse können wir die Ergebnisse sehen:

r = Represent(1, "Hopper")
print(r) # prints __str__
print(r.__repr__) # prints __repr__: '<bound method Represent.__repr__ of
Represent(x=1,y="Hopper")>'
rep = r.__repr__() # sets the execution of __repr__ to a new variable
print(rep) # prints 'Represent(x=1,y="Hopper")'
r2 = eval(rep) # evaluates rep
print(r2) # prints __str__ from new object
print(r2 == r) # prints 'False' because they are different objects

Installation externer Module mit pip

pip ist dein Freund, wenn du ein Paket aus der Fülle von Auswahlmöglichkeiten im python
package index (PyPI) installieren musst. pip ist bereits installiert, wenn Sie Python 2> = 2.7.9 oder
Python 3> = 3.4 verwenden, das von python.org heruntergeladen wurde. Bei Computern mit Linux
oder einem anderen * nix mit einem systemeigenen Paketmanager muss pip häufig manuell
installiert werden.

Bei Instanzen, auf denen sowohl Python 2 als auch Python 3 installiert sind, bezieht sich pip
häufig auf Python 2 und pip3 auf Python 3. Bei der Verwendung von pip werden nur Pakete für
Python 2 installiert, und pip3 installiert nur Pakete für Python 3.

Paket suchen / installieren


Die Suche nach einem Paket ist so einfach wie das Tippen

$ pip search <query>


# Searches for packages whose name or summary contains <query>

Das Installieren eines Pakets ist so einfach wie das Eintippen (in einer Terminal- /
Eingabeaufforderung, nicht im Python-Interpreter).

$ pip install [package_name] # latest version of the package

$ pip install [package_name]==x.x.x # specific version of the package

$ pip install '[package_name]>=x.x.x' # minimum version of the package

https://riptutorial.com/de/home 35
Dabei ist xxx die Versionsnummer des Pakets, das Sie installieren möchten.

Wenn sich Ihr Server hinter einem Proxy befindet, können Sie das Paket mit dem folgenden
Befehl installieren:

$ pip --proxy http://<server address>:<port> install

Installierte Pakete aktualisieren


Wenn neue Versionen installierter Pakete angezeigt werden, werden sie nicht automatisch auf
Ihrem System installiert. Um einen Überblick darüber zu erhalten, welche Ihrer installierten Pakete
veraltet sind, führen Sie Folgendes aus:

$ pip list --outdated

Um ein bestimmtes Paket zu aktualisieren, verwenden Sie

$ pip install [package_name] --upgrade

Das Aktualisieren aller veralteten Pakete ist keine Standardfunktion von pip .

Pip aufrüsten
Sie können Ihre vorhandene Pip-Installation mit den folgenden Befehlen aktualisieren

• Unter Linux oder Mac OS X:

$ pip install -U pip

Möglicherweise müssen Sie sudo with pip auf einigen Linux-Systemen verwenden

• Unter Windows:

py -m pip install -U pip

oder

python -m pip install -U pip

Weitere Informationen zu pip finden Sie hier .

Installation von Python 2.7.x und 3.x

Hinweis : Die folgenden Anweisungen werden für Python 2.7 geschrieben (sofern
nicht anders angegeben): Anweisungen für Python 3.x sind ähnlich.

https://riptutorial.com/de/home 36
WINDOWS

Laden Sie zunächst die neueste Version von Python 2.7 von der offiziellen Website (
https://www.python.org/downloads/) herunter. Die Version wird als MSI-Paket bereitgestellt. Um es
manuell zu installieren, doppelklicken Sie einfach auf die Datei.

Standardmäßig wird Python in einem Verzeichnis installiert:

C:\Python27\

Warnung: Die Installation ändert die Umgebungsvariable PATH nicht automatisch.

Angenommen, Ihre Python-Installation befindet sich in C: \ Python27, und fügen Sie dies zu Ihrem
PFAD hinzu:

C:\Python27\;C:\Python27\Scripts\

Um zu prüfen, ob die Python-Installation gültig ist, schreiben Sie in cmd:

python --version

Python 2.x und 3.x Seite an Seite

So installieren und verwenden Sie Python 2.x und 3.x nebeneinander auf einem Windows-
Computer:

1. Installieren Sie Python 2.x mit dem MSI-Installationsprogramm.

• Stellen Sie sicher, dass Python für alle Benutzer installiert ist.
• Optional: Fügen Sie Python zu PATH , damit Python 2.x von der Befehlszeile aus mit
python .

2. Installieren Sie Python 3.x mit dem entsprechenden Installationsprogramm.

• Stellen Sie erneut sicher, dass Python für alle Benutzer installiert ist.
• Optional: Fügen Sie Python zu PATH , damit Python 3.x von der Befehlszeile aus mit
python . Dies kann die PATH Einstellungen von Python 2.x außer Kraft setzen.
Überprüfen Sie deshalb Ihren PATH und stellen Sie sicher, dass er nach Ihren
Präferenzen konfiguriert ist.
• Stellen Sie sicher, dass Sie den py launcher für alle Benutzer installieren.

Python 3 installiert das Python-Startprogramm, mit dem Python 2.x und Python 3.x austauschbar
über die Befehlszeile gestartet werden können:

P:\>py -3
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

C:\>py -2

https://riptutorial.com/de/home 37
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

Um die entsprechende Version von pip für eine bestimmte Python-Version zu verwenden,
verwenden Sie:

C:\>py -3 -m pip -V
pip 9.0.1 from C:\Python36\lib\site-packages (python 3.6)

C:\>py -2 -m pip -V
pip 9.0.1 from C:\Python27\lib\site-packages (python 2.7)

LINUX

Die neuesten Versionen von CentOS, Fedora, Redhat Enterprise (RHEL) und Ubuntu werden mit
Python 2.7 geliefert.

Um Python 2.7 manuell unter Linux zu installieren, führen Sie im Terminal Folgendes aus:

wget --no-check-certificate https://www.python.org/ftp/python/2.7.X/Python-2.7.X.tgz


tar -xzf Python-2.7.X.tgz
cd Python-2.7.X
./configure
make
sudo make install

Fügen Sie auch den Pfad des neuen Python in der Umgebungsvariable PATH hinzu. Wenn sich
neuer Python in /root/python-2.7.X führen Sie den export PATH = $PATH:/root/python-2.7.X

Um zu prüfen, ob die Python-Installation ein gültiges Schreiben im Terminal ist:

python --version

Ubuntu (aus Quelle)

Wenn Sie Python 3.6 benötigen, können Sie es wie unten gezeigt von der Quelle installieren
(Ubuntu 16.10 und 17.04 haben die Version 3.6 im universellen Repository). Die folgenden
Schritte müssen für Ubuntu 16.04 und niedrigere Versionen befolgt werden:

sudo apt install build-essential checkinstall


sudo apt install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev
libgdbm-dev libc6-dev libbz2-dev
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
tar xvf Python-3.6.1.tar.xz
cd Python-3.6.1/
./configure --enable-optimizations
sudo make altinstall

Mac OS

Wir sprechen zwar davon, dass macOS mit Python 2.7.10 installiert ist, aber diese Version ist

https://riptutorial.com/de/home 38
veraltet und gegenüber dem regulären Python geringfügig geändert.

Die mit OS X gelieferte Version von Python eignet sich hervorragend zum Lernen,
nicht aber für die Entwicklung. Die mit OS X gelieferte Version ist möglicherweise nicht
mehr aktuell als die offizielle Python-Version, die als stabile Produktionsversion gilt. (
Quelle )

Homebrew installieren:

/usr/bin/ruby -e "$(curl -fsSL


https://raw.githubusercontent.com/Homebrew/install/master/install)"

Installieren Sie Python 2.7:

brew install python

Verwenden Sie für Python 3.x stattdessen den Befehl brew install python3 .

Erste Schritte mit Python Language online lesen: https://riptutorial.com/de/python/topic/193/erste-


schritte-mit-python-language

https://riptutorial.com/de/home 39
Kapitel 2: * args und ** kwargs
Bemerkungen
Es gibt ein paar Dinge zu beachten:

1. Die Namen args und kwargs werden kwargs verwendet, sie sind nicht Teil der
Sprachspezifikation. Somit sind diese gleichwertig:

def func(*args, **kwargs):


print(args)
print(kwargs)

def func(*a, **b):


print(a)
print(b)

2. Sie dürfen nicht mehr als einen args oder mehr als einen kwargs Parameter haben (diese sind
jedoch nicht erforderlich)

def func(*args1, *args2):


# File "<stdin>", line 1
# def test(*args1, *args2):
# ^
# SyntaxError: invalid syntax

def test(**kwargs1, **kwargs2):


# File "<stdin>", line 1
# def test(**kwargs1, **kwargs2):
# ^
# SyntaxError: invalid syntax

3. Wenn auf *args ein Positionsargument folgt, handelt es sich nur um Argumente, die nur nach
Namen übergeben werden können. Ein einzelner Stern kann anstelle von *args , um Werte
als Schlüsselwortargumente zu erzwingen, ohne eine variadische Parameterliste
anzugeben. Nur-Parameterparameterlisten sind nur in Python 3 verfügbar.

def func(a, b, *args, x, y):


print(a, b, args, x, y)

func(1, 2, 3, 4, x=5, y=6)


#>>> 1, 2, (3, 4), 5, 6

def func(a, b, *, x, y):

https://riptutorial.com/de/home 40
print(a, b, x, y)

func(1, 2, x=5, y=6)


#>>> 1, 2, 5, 6

4. **kwargs müssen in der Parameterliste den letzten Platz **kwargs .

def test(**kwargs, *args):


# File "<stdin>", line 1
# def test(**kwargs, *args):
# ^
# SyntaxError: invalid syntax

Examples
Verwenden von * args beim Schreiben von Funktionen

Sie können den Stern * beim Schreiben einer Funktion verwenden, um alle positionellen (dh
unbenannten) Argumente in einem Tupel zu sammeln:

def print_args(farg, *args):


print("formal arg: %s" % farg)
for arg in args:
print("another positional arg: %s" % arg)

Aufrufmethode:

print_args(1, "two", 3)

In diesem Aufruf wird farg wie immer zugewiesen, und die beiden anderen werden in der
Reihenfolge, in der sie empfangen wurden, dem Args-Tupel zugeführt.

Verwenden von ** Warnungen beim Schreiben von Funktionen

Sie können eine Funktion definieren, die eine beliebige Anzahl von Schlüsselwort (benannten)
Argumenten verwendet, indem Sie den doppelten Stern ** vor einem Parameternamen
verwenden:

def print_kwargs(**kwargs):
print(kwargs)

Beim Aufruf der Methode erstellt Python ein Wörterbuch aller Schlüsselwortargumente und macht
es im Funktionskörper verfügbar:

print_kwargs(a="two", b=3)
# prints: "{a: "two", b=3}"

Beachten Sie, dass der ** kwargs-Parameter in der Funktionsdefinition immer der letzte

https://riptutorial.com/de/home 41
Parameter sein muss und nur mit den Argumenten übereinstimmt, die nach den vorherigen
übergeben wurden.

def example(a, **kw):


print kw

example(a=2, b=3, c=4) # => {'b': 3, 'c': 4}

Innerhalb des Funktionskörpers wird kwargs wie ein Wörterbuch manipuliert. Um auf einzelne
Elemente in kwargs zuzugreifen, kwargs Sie diese wie bei einem normalen Wörterbuch:

def print_kwargs(**kwargs):
for key in kwargs:
print("key = {0}, value = {1}".format(key, kwargs[key]))

print_kwargs(a="two", b=1) aufrufen, wird die folgende Ausgabe print_kwargs(a="two", b=1) :

print_kwargs(a = "two", b = 1)
key = a, value = "two"
key = b, value = 1

Verwendung von * args beim Aufruf von Funktionen

Ein häufiger Anwendungsfall für *args in einer Funktionsdefinition ist das Delegieren der
Verarbeitung an eine umschlossene oder geerbte Funktion. Ein typisches Beispiel ist die __init__
Methode einer Klasse

class A(object):
def __init__(self, b, c):
self.y = b
self.z = c

class B(A):
def __init__(self, a, *args, **kwargs):
super(B, self).__init__(*args, **kwargs)
self.x = a

Hier wird der a wird der Parameter von der Kind - Klasse , nachdem alle anderen Argumente
verarbeitet (Lage- und Keyword) geleitet werden , auf - und verarbeitet - der Basisklasse.

Zum Beispiel:

b = B(1, 2, 3)
b.x # 1
b.y # 2
b.z # 3

Was hier passiert, ist, dass die Klasse B __init__ die Argumente 1, 2, 3 sieht. Es weiß, dass es
ein positionelles Argument ( a ) braucht, daher greift es das erste Argument, das in ( 1 ) übergeben
wurde, also im Bereich der Funktion a == 1 .

https://riptutorial.com/de/home 42
Als nächstes sieht es, dass es eine beliebige Anzahl von Positionsargumenten ( *args ) nehmen
muss, sodass es den Rest der übergebenen Positionsargumente ( 1, 2 ) übernimmt und in *args
stopft. Nun (im Umfang der Funktion) args == [2, 3] .

Dann ruft es die Funktion __init__ Klasse A mit *args . Python sieht das * vor args und "entpackt"
die Liste in Argumente. Wenn in diesem Beispiel die __init__ Funktion der Klasse B die __init__
Funktion der Klasse A __init__ , werden die Argumente 2, 3 (dh A(2, 3) ) übergeben.

Schließlich setzt es seine eigene x Eigenschaft auf das erste Positionsargument a , das gleich 1 .

Verwenden von ** Warnungen beim Aufruf von Funktionen

Sie können ein Wörterbuch verwenden, um den Parametern der Funktion Werte zuzuweisen.
Verwenden Sie den Parameternamen als Schlüssel im Wörterbuch und den Wert dieser an jeden
Schlüssel gebundenen Argumente:

def test_func(arg1, arg2, arg3): # Usual function with three arguments


print("arg1: %s" % arg1)
print("arg2: %s" % arg2)
print("arg3: %s" % arg3)

# Note that dictionaries are unordered, so we can switch arg2 and arg3. Only the names matter.
kwargs = {"arg3": 3, "arg2": "two"}

# Bind the first argument (ie. arg1) to 1, and use the kwargs dictionary to bind the others
test_var_args_call(1, **kwargs)

Verwendung von * args beim Aufruf von Funktionen

Die Verwendung des Operators * für ein Argument beim Aufruf einer Funktion hat den Effekt, dass
die Liste oder ein Tupel-Argument entpackt wird

def print_args(arg1, arg2):


print(str(arg1) + str(arg2))

a = [1,2]
b = tuple([3,4])

print_args(*a)
# 12
print_args(*b)
# 34

Beachten Sie, dass die Länge des mit Sternchen versehenen Arguments der Anzahl der
Argumente der Funktion entsprechen muss.

Ein übliches Python-Idiom besteht darin, den Entpackungsoperator * mit der zip Funktion zu
verwenden, um seine Auswirkungen umzukehren:

a = [1,3,5,7,9]
b = [2,4,6,8,10]

https://riptutorial.com/de/home 43
zipped = zip(a,b)
# [(1,2), (3,4), (5,6), (7,8), (9,10)]

zip(*zipped)
# (1,3,5,7,9), (2,4,6,8,10)

Nur für Schlüsselwörter und für Schlüsselwörter erforderliche Argumente

In Python 3 können Sie Funktionsargumente definieren, die auch ohne Standardwerte nur per
Schlüsselwort zugewiesen werden können. Dies erfolgt durch Verwendung von Stern *, um
zusätzliche Positionsparameter zu verwenden, ohne die Schlüsselwortparameter festzulegen. Alle
Argumente nach dem * sind Argumente, die nur aus einem Schlüsselwort bestehen. Beachten
Sie, dass Argumente, die nur aus Schlüsselwörtern bestehen, keinen Standardwert haben, beim
Aufruf der Funktion jedoch erforderlich sind.

def print_args(arg1, *args, keyword_required, keyword_only=True):


print("first positional arg: {}".format(arg1))
for arg in args:
print("another positional arg: {}".format(arg))
print("keyword_required value: {}".format(keyword_required))
print("keyword_only value: {}".format(keyword_only))

print(1, 2, 3, 4) # TypeError: print_args() missing 1 required keyword-only argument:


'keyword_required'
print(1, 2, 3, keyword_required=4)
# first positional arg: 1
# another positional arg: 2
# another positional arg: 3
# keyword_required value: 4
# keyword_only value: True

Kwarg-Werte mit einem Wörterbuch füllen

def foobar(foo=None, bar=None):


return "{}{}".format(foo, bar)

values = {"foo": "foo", "bar": "bar"}

foobar(**values) # "foobar"

** Warnungen und Standardwerte

So verwenden Sie Standardwerte mit ** kwargs

def fun(**kwargs):
print kwargs.get('value', 0)

fun()
# print 0
fun(value=1)
# print 1

* args und ** kwargs online lesen: https://riptutorial.com/de/python/topic/2475/--args-und----kwargs

https://riptutorial.com/de/home 44
Kapitel 3: 2to3 Werkzeug
Syntax
• $ 2to3 [-options] Pfad / to / file.py

Parameter

Parameter Beschreibung

2to3 akzeptiert eine Liste von Dateien oder Verzeichnissen, die als
Dateiname /
Argument umgewandelt werden sollen. Die Verzeichnisse werden
Verzeichnisname
rekursiv für Python-Quellen durchlaufen.

Möglichkeit Option Beschreibung

Geben Sie die anzuwendenden Transformationen an. Standard:


-f FIX, --fix = FIX
Alle. Liste der verfügbaren Transformationen mit --list-fixes

-j PROZESSE, --
processes = Führen Sie 2to3 gleichzeitig aus
PROZESSE

-x NOFIX, --nofix =
Eine Transformation ausschließen
NOFIX

-l, --list-fixes Liste der verfügbaren Transformationen

Ändern Sie die Grammatik so, dass print() als Funktion betrachtet
-p, --print-Funktion
wird

-v, --verbose Ausführlichere Ausgabe

--keine Unterschiede Geben Sie keine Differenzen des Refactorings aus

-w Schreibe modifizierte Dateien zurück

-n, --nobackups Erstellen Sie keine Sicherungen von geänderten Dateien

Platzieren Sie die Ausgabedateien in diesem Verzeichnis, anstatt


-o OUTPUT_DIR, --
die Eingabedateien zu überschreiben. Erfordert das Flag -n , da
output-dir =
Sicherungsdateien nicht erforderlich sind, wenn die
OUTPUT_DIR
Eingabedateien nicht geändert werden.

Ausgabedateien schreiben, selbst wenn keine Änderungen


-W, --write-unverändert-
erforderlich waren. Nützlich bei -o damit ein vollständiger
Dateien
Quellbaum übersetzt und kopiert wird. Impliziert -w .

https://riptutorial.com/de/home 45
Parameter Beschreibung

Geben Sie eine Zeichenfolge an, die an alle Ausgabedateinamen


--add-Suffix =
angehängt werden soll. Benötigt -n wenn es nicht leer ist. Beispiel:
ADD_SUFFIX
--add-suffix='3' generiert .py3 Dateien.

Bemerkungen
Das 2to3-Tool ist ein Python-Programm, mit dem der in Python 2.x geschriebene Code in Python
3.x-Code konvertiert wird. Das Tool liest den Quellcode von Python 2.x und wendet eine Reihe
von Fixierern an, um diesen in gültigen Python 3.x-Code umzuwandeln.

Das 2to3-Tool ist in der Standardbibliothek als lib2to3 verfügbar. Es enthält einen umfangreichen
Satz Fixierer, der nahezu den gesamten Code verarbeiten kann. Da es sich bei lib2to3 um eine
generische Bibliothek handelt, können Sie Ihre eigenen Fixer für 2to3 schreiben.

Examples
Grundlegende Verwendung

Betrachten Sie den folgenden Python2.x-Code. Speichern Sie die Datei als example.py

Python 2.x 2.0

def greet(name):
print "Hello, {0}!".format(name)
print "What's your name?"
name = raw_input()
greet(name)

In der obigen Datei befinden sich mehrere inkompatible Zeilen. Die Methode raw_input() wurde in
Python 3.x durch input() und print ist keine Anweisung mehr, sondern eine Funktion. Dieser
Code kann mit dem 2to3-Tool in Python 3.x-Code konvertiert werden.

Unix

$ 2to3 example.py

Windows

> path/to/2to3.py example.py

Wenn Sie den obigen Code ausführen, werden die Unterschiede zur ursprünglichen Quelldatei
ausgegeben (siehe unten).

RefactoringTool: Skipping implicit fixer: buffer

https://riptutorial.com/de/home 46
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
RefactoringTool: Refactored example.py
--- example.py (original)
+++ example.py (refactored)
@@ -1,5 +1,5 @@
def greet(name):
- print "Hello, {0}!".format(name)
-print "What's your name?"
-name = raw_input()
+ print("Hello, {0}!".format(name))
+print("What's your name?")
+name = input()
greet(name)
RefactoringTool: Files that need to be modified:
RefactoringTool: example.py

Die Änderungen können mit der Markierung -w in die Quelldatei zurückgeschrieben werden. Eine
Sicherungskopie der Originaldatei namens example.py.bak wird erstellt, sofern das Flag -n nicht
angegeben ist.

Unix

$ 2to3 -w example.py

Windows

> path/to/2to3.py -w example.py

Jetzt wurde die Datei example.py von Python 2.x in Python 3.x-Code konvertiert.

Nach Beendigung enthält example.py den folgenden gültigen Python3.x-Code:

Python 3.x 3.0

def greet(name):
print("Hello, {0}!".format(name))
print("What's your name?")
name = input()
greet(name)

2to3 Werkzeug online lesen: https://riptutorial.com/de/python/topic/5320/2to3-werkzeug

https://riptutorial.com/de/home 47
Kapitel 4: Abstrakte Basisklassen (abc)
Examples
Einstellen der ABCMeta-Metaklasse

Abstrakte Klassen sind Klassen, die vererbt werden sollen, vermeiden jedoch die Implementierung
bestimmter Methoden und hinterlassen nur Methodensignaturen, die von Unterklassen
implementiert werden müssen.

Abstrakte Klassen sind nützlich, um Klassenabstraktionen auf hoher Ebene zu definieren und
durchzusetzen, ähnlich dem Konzept von Schnittstellen in typisierten Sprachen, ohne dass eine
Methodenimplementierung erforderlich ist.

Ein konzeptioneller Ansatz zum Definieren einer abstrakten Klasse besteht darin, die
Klassenmethoden auszulagern und dann einen NotImplementedError auszulösen, wenn darauf
zugegriffen wird. Dadurch wird verhindert, dass untergeordnete Klassen auf übergeordnete
Methoden zugreifen, ohne sie vorher zu überschreiben. So wie:

class Fruit:

def check_ripeness(self):
raise NotImplementedError("check_ripeness method not implemented!")

class Apple(Fruit):
pass

a = Apple()
a.check_ripeness() # raises NotImplementedError

Das Erstellen einer abstrakten Klasse auf diese Weise verhindert die unzulässige Verwendung
von Methoden, die nicht überschrieben werden, und ermutigt sicherlich dazu, Methoden in
untergeordneten Klassen zu definieren, erzwingen jedoch keine Definition. Mit dem Modul abc
können wir verhindern, dass untergeordnete Klassen instanziiert werden, wenn sie die abstrakten
Klassenmethoden ihrer Eltern und Vorfahren nicht überschreiben:

from abc import ABCMeta

class AbstractClass(object):
# the metaclass attribute must always be set as a class variable
__metaclass__ = ABCMeta

# the abstractmethod decorator registers this method as undefined


@abstractmethod
def virtual_method_subclasses_must_define(self):
# Can be left completely blank, or a base implementation can be provided
# Note that ordinarily a blank interpretation implicitly returns `None`,
# but by registering, this behaviour is no longer enforced.

https://riptutorial.com/de/home 48
Es ist jetzt möglich, die Unterklasse einfach zu überschreiben und zu überschreiben:

class Subclass(AbstractClass):
def virtual_method_subclasses_must_define(self):
return

Warum / Wie werden ABCMeta und @abstractmethod verwendet?

Abstrakte Basisklassen (ABCs) erzwingen, welche abgeleiteten Klassen bestimmte Methoden der
Basisklasse implementieren.

Um zu verstehen, wie das funktioniert und warum wir es verwenden sollten, betrachten wir ein
Beispiel, das Van Rossum gefallen würde. Nehmen wir an, wir haben eine Basisklasse
"MontyPython" mit zwei Methoden (joke & punchline), die von allen abgeleiteten Klassen
implementiert werden müssen.

class MontyPython:
def joke(self):
raise NotImplementedError()

def punchline(self):
raise NotImplementedError()

class ArgumentClinic(MontyPython):
def joke(self):
return "Hahahahahah"

Wenn wir ein Objekt instanziieren und zwei Methoden aufrufen, erhalten wir (wie erwartet) einen
Fehler mit der punchline() -Methode.

>>> sketch = ArgumentClinic()


>>> sketch.punchline()
NotImplementedError

Dies ermöglicht es uns jedoch immer noch, ein Objekt der ArgumentClinic-Klasse zu instanziieren,
ohne einen Fehler zu erhalten. Tatsächlich erhalten wir keine Fehlermeldung, bis wir die
Punchline () suchen.

Dies wird durch die Verwendung des ABC-Moduls (Abstract Base Class) vermieden. Mal sehen,
wie das mit demselben Beispiel funktioniert:

from abc import ABCMeta, abstractmethod

class MontyPython(metaclass=ABCMeta):
@abstractmethod
def joke(self):
pass

@abstractmethod
def punchline(self):
pass

https://riptutorial.com/de/home 49
class ArgumentClinic(MontyPython):
def joke(self):
return "Hahahahahah"

Wenn wir dieses Mal versuchen, ein Objekt aus der unvollständigen Klasse zu instanziieren,
erhalten wir sofort einen TypeError!

>>> c = ArgumentClinic()
TypeError:
"Can't instantiate abstract class ArgumentClinic with abstract methods punchline"

In diesem Fall ist es einfach, die Klasse abzuschließen, um alle TypeErrors zu vermeiden:

class ArgumentClinic(MontyPython):
def joke(self):
return "Hahahahahah"

def punchline(self):
return "Send in the constable!"

Dieses Mal, wenn Sie ein Objekt instanziieren, funktioniert es!

Abstrakte Basisklassen (abc) online lesen: https://riptutorial.com/de/python/topic/5442/abstrakte-


basisklassen--abc-

https://riptutorial.com/de/home 50
Kapitel 5: Abstrakter Syntaxbaum
Examples
Analysieren Sie Funktionen in einem Python-Skript

Dieser analysiert ein Python-Skript und meldet für jede definierte Funktion die Zeilennummer, an
der die Funktion begann, wo die Signatur endet, wo der Docstring endet und wo die
Funktionsdefinition endet.

#!/usr/local/bin/python3

import ast
import sys

""" The data we collect. Each key is a function name; each value is a dict
with keys: firstline, sigend, docend, and lastline and values of line numbers
where that happens. """
functions = {}

def process(functions):
""" Handle the function data stored in functions. """
for funcname,data in functions.items():
print("function:",funcname)
print("\tstarts at line:",data['firstline'])
print("\tsignature ends at line:",data['sigend'])
if ( data['sigend'] < data['docend'] ):
print("\tdocstring ends at line:",data['docend'])
else:
print("\tno docstring")
print("\tfunction ends at line:",data['lastline'])
print()

class FuncLister(ast.NodeVisitor):
def visit_FunctionDef(self, node):
""" Recursively visit all functions, determining where each function
starts, where its signature ends, where the docstring ends, and where
the function ends. """
functions[node.name] = {'firstline':node.lineno}
sigend = max(node.lineno,lastline(node.args))
functions[node.name]['sigend'] = sigend
docstring = ast.get_docstring(node)
docstringlength = len(docstring.split('\n')) if docstring else -1
functions[node.name]['docend'] = sigend+docstringlength
functions[node.name]['lastline'] = lastline(node)
self.generic_visit(node)

def lastline(node):
""" Recursively find the last line of a node """
return max( [ node.lineno if hasattr(node,'lineno') else -1 , ]
+[lastline(child) for child in ast.iter_child_nodes(node)] )

def readin(pythonfilename):
""" Read the file name and store the function data into functions. """
with open(pythonfilename) as f:
code = f.read()

https://riptutorial.com/de/home 51
FuncLister().visit(ast.parse(code))

def analyze(file,process):
""" Read the file and process the function data. """
readin(file)
process(functions)

if __name__ == '__main__':
if len(sys.argv)>1:
for file in sys.argv[1:]:
analyze(file,process)
else:
analyze(sys.argv[0],process)

Abstrakter Syntaxbaum online lesen: https://riptutorial.com/de/python/topic/5370/abstrakter-


syntaxbaum

https://riptutorial.com/de/home 52
Kapitel 6: Ähnlichkeiten in der Syntax,
Bedeutungsunterschiede: Python vs.
JavaScript
Einführung
Es kommt manchmal vor, dass zwei Sprachen denselben oder einem ähnlichen Syntaxausdruck
unterschiedliche Bedeutungen zuweisen. Wenn beide Sprachen für einen Programmierer von
Interesse sind, hilft das Verdeutlichen dieser Verzweigungspunkte, die beiden Sprachen in ihren
Grundlagen und Feinheiten zu verstehen.

Examples
`in` mit Listen

2 in [2, 3]

In Python wird dies als True ausgewertet, in JavaScript jedoch als False. Dies liegt daran, dass in
Python in Checks geprüft wird, ob ein Wert in einer Liste enthalten ist, also 2 als erstes Element in
[2, 3] steht. In JavaScript in wird mit Objekten verwendet und überprüft, ob ein Objekt die
Eigenschaft mit dem durch den Wert angegebenen Namen enthält. JavaScript betrachtet also [2,
3] als Objekt oder eine Schlüsselwertzuordnung wie folgt:

{'0': 2, '1': 3}

und prüft, ob es eine Eigenschaft oder einen Schlüssel '2' enthält. Die Ganzzahl 2 wird stumm in
die Zeichenfolge '2' umgewandelt.

Ähnlichkeiten in der Syntax, Bedeutungsunterschiede: Python vs. JavaScript online lesen:


https://riptutorial.com/de/python/topic/10766/ahnlichkeiten-in-der-syntax--bedeutungsunterschiede-
-python-vs--javascript

https://riptutorial.com/de/home 53
Kapitel 7: Alternativen zum Wechseln von
Anweisungen aus anderen Sprachen
Bemerkungen
Es gibt KEINE switch - Anweisung in Python als Sprache Design - Wahl. Es wurde ein PEP ( PEP-
3103 ) für das abgelehnte Thema erstellt.

In Python finden Sie eine Vielzahl von Rezepten, wie Sie Ihre eigenen Anweisungen zum
Wechseln ausführen können, und hier versuche ich, die sinnvollsten Optionen vorzuschlagen. Hier
sind ein paar Orte zu überprüfen:

• http://stackoverflow.com/questions/60208/replacements-for-switch-statement-in-python
• http://code.activestate.com/recipes/269708-some-python-style-switches/
• http://code.activestate.com/recipes/410692-readable-switch-construction-without-lambdas-
or-di/
• …

Examples
Verwenden Sie das, was die Sprache bietet: das if / else-Konstrukt.

Wenn Sie ein switch / case Konstrukt verwenden möchten, ist es am einfachsten, das gute alte if /
else Konstrukt zu verwenden:

def switch(value):
if value == 1:
return "one"
if value == 2:
return "two"
if value == 42:
return "the answer to the question about life, the universe and everything"
raise Exception("No case found!")

Es mag überflüssig und nicht immer hübsch aussehen, aber das ist bei weitem der effizienteste
Weg, und es erledigt die Aufgabe:

>>> switch(1)
one
>>> switch(2)
two
>>> switch(3)

Exception: No case found!
>>> switch(42)
the answer to the question about life the universe and everything

https://riptutorial.com/de/home 54
Benutze ein Diktat von Funktionen

Ein weiterer unkomplizierter Weg ist das Erstellen eines Funktionswörterbuchs:

switch = {
1: lambda: 'one',
2: lambda: 'two',
42: lambda: 'the answer of life the universe and everything',
}

dann fügen Sie eine Standardfunktion hinzu:

def default_case():
raise Exception('No case found!')

und Sie verwenden die Get-Methode des Wörterbuchs, um die Funktion mit dem Wert zu
überprüfen und auszuführen. Wenn im Wörterbuch kein Wert vorhanden ist, wird default_case
ausgeführt.

>>> switch.get(1, default_case)()


one
>>> switch.get(2, default_case)()
two
>>> switch.get(3, default_case)()

Exception: No case found!
>>> switch.get(42, default_case)()
the answer of life the universe and everything

Sie können auch etwas syntaktischen Zucker herstellen, damit der Schalter schöner aussieht:

def run_switch(value):
return switch.get(value, default_case)()

>>> run_switch(1)
one

Verwenden Sie die Klassenprüfung

Sie können eine Klasse verwenden, um die Switch- / Case-Struktur nachzuahmen. Im Folgenden
wird die Introspektion einer Klasse verwendet (mit der Funktion getattr() , die eine Zeichenfolge
in eine gebundene Methode einer Instanz auflöst), um den "case" getattr() aufzulösen.

Dann wird diese Introspecting-Methode auf die __call__ Methode gesetzt, um den Operator () zu
überladen.

class SwitchBase:
def switch(self, case):
m = getattr(self, 'case_{}'.format(case), None)
if not m:
return self.default
return m

https://riptutorial.com/de/home 55
__call__ = switch

Damit es noch schöner aussieht, subclassieren wir die SwitchBase Klasse (dies könnte jedoch in
einer Klasse geschehen), und definieren den gesamten case als Methoden:

class CustomSwitcher:
def case_1(self):
return 'one'

def case_2(self):
return 'two'

def case_42(self):
return 'the answer of life, the universe and everything!'

def default(self):
raise Exception('Not a case!')

so können wir es endlich benutzen:

>>> switch = CustomSwitcher()


>>> print(switch(1))
one
>>> print(switch(2))
two
>>> print(switch(3))

Exception: Not a case!
>>> print(switch(42))
the answer of life, the universe and everything!

Verwenden eines Kontextmanagers

Eine andere Art, die sehr lesbar und elegant ist, aber weit weniger effizient als eine if / else-
Struktur ist, besteht darin, eine Klasse wie folgt zu erstellen, die den zu vergleichenden Wert liest
und speichert, um sich im Kontext als aufrufbar darzustellen gibt true zurück, wenn er mit dem
gespeicherten Wert übereinstimmt:

class Switch:
def __init__(self, value):
self._val = value
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
return False # Allows traceback to occur
def __call__(self, cond, *mconds):
return self._val in (cond,)+mconds

dann ist das Definieren der Fälle fast eine Übereinstimmung mit dem realen switch / case Konstrukt
(innerhalb einer Funktion sichtbar gemacht, um die Darstellung zu erleichtern):

def run_switch(value):

https://riptutorial.com/de/home 56
with Switch(value) as case:
if case(1):
return 'one'
if case(2):
return 'two'
if case(3):
return 'the answer to the question about life, the universe and everything'
# default
raise Exception('Not a case!')

Die Ausführung wäre also:

>>> run_switch(1)
one
>>> run_switch(2)
two
>>> run_switch(3)

Exception: Not a case!
>>> run_switch(42)
the answer to the question about life, the universe and everything

Nota Bene :

• Diese Lösung wird als das auf pypi verfügbare Switch- Modul angeboten .

Alternativen zum Wechseln von Anweisungen aus anderen Sprachen online lesen:
https://riptutorial.com/de/python/topic/4268/alternativen-zum-wechseln-von-anweisungen-aus-
anderen-sprachen

https://riptutorial.com/de/home 57
Kapitel 8: ArcPy
Bemerkungen
In diesem Beispiel wird ein Suchcursor aus dem Data Access (da) -Modul von ArcPy verwendet.

Verwechseln Sie die arcpy.da.SearchCursor-Syntax nicht mit dem früheren und langsameren
arcpy.SearchCursor ().

Das Datenzugriffsmodul (arcpy.da) ist erst seit ArcGIS 10.1 for Desktop verfügbar.

Examples
Der Wert eines Feldes für alle Zeilen der Feature-Class in der File-
Geodatabase mit dem Suchcursor wird gedruckt

So drucken Sie ein Testfeld (TestField) aus einer Test-Feature-Class (TestFC) in einer Testdatei-
Geodatabase (Test.gdb) in einem temporären Ordner (C: \ Temp):

with arcpy.da.SearchCursor(r"C:\Temp\Test.gdb\TestFC",["TestField"]) as cursor:


for row in cursor:
print row[0]

createDissolvedGDB zum Erstellen einer Datei gdb im Arbeitsbereich

def createDissolvedGDB(workspace, gdbName):


gdb_name = workspace + "/" + gdbName + ".gdb"

if(arcpy.Exists(gdb_name):
arcpy.Delete_management(gdb_name)
arcpy.CreateFileGDB_management(workspace, gdbName, "")
else:
arcpy.CreateFileGDB_management(workspace, gdbName, "")

return gdb_name

ArcPy online lesen: https://riptutorial.com/de/python/topic/4693/arcpy

https://riptutorial.com/de/home 58
Kapitel 9: Arrays
Einführung
"Arrays" in Python sind nicht die Arrays in herkömmlichen Programmiersprachen wie C und Java,
sondern näher an Listen. Eine Liste kann eine Sammlung von homogenen oder heterogenen
Elementen sein und kann Ints, Strings oder andere Listen enthalten.

Parameter

Parameter Einzelheiten

b Stellt eine vorzeichenbehaftete Ganzzahl der Größe 1 Byte dar

B Repräsentiert eine vorzeichenlose Ganzzahl der Größe 1 Byte

c Stellt Zeichen der Größe 1 Byte dar

u Stellt ein Unicode-Zeichen der Größe 2 Byte dar

h Stellt eine vorzeichenbehaftete Ganzzahl mit einer Größe von 2 Byte dar

H Stellt eine vorzeichenlose Ganzzahl mit einer Größe von 2 Byte dar

i Stellt eine vorzeichenbehaftete Ganzzahl mit einer Größe von 2 Byte dar

I Stellt eine vorzeichenlose Ganzzahl mit einer Größe von 2 Byte dar

w Stellt ein Unicode-Zeichen der Größe 4 Byte dar

l Stellt eine vorzeichenbehaftete Ganzzahl mit einer Größe von 4 Byte dar

L Repräsentiert eine vorzeichenlose Ganzzahl der Größe 4 Byte

f Stellt einen Gleitkommawert mit einer Größe von 4 Byte dar

d Stellt einen Gleitkommawert mit einer Größe von 8 Byte dar

Examples
Grundlegende Einführung in Arrays

Ein Array ist eine Datenstruktur, in der Werte desselben Datentyps gespeichert werden. In Python
ist dies der Hauptunterschied zwischen Arrays und Listen.

Während Python-Listen Werte enthalten können, die verschiedenen Datentypen entsprechen,

https://riptutorial.com/de/home 59
können Arrays in Python nur Werte enthalten, die demselben Datentyp entsprechen. In diesem
Tutorial werden wir die Python-Arrays anhand einiger Beispiele verstehen.

Wenn Sie mit Python noch nicht vertraut sind, beginnen Sie mit dem Python-Einführungsartikel.

Um Arrays in der Python-Sprache verwenden zu können, müssen Sie das Standard- array Modul
importieren. Das liegt daran, dass Array kein grundlegender Datentyp ist, wie Strings, Integer usw.
So können Sie array Module in Python importieren:

from array import *

Nachdem Sie das array Modul importiert haben, können Sie ein Array deklarieren. So machen Sie
es:

arrayIdentifierName = array(typecode, [Initializers])

In der obigen arrayIdentifierName ist arrayIdentifierName der Name des Arrays. Mit typecode
Python den Typ des Arrays kennen. Initializers sind die Werte, mit denen das Array initialisiert
wird.

Typcodes sind die Codes, mit denen der Typ der Arraywerte oder der Typ des Arrays definiert
wird. Die Tabelle im Parameterabschnitt zeigt die möglichen Werte, die Sie beim Deklarieren
eines Arrays und seines Typs verwenden können.

Hier ist ein reales Beispiel für die Deklaration von Python-Arrays:

my_array = array('i',[1,2,3,4])

In dem obigen Beispiel ist der verwendete Typcode i . Dieser Typcode repräsentiert eine
vorzeichenbehaftete Ganzzahl mit einer Größe von 2 Byte.

Hier ist ein einfaches Beispiel eines Arrays mit 5 Ganzzahlen

from array import *


my_array = array('i', [1,2,3,4,5])
for i in my_array:
print(i)
# 1
# 2
# 3
# 4
# 5

Zugriff auf einzelne Elemente über Indizes

Auf einzelne Elemente kann über Indizes zugegriffen werden. Python-Arrays sind nullindiziert.
Hier ist ein Beispiel :

my_array = array('i', [1,2,3,4,5])

https://riptutorial.com/de/home 60
print(my_array[1])
# 2
print(my_array[2])
# 3
print(my_array[0])
# 1

Hängen Sie mithilfe der append () -Methode einen beliebigen Wert an das
Array an

my_array = array('i', [1,2,3,4,5])


my_array.append(6)
# array('i', [1, 2, 3, 4, 5, 6])

Beachten Sie, dass der Wert 6 an die vorhandenen Array-Werte angehängt wurde.

Fügen Sie mit der Methode insert () einen Wert in ein Array ein

Wir können die Methode insert() verwenden, um einen Wert an einem beliebigen Index des
Arrays einzufügen. Hier ist ein Beispiel :

my_array = array('i', [1,2,3,4,5])


my_array.insert(0,0)
#array('i', [0, 1, 2, 3, 4, 5])

Im obigen Beispiel wurde der Wert 0 an Index 0 eingefügt. Beachten Sie, dass das erste
Argument der Index ist, während das zweite Argument der Wert ist.

Erweitern Sie das Python-Array mit der extend () -Methode

Ein Python-Array kann mit der extend() -Methode um mehrere Werte extend() werden. Hier ist ein
Beispiel :

my_array = array('i', [1,2,3,4,5])


my_extnd_array = array('i', [7,8,9,10])
my_array.extend(my_extnd_array)
# array('i', [1, 2, 3, 4, 5, 7, 8, 9, 10])

Wir sehen, dass das Array my_array mit Werten von my_extnd_array .

Fügen Sie mithilfe der fromlist () -Methode Elemente aus der Liste in das
Array ein

Hier ist ein Beispiel:

my_array = array('i', [1,2,3,4,5])


c=[11,12,13]
my_array.fromlist(c)
# array('i', [1, 2, 3, 4, 5, 11, 12, 13])

https://riptutorial.com/de/home 61
Wir sehen also, dass die Werte 11,12 und 13 von Liste c zu my_array .

Entfernen Sie ein Arrayelement mit der remove () - Methode

Hier ist ein Beispiel :

my_array = array('i', [1,2,3,4,5])


my_array.remove(4)
# array('i', [1, 2, 3, 5])

Wir sehen, dass das Element 4 aus dem Array entfernt wurde.

Entferne das letzte Array-Element mit der pop () -Methode

pop entfernt das letzte Element aus dem Array. Hier ist ein Beispiel :

my_array = array('i', [1,2,3,4,5])


my_array.pop()
# array('i', [1, 2, 3, 4])

Wir sehen also, dass das letzte Element ( 5 ) aus dem Array herausgeplatzt wurde.

Rufen Sie mit Hilfe der index () -Methode jedes Element über seinen Index ab

index()gibt den ersten Index des übereinstimmenden Werts zurück. Denken Sie daran, dass
Arrays nullindiziert sind.

my_array = array('i', [1,2,3,4,5])


print(my_array.index(5))
# 5
my_array = array('i', [1,2,3,3,5])
print(my_array.index(3))
# 3

Beachten Sie in diesem zweiten Beispiel, dass nur ein Index zurückgegeben wurde, obwohl der
Wert zweimal im Array vorhanden ist

Umkehren eines Python-Arrays mithilfe der reverse () -Methode

Die reverse() -Methode macht das, was der Name sagt - das Array wird umgekehrt. Hier ist ein
Beispiel :

my_array = array('i', [1,2,3,4,5])


my_array.reverse()
# array('i', [5, 4, 3, 2, 1])

Abrufen von Array-Pufferinformationen über die buffer_info () -Methode

Diese Methode stellt die Startadresse des Array-Puffers im Speicher und die Anzahl der Elemente

https://riptutorial.com/de/home 62
im Array bereit. Hier ist ein Beispiel:

my_array = array('i', [1,2,3,4,5])


my_array.buffer_info()
(33881712, 5)

Überprüfen Sie die Anzahl der Vorkommen eines Elements mithilfe der
Methode count ()

count() gibt die Anzahl zurück, zu der das Element in einem Array angezeigt wird. Im folgenden
Beispiel sehen wir, dass der Wert 3 zweimal vorkommt.

my_array = array('i', [1,2,3,3,5])


my_array.count(3)
# 2

Konvertieren Sie das Array mithilfe der tostring () -Methode in einen String

tostring() konvertiert das Array in einen String.

my_char_array = array('c', ['g','e','e','k'])


# array('c', 'geek')
print(my_char_array.tostring())
# geek

Konvertieren Sie das Array mithilfe der tolist () -Methode in eine Python-Liste
mit denselben Elementen

Wenn Sie eine Python benötigen list Objekt, können Sie das verwenden tolist() Methode , um
Ihr Array in eine Liste zu konvertieren.

my_array = array('i', [1,2,3,4,5])


c = my_array.tolist()
# [1, 2, 3, 4, 5]

Hängen Sie einen String mit der fromstring () -Methode an das Char-Array an

Sie können eine Zeichenfolge mit fromstring() an ein Zeichenarray anhängen.

my_char_array = array('c', ['g','e','e','k'])


my_char_array.fromstring("stuff")
print(my_char_array)
#array('c', 'geekstuff')

Arrays online lesen: https://riptutorial.com/de/python/topic/4866/arrays

https://riptutorial.com/de/home 63
Kapitel 10: Asyncio-Modul
Examples
Coroutine und Delegation Syntax

Vor der Veröffentlichung von Python 3.5+ verwendete das asyncio Modul Generatoren, um
asynchrone Aufrufe nachzuahmen, und verfügte daher über eine andere Syntax als das aktuelle
Python 3.5-Release.

Python 3.x 3.5

In Python 3.5 wurden die async und await Schlüsselwörter eingeführt. Beachten Sie das Fehlen
von Klammern um den Aufruf von await func() .

import asyncio

async def main():


print(await func())

async def func():


# Do time intensive stuff...
return "Hello, world!"

if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

Python 3.x 3.3 3.5

Vor Python 3.5 wurde der Dekorateur @asyncio.coroutine verwendet, um eine Coroutine zu
definieren. Die Ausbeute aus Ausdruck wurde für die Generatordelegierung verwendet. Beachten
Sie die Klammern um den yield from func() .

import asyncio

@asyncio.coroutine
def main():
print((yield from func()))

@asyncio.coroutine
def func():
# Do time intensive stuff..
return "Hello, world!"

if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

Python 3.x 3.5

Hier ein Beispiel, das zeigt, wie zwei Funktionen asynchron ausgeführt werden können:

https://riptutorial.com/de/home 64
import asyncio

async def cor1():


print("cor1 start")
for i in range(10):
await asyncio.sleep(1.5)
print("cor1", i)

async def cor2():


print("cor2 start")
for i in range(15):
await asyncio.sleep(1)
print("cor2", i)

loop = asyncio.get_event_loop()
cors = asyncio.wait([cor1(), cor2()])
loop.run_until_complete(cors)

Asynchrone Executoren

Hinweis: Verwendet die Python 3.5+ async / await-Syntax

asyncio unterstützt die Verwendung von in concurrent.futures gefundenen Executor Objekten, um


Aufgaben asynchron zu planen. Ereignisschleifen haben die Funktion run_in_executor() die ein
Executor Objekt, ein Callable und die Callable-Parameter übernimmt.

Planen einer Aufgabe für einen Executor

import asyncio
from concurrent.futures import ThreadPoolExecutor

def func(a, b):


# Do time intensive stuff...
return a + b

async def main(loop):


executor = ThreadPoolExecutor()
result = await loop.run_in_executor(executor, func, "Hello,", " world!")
print(result)

if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))

Jede Ereignisschleife verfügt außerdem über einen "Standard" Executor Slot, der einem Executor
zugewiesen werden kann. Um einen Executor zuzuweisen und Aufgaben aus der Schleife zu
planen, verwenden Sie die Methode set_default_executor() .

import asyncio
from concurrent.futures import ThreadPoolExecutor

def func(a, b):


# Do time intensive stuff...
return a + b

https://riptutorial.com/de/home 65
async def main(loop):
# NOTE: Using `None` as the first parameter designates the `default` Executor.
result = await loop.run_in_executor(None, func, "Hello,", " world!")
print(result)

if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.set_default_executor(ThreadPoolExecutor())
loop.run_until_complete(main(loop))

Es gibt zwei Haupttypen von Executor in concurrent.futures , den ThreadPoolExecutor und den
ProcessPoolExecutor . Der ThreadPoolExecutor enthält einen Pool von Threads , die entweder
manuell auf eine bestimmte Anzahl von Fäden durch den Konstruktor oder Standardwerte für die
Anzahl der Kerne auf dem Maschinenzeit 5. eingestellt werden ThreadPoolExecutor verwendet den
Pool von Threads Aufgaben es auszuführen zugeordnet ist und Im Allgemeinen besser bei CPU-
gebundenen Operationen als bei E / A-gebundenen Operationen. ProcessPoolExecutor dies mit
dem ProcessPoolExecutor der für jede ihm zugewiesene Aufgabe einen neuen Prozess erzeugt. Der
ProcessPoolExecutor kann nur Aufgaben und Parameter übernehmen, die kommissionierbar sind.
Die häufigsten nicht auswählbaren Aufgaben sind die Methoden von Objekten. Wenn Sie die
Methode eines Objekts als Task in einem Executor ThreadPoolExecutor müssen, müssen Sie einen
ThreadPoolExecutor .

UVLoop verwenden

uvloop ist eine Implementierung für asyncio.AbstractEventLoop basierend auf libuv (Wird von nodejs
verwendet). Es ist mit 99% der asyncio Funktionen asyncio und ist viel schneller als das
herkömmliche asyncio.EventLoop . uvloop ist derzeit unter Windows nicht verfügbar. Installieren Sie
es mit pip install uvloop .

import asyncio
import uvloop

if __name__ == "__main__":
asyncio.set_event_loop(uvloop.new_event_loop())
# Do your stuff here ...

Sie können die Ereignisschleifen-Factory auch ändern, indem Sie die EventLoopPolicy auf die in
uvloop .

import asyncio
import uvloop

if __name__ == "__main__":
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
loop = asyncio.new_event_loop()

Synchronisationsprimitiv: Ereignis

https://riptutorial.com/de/home 66
Konzept
Verwenden Sie ein Event , um die Planung mehrerer Coroutinen zu synchronisieren .

Vereinfacht gesagt, ist ein Ereignis wie eine Waffe, die auf ein Rennen abgefeuert wird: Es lässt
die Läufer die Startblöcke verlassen.

Beispiel
import asyncio

# event trigger function


def trigger(event):
print('EVENT SET')
event.set() # wake up coroutines waiting

# event consumers
async def consumer_a(event):
consumer_name = 'Consumer A'
print('{} waiting'.format(consumer_name))
await event.wait()
print('{} triggered'.format(consumer_name))

async def consumer_b(event):


consumer_name = 'Consumer B'
print('{} waiting'.format(consumer_name))
await event.wait()
print('{} triggered'.format(consumer_name))

# event
event = asyncio.Event()

# wrap coroutines in one future


main_future = asyncio.wait([consumer_a(event),
consumer_b(event)])

# event loop
event_loop = asyncio.get_event_loop()
event_loop.call_later(0.1, functools.partial(trigger, event)) # trigger event in 0.1 sec

# complete main_future
done, pending = event_loop.run_until_complete(main_future)

Ausgabe:

Verbraucher B wartet
Verbraucher Ein Warten
EVENT SET
Verbraucher B ausgelöst
Consumer A ausgelöst

Ein einfacher Websocket

https://riptutorial.com/de/home 67
Hier asyncio wir mit asyncio einen einfachen Echo- asyncio . Wir definieren Coroutinen für die
Verbindung zu einem Server und zum Senden / Empfangen von Nachrichten. Die Communcations
des websocket werden in einem laufen main Koroutine, die durch eine Ereignisschleife ausgeführt
wird. Dieses Beispiel wurde aus einem früheren Beitrag geändert.

import asyncio
import aiohttp

session = aiohttp.ClientSession() # handles the context manager


class EchoWebsocket:

async def connect(self):


self.websocket = await session.ws_connect("wss://echo.websocket.org")

async def send(self, message):


self.websocket.send_str(message)

async def receive(self):


result = (await self.websocket.receive())
return result.data

async def main():


echo = EchoWebsocket()
await echo.connect()
await echo.send("Hello World!")
print(await echo.receive()) # "Hello World!"

if __name__ == '__main__':
# The main loop
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

Häufiges Missverständnis über Asyncio

Das häufigste Missverständnis über asnycio besteht asnycio darin, dass Sie alle Aufgaben parallel
ausführen können, indem Sie die GIL (globale Interpretersperre) umgehen und parallel dazu
blockierende Jobs (in separaten Threads) ausführen. es tut nicht

asyncio (und Bibliotheken, die mit asyncio ) bauen auf Coroutines auf: Funktionen, die
(gemeinsam) den Steuerungsfluss an die aufrufende Funktion zurückgeben. Beachten Sie
asyncio.sleep in den obigen Beispielen. Dies ist ein Beispiel für eine nicht blockierende Coroutine,
die 'im Hintergrund' wartet und den Steuerungsfluss an die aufrufende Funktion zurückgibt (wenn
mit await aufgerufen). time.sleep ist ein Beispiel für eine time.sleep . Der Ablauf des Programms
wird dort einfach time.sleep und erst nach time.sleep .

Ein reales Beispiel ist die requests die (vorerst) nur aus Sperrfunktionen besteht. Es gibt keine
Parallelität, wenn Sie eine seiner Funktionen innerhalb von asyncio . aiohttp dagegen wurde für
asyncio . Seine Coroutinen werden gleichzeitig laufen.

• Wenn Sie langlaufende CPU-gebundene Aufgaben haben, die Sie parallel asyncio ist asyncio
nichts für Sie. dazu benötigen Sie threads oder multiprocessing .

• wenn Sie IO-gebundene Arbeitsplätze ausgeführt wird , können Sie sie gleichzeitig mit

https://riptutorial.com/de/home 68
laufen asyncio .

Asyncio-Modul online lesen: https://riptutorial.com/de/python/topic/1319/asyncio-modul

https://riptutorial.com/de/home 69
Kapitel 11: Attribut-Zugriff
Syntax
• x.title # Accesses the title attribute using the dot notation
• x.title = "Hello World" # Sets the property of the title attribute using the dot notation
• @property # Used as a decorator before the getter method for properties
• @title.setter # Used as a decorator before the setter method for properties

Examples
Grundlegender Attributzugriff mit der Punktnotation

Nehmen wir eine Probestunde.

class Book:
def __init__(self, title, author):
self.title = title
self.author = author

book1 = Book(title="Right Ho, Jeeves", author="P.G. Wodehouse")

In Python können Sie das Attribut Titel der Klasse Zugriff auf die Punktnotation verwendet.

>>> book1.title
'P.G. Wodehouse'

Wenn ein Attribut nicht vorhanden ist, gibt Python einen Fehler aus:

>>> book1.series
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Book' object has no attribute 'series'

Setter, Getter & Eigenschaften

Für die Datenkapselung möchten Sie manchmal ein Attribut haben, dessen Wert von anderen
Attributen stammt oder generell, welcher Wert momentan berechnet werden soll. Die
Standardmethode, um mit dieser Situation umzugehen, ist das Erstellen einer Methode, Getter
oder Setter genannt.

class Book:
def __init__(self, title, author):
self.title = title
self.author = author

Im obigen Beispiel ist es leicht zu sehen, was passiert, wenn wir ein neues Buch erstellen, das
einen Titel und einen Autor enthält. Wenn alle Bücher, die wir unserer Bibliothek hinzufügen, über

https://riptutorial.com/de/home 70
Autoren und Titel verfügen, können wir die Getter und Setter überspringen und die Punktnotation
verwenden. Angenommen, wir haben einige Bücher, die keinen Autor haben, und wir möchten
den Autor auf "Unbekannt" setzen. Oder wenn sie mehrere Autoren haben und wir planen, eine
Liste der Autoren zurückzugeben.

In diesem Fall können wir einen Getter und einen Setter für das Author- Attribut erstellen.

class P:
def __init__(self,title,author):
self.title = title
self.setAuthor(author)

def get_author(self):
return self.author

def set_author(self, author):


if not author:
self.author = "Unknown"
else:
self.author = author

Dieses Schema wird nicht empfohlen.

Ein Grund ist, dass es einen Haken gibt: Nehmen wir an, wir haben unsere Klasse mit dem
Attribut public und ohne Methoden entworfen. Die Leute haben es schon oft benutzt und Code wie
folgt geschrieben:

>>> book = Book(title="Ancient Manuscript", author="Some Guy")


>>> book.author = "" #Cos Some Guy didn't write this one!

Jetzt haben wir ein Problem. Weil Autor kein Attribut ist! Python bietet eine Lösung für dieses
Problem, die als Eigenschaften bezeichnet wird. Eine Methode zum Abrufen von Eigenschaften
wird mit der @ -Eigenschaft vor dem Header versehen. Die Methode, die wir als Setter verwenden
möchten, ist mit @ attributeName.setter davor versehen.

Deshalb haben wir jetzt unsere neue aktualisierte Klasse.

class Book:
def __init__(self, title, author):
self.title = title
self.author = author

@property
def author(self):
return self.__author

@author.setter
def author(self, author):
if not author:
self.author = "Unknown"
else:
self.author = author

Beachten Sie, dass in Python normalerweise nicht mehrere Methoden mit demselben Namen und

https://riptutorial.com/de/home 71
einer unterschiedlichen Anzahl von Parametern vorhanden sind. In diesem Fall erlaubt Python
dies jedoch aufgrund der verwendeten Dekorateure.

Wenn wir den Code testen:

>>> book = Book(title="Ancient Manuscript", author="Some Guy")


>>> book.author = "" #Cos Some Guy didn't write this one!
>>> book.author
Unknown

Attribut-Zugriff online lesen: https://riptutorial.com/de/python/topic/4392/attribut-zugriff

https://riptutorial.com/de/home 72
Kapitel 12: Audio
Examples
Audio mit Pyglet

import pyglet
audio = pyglet.media.load("audio.wav")
audio.play()

Weitere Informationen finden Sie unter Pyglet

Mit WAV-Dateien arbeiten

gewinnt
• Windows-Umgebung

import winsound
winsound.PlaySound("path_to_wav_file.wav", winsound.SND_FILENAME)

Welle
• Unterstützt Mono / Stereo
• Unterstützt keine Komprimierung / Dekomprimierung

import wave
with wave.open("path_to_wav_file.wav", "rb") as wav_file: # Open WAV file in read-only
mode.
# Get basic information.
n_channels = wav_file.getnchannels() # Number of channels. (1=Mono, 2=Stereo).
sample_width = wav_file.getsampwidth() # Sample width in bytes.
framerate = wav_file.getframerate() # Frame rate.
n_frames = wav_file.getnframes() # Number of frames.
comp_type = wav_file.getcomptype() # Compression type (only supports "NONE").
comp_name = wav_file.getcompname() # Compression name.

# Read audio data.


frames = wav_file.readframes(n_frames) # Read n_frames new frames.
assert len(frames) == sample_width * n_frames

# Duplicate to a new WAV file.


with wave.open("path_to_new_wav_file.wav", "wb") as wav_file: # Open WAV file in write-only
mode.
# Write audio data.
params = (n_channels, sample_width, framerate, n_frames, comp_type, comp_name)
wav_file.setparams(params)
wav_file.writeframes(frames)

https://riptutorial.com/de/home 73
Konvertieren Sie eine beliebige Sounddatei mit Python und ffmpeg

from subprocess import check_call

ok = check_call(['ffmpeg','-i','input.mp3','output.wav'])
if ok:
with open('output.wav', 'rb') as f:
wav_file = f.read()

Hinweis:

• http://superuser.com/questions/507386/why-would-i-choose-libav-over-ffmpeg-or-is-there-
ever-unterschied
• Was sind die Unterschiede und Ähnlichkeiten zwischen ffmpeg, libav und avconv?

Die Windows-Pieptöne werden abgespielt

Windows bietet eine explizite Schnittstelle, über die Sie mit dem Modul winsound rohe Pieptöne bei
einer bestimmten Frequenz und Dauer winsound können.

import winsound
freq = 2500 # Set frequency To 2500 Hertz
dur = 1000 # Set duration To 1000 ms == 1 second
winsound.Beep(freq, dur)

Audio online lesen: https://riptutorial.com/de/python/topic/8189/audio

https://riptutorial.com/de/home 74
Kapitel 13: Ausnahmen
Einführung
Fehler, die während der Ausführung erkannt werden, werden als Ausnahmen bezeichnet und sind
nicht unbedingt tödlich. Die meisten Ausnahmen werden nicht von Programmen behandelt. Es ist
möglich, Programme zu schreiben, die ausgewählte Ausnahmen behandeln. Es gibt bestimmte
Funktionen in Python, um Ausnahmen und Ausnahmelogik zu behandeln. Außerdem haben
Ausnahmen eine reichhaltige BaseException , die alle vom BaseException Typ erben.

Syntax
• Ausnahme auslösen
• # erhöhen eine Ausnahme, die bereits ausgelöst wurde
• Ausnahme von Ursache auslösen # Python 3 - Ausnahmeursache festlegen
• Ausnahme von None auslösen # Python 3 - unterdrückt den gesamten Ausnahmekontext
• Versuchen:
• außer [Ausnahmetypen] [ als Bezeichner ] :
• sonst:
• endlich:

Examples
Ausnahmen aufwerfen

Wenn Ihr Code auf eine Bedingung stößt, mit der er nicht umgehen kann, beispielsweise ein
falscher Parameter, sollte die entsprechende Ausnahme ausgelöst werden.

def even_the_odds(odds):
if odds % 2 != 1:
raise ValueError("Did not get an odd number")

return odds + 1

Ausnahmen fangen

Verwenden Sie try...except: um Ausnahmen abzufangen. Sie sollten so genau wie möglich eine
Ausnahme angeben:

try:
x = 5 / 0
except ZeroDivisionError as e:
# `e` is the exception object
print("Got a divide by zero! The exception was:", e)
# handle exceptional case
x = 0

https://riptutorial.com/de/home 75
finally:
print "The END"
# it runs no matter what execute.

Die angegebene Ausnahmeklasse - in diesem Fall ZeroDivisionError - ZeroDivisionError alle


Ausnahmen, die dieser Klasse oder einer Unterklasse dieser Ausnahmebedingung angehören.

ZeroDivisionError ist beispielsweise eine Unterklasse von ArithmeticError :

>>> ZeroDivisionError.__bases__
(<class 'ArithmeticError'>,)

Das Folgende wird also immer noch den ZeroDivisionError fangen:

try:
5 / 0
except ArithmeticError:
print("Got arithmetic error")

Ausführen von Bereinigungscode mit

Manchmal möchten Sie möglicherweise, dass unabhängig von der aufgetretenen Ausnahme
etwas geschieht, beispielsweise wenn Sie einige Ressourcen bereinigen müssen.

Der finally Block einer try Klausel wird unabhängig davon ausgeführt, ob Ausnahmen ausgelöst
wurden.

resource = allocate_some_expensive_resource()
try:
do_stuff(resource)
except SomeException as e:
log_error(e)
raise # re-raise the error
finally:
free_expensive_resource(resource)

Dieses Muster wird mit Kontextmanagern (mit der Anweisung with ) oft besser behandelt.

Ausnahmen erneut erhöhen

Manchmal möchten Sie eine Ausnahme erfassen, um sie zu prüfen, z. B. zu


Protokollierungszwecken. Nach der Inspektion möchten Sie, dass die Ausnahme wie zuvor
weitergegeben wird.

Verwenden Sie in diesem Fall einfach die raise Anweisung ohne Parameter.

try:
5 / 0
except ZeroDivisionError:
print("Got an error")
raise

https://riptutorial.com/de/home 76
Beachten Sie jedoch, dass jemand weiter oben im Aufrufer-Stack die Ausnahme noch fangen und
irgendwie damit umgehen kann. Die fertige Ausgabe kann in diesem Fall ein Ärgernis sein, da
dies auf jeden Fall passieren wird (gefangen oder nicht gefangen). Daher empfiehlt es sich, eine
andere Ausnahme auszulösen, die Ihren Kommentar zur Situation sowie die ursprüngliche
Ausnahme enthält:

try:
5 / 0
except ZeroDivisionError as e:
raise ZeroDivisionError("Got an error", e)

Dies hat jedoch den Nachteil, dass die Ausnahmespur auf genau diese raise reduziert wird raise
während die raise ohne Argument die ursprüngliche Ausnahmespur beibehält.

In Python 3 können Sie den ursprünglichen Stapel beibehalten, indem Sie die raise - from - Syntax
verwenden:

raise ZeroDivisionError("Got an error") from e

Kettenausnahmen mit Raise from

Bei der Behandlung einer Ausnahme können Sie eine weitere Ausnahme auslösen. Wenn Sie
IOError beim Lesen aus einer Datei einen IOError , möchten Sie möglicherweise einen
anwendungsspezifischen Fehler IOError , der stattdessen den Benutzern Ihrer Bibliothek
angezeigt wird.

Python 3.x 3.0

Sie können Ausnahmen verketten, um zu zeigen, wie die Behandlung von Ausnahmen abläuft:

>>> try:
5 / 0
except ZeroDivisionError as e:
raise ValueError("Division failed") from e

Traceback (most recent call last):


File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):


File "<stdin>", line 4, in <module>
ValueError: Division failed

Ausnahmehierarchie

Die Ausnahmebehandlung erfolgt basierend auf einer Ausnahmehierarchie, die durch die
Vererbungsstruktur der Ausnahmeklassen bestimmt wird.

Beispielsweise sind IOError und OSError beide Unterklassen von EnvironmentError . Code, der

https://riptutorial.com/de/home 77
einen IOError , fängt keinen OSError . Code, der einen EnvironmentError IOError , fängt jedoch
sowohl IOError als auch OSError s ab.

Die Hierarchie der integrierten Ausnahmen:

Python 2.x 2.3

BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StandardError
| +-- BufferError
| +-- ArithmeticError
| | +-- FloatingPointError
| | +-- OverflowError
| | +-- ZeroDivisionError
| +-- AssertionError
| +-- AttributeError
| +-- EnvironmentError
| | +-- IOError
| | +-- OSError
| | +-- WindowsError (Windows)
| | +-- VMSError (VMS)
| +-- EOFError
| +-- ImportError
| +-- LookupError
| | +-- IndexError
| | +-- KeyError
| +-- MemoryError
| +-- NameError
| | +-- UnboundLocalError
| +-- ReferenceError
| +-- RuntimeError
| | +-- NotImplementedError
| +-- SyntaxError
| | +-- IndentationError
| | +-- TabError
| +-- SystemError
| +-- TypeError
| +-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning

Python 3.x 3.0

https://riptutorial.com/de/home 78
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning

https://riptutorial.com/de/home 79
+-- BytesWarning
+-- ResourceWarning

Ausnahmen sind auch Objekte

Ausnahmen sind nur reguläre Python-Objekte, die von der integrierten BaseException erben. Ein
Python-Skript kann die Anweisung raise verwenden, raise Ausführung zu unterbrechen, sodass
Python an diesem Punkt einen Stack-Trace des Aufrufstapels und eine Darstellung der
Ausnahmeinstanz ausgibt. Zum Beispiel:

>>> def failing_function():


... raise ValueError('Example error!')
>>> failing_function()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in failing_function
ValueError: Example error!

was besagt, dass ein ValueError mit der Meldung 'Example error!' wurde durch unsere
failing_function() , die im Interpreter ausgeführt wurde.

Anrufcode kann beliebige Ausnahmen aller Art behandeln, die ein Anruf auslösen kann:

>>> try:
... failing_function()
... except ValueError:
... print('Handled the error')
Handled the error

Sie können halten , die Ausnahme - Objekte erhalten , indem sie in der Zuordnung except... Teil
des Ausnahmebehandlung Code:

>>> try:
... failing_function()
... except ValueError as e:
... print('Caught exception', repr(e))
Caught exception ValueError('Example error!',)

Eine vollständige Liste der integrierten Python-Ausnahmen mit ihren Beschreibungen finden Sie in
der Python-Dokumentation: https://docs.python.org/3.5/library/exceptions.html . Und hier ist die
vollständige Liste hierarchisch angeordnet: Ausnahmehierarchie .

Benutzerdefinierte Ausnahmetypen erstellen

Erstellen Sie eine Klasse, die von Exception erbt:

class FooException(Exception):
pass
try:
raise FooException("insert description here")
except FooException:

https://riptutorial.com/de/home 80
print("A FooException was raised.")

oder ein anderer Ausnahmetyp:

class NegativeError(ValueError):
pass

def foo(x):
# function that only accepts positive values of x
if x < 0:
raise NegativeError("Cannot process negative numbers")
... # rest of function body
try:
result = foo(int(input("Enter a positive integer: "))) # raw_input in Python 2.x
except NegativeError:
print("You entered a negative number!")
else:
print("The result was " + str(result))

Fangen Sie nicht alles!

Während es oft versucht ist, jede Exception zu fangen:

try:
very_difficult_function()
except Exception:
# log / try to reconnect / exit gratiously
finally:
print "The END"
# it runs no matter what execute.

Oder sogar alles (dazu gehören BaseException und alle BaseException einschließlich Exception ):

try:
even_more_difficult_function()
except:
pass # do whatever needed

In den meisten Fällen ist es eine schlechte Praxis. Es könnte mehr als beabsichtigt sein, z. B.
SystemExit , KeyboardInterrupt und MemoryError Jeder sollte im Allgemeinen anders behandelt
werden als MemoryError System- oder Logikfehler. Dies bedeutet auch, dass es kein klares
Verständnis dafür gibt, was der interne Code falsch machen kann und wie er sich von diesem
Zustand richtig erholen kann. Wenn Sie jeden Fehler feststellen, wissen Sie nicht, welcher Fehler
aufgetreten ist oder wie er zu beheben ist.

Dies wird häufiger als "Bug Masking" bezeichnet und sollte vermieden werden. Lassen Sie Ihr
Programm abstürzen, anstatt im Hintergrund zu versagen oder gar zu verschlimmern, und zwar
auf einer tieferen Ausführungsebene. (Stellen Sie sich vor, es ist ein Transaktionssystem)

Normalerweise werden diese Konstrukte auf der äußersten Ebene des Programms verwendet und
protokollieren die Details des Fehlers, sodass der Fehler behoben werden kann oder der Fehler
genauer behandelt werden kann.

https://riptutorial.com/de/home 81
Mehrere Ausnahmen abfangen

Es gibt mehrere Möglichkeiten, mehrere Ausnahmen abzufangen .

Die erste besteht darin, ein Tupel der Ausnahmetypen zu erstellen, die auf dieselbe Weise
abgefangen und behandelt werden sollen. In diesem Beispiel ignoriert der Code die Ausnahmen
KeyError und AttributeError .

try:
d = {}
a = d[1]
b = d.non_existing_field
except (KeyError, AttributeError) as e:
print("A KeyError or an AttributeError exception has been caught.")

Wenn Sie unterschiedliche Ausnahmen auf unterschiedliche Weise behandeln möchten, können
Sie für jeden Typ einen eigenen Ausnahmeblock bereitstellen. In diesem Beispiel fangen wir
immer noch KeyError und AttributeError , behandeln die Ausnahmen jedoch auf unterschiedliche
Weise.

try:
d = {}
a = d[1]
b = d.non_existing_field
except KeyError as e:
print("A KeyError has occurred. Exception message:", e)
except AttributeError as e:
print("An AttributeError has occurred. Exception message:", e)

Praktische Beispiele für die Behandlung von Ausnahmen

Benutzereingabe
Stellen Sie sich vor, Sie möchten, dass ein Benutzer über die Eingabe eine Nummer input . Sie
möchten sicherstellen, dass die Eingabe eine Zahl ist. Sie können try / mit except davon
verwenden:

Python 3.x 3.0

while True:
try:
nb = int(input('Enter a number: '))
break
except ValueError:
print('This is not a number, try again.')

Hinweis: Python 2.x verwendet stattdessen raw_input . die Funktion input existiert in Python 2.x
hat aber eine andere Semantik. Im obigen Beispiel würde die input auch Ausdrücke wie 2 + 2
akzeptieren, die eine Zahl ergeben.

https://riptutorial.com/de/home 82
Wenn die Eingabe nicht in eine Ganzzahl konvertiert werden konnte, wird ein ValueError . Sie
können es mit except fangen. Wenn keine Ausnahme ausgelöst wird break springt break aus der
Schleife. Nach der Schleife enthält nb eine ganze Zahl.

Wörterbücher
Stellen Sie sich über eine Liste von aufeinanderfolgenden ganzen Zahlen iterieren, wie range(n) ,
und Sie haben eine Liste der Wörterbücher d , die Informationen über die Dinge enthält zu tun ,
wenn Sie einige bestimmte ganze Zahlen auftreten, sagen die überspringen d[i] Nächsten.

d = [{7: 3}, {25: 9}, {38: 5}]

for i in range(len(d)):
do_stuff(i)
try:
dic = d[i]
i += dic[i]
except KeyError:
i += 1

Ein KeyError wird KeyError , wenn Sie versuchen, einen Wert aus einem Wörterbuch für einen nicht
vorhandenen Schlüssel KeyError .

Sonst

Code in einem else-Block wird nur ausgeführt, wenn vom Code im try Block keine Ausnahmen
ausgelöst wurden. Dies ist nützlich, wenn Sie Code haben, den Sie nicht ausführen möchten,
wenn eine Ausnahme ausgelöst wird. Sie möchten jedoch nicht, dass durch diesen Code
ausgelöste Ausnahmen abgefangen werden.

Zum Beispiel:

try:
data = {1: 'one', 2: 'two'}
print(data[1])
except KeyError as e:
print('key not found')
else:
raise ValueError()
# Output: one
# Output: ValueError

Beachten Sie, dass diese Art von else: nicht mit einer if -Klausel zu einem elif . Wenn Sie
Folgendes haben, if es unter dem else: eingerückt bleiben muss:

try:
...
except ...:
...
else:
if ...:

https://riptutorial.com/de/home 83
...
elif ...:
...
else:
...

Ausnahmen online lesen: https://riptutorial.com/de/python/topic/1788/ausnahmen

https://riptutorial.com/de/home 84
Kapitel 14: Bedienmodul
Examples
Operatoren als Alternative zu einem Infix-Operator

Für jeden Infix-Operator, zB + gibt es eine operator ( operator.add für + ):

1 + 1
# Output: 2
from operator import add
add(1, 1)
# Output: 2

Obwohl in der Hauptdokumentation angegeben ist, dass für die arithmetischen Operatoren nur
numerische Eingaben zulässig sind, ist dies möglich:

from operator import mul


mul('a', 10)
# Output: 'aaaaaaaaaa'
mul([3], 3)
# Output: [3, 3, 3]

Siehe auch: Mapping von Operation zu Operator-Funktion in der offiziellen Python-Dokumentation


.

Methodenaufruf

Anstelle dieser lambda , die die Methode explizit aufruft:

alist = ['wolf', 'sheep', 'duck']


list(filter(lambda x: x.startswith('d'), alist)) # Keep only elements that start with 'd'
# Output: ['duck']

Man könnte eine Operator-Funktion verwenden, die dasselbe tut:

from operator import methodcaller


list(filter(methodcaller('startswith', 'd'), alist)) # Does the same but is faster.
# Output: ['duck']

Itemgetter

Gruppieren der Schlüssel-Wert-Paare eines Wörterbuchs nach dem Wert mit itemgetter :

from itertools import groupby


from operator import itemgetter
adict = {'a': 1, 'b': 5, 'c': 1}

https://riptutorial.com/de/home 85
dict((i, dict(v)) for i, v in groupby(adict.items(), itemgetter(1)))
# Output: {1: {'a': 1, 'c': 1}, 5: {'b': 5}}

was einer lambda Funktion wie folgt entspricht (aber schneller ist):

dict((i, dict(v)) for i, v in groupby(adict.items(), lambda x: x[1]))

Oder eine Liste von Tupeln nach dem zweiten Element sortieren, zuerst das erste Element als
sekundär:

alist_of_tuples = [(5,2), (1,3), (2,2)]


sorted(alist_of_tuples, key=itemgetter(1,0))
# Output: [(2, 2), (5, 2), (1, 3)]

Bedienmodul online lesen: https://riptutorial.com/de/python/topic/257/bedienmodul

https://riptutorial.com/de/home 86
Kapitel 15: Befehlszeilenargumente
analysieren
Einführung
Die meisten Befehlszeilentools sind auf Argumente angewiesen, die bei der Ausführung an das
Programm übergeben werden. Anstatt zur Eingabe aufzufordern, erwarten diese Programme,
dass Daten oder bestimmte Flags (die zu Booleans werden) gesetzt werden. Dies ermöglicht es
dem Benutzer und anderen Programmen, die Python-Datei auszuführen, wobei die Daten beim
Start übergeben werden. In diesem Abschnitt wird die Implementierung und Verwendung von
Befehlszeilenargumenten in Python erläutert und veranschaulicht.

Examples
Hallo Welt in Schwierigkeiten

Das folgende Programm sagt dem Benutzer Hallo. Es erfordert ein Positionsargument, den
Namen des Benutzers, und die Begrüßung kann auch mitgeteilt werden.

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('name',
help='name of user'
)

parser.add_argument('-g', '--greeting',
default='Hello',
help='optional alternate greeting'
)

args = parser.parse_args()

print("{greeting}, {name}!".format(
greeting=args.greeting,
name=args.name)
)

$ python hello.py --help


usage: hello.py [-h] [-g GREETING] name

positional arguments:
name name of user

optional arguments:
-h, --help show this help message and exit
-g GREETING, --greeting GREETING
optional alternate greeting

https://riptutorial.com/de/home 87
$ python hello.py world
Hello, world!
$ python hello.py John -g Howdy
Howdy, John!

Für weitere Details lesen Sie bitte die argparse-Dokumentation .

Grundlegendes Beispiel mit docopt

docopt konvertiert Befehlszeilenargumente auf den Kopf. Statt die Argumente zu analysieren,
schreiben Sie einfach die Verwendungszeichenfolge für Ihr Programm, und docopt analysiert
die Verwendungszeichenfolge und verwendet sie zum Extrahieren der Befehlszeilenargumente.

"""
Usage:
script_name.py [-a] [-b] <path>

Options:
-a Print all the things.
-b Get more bees into the path.
"""
from docopt import docopt

if __name__ == "__main__":
args = docopt(__doc__)
import pprint; pprint.pprint(args)

Probeläufe:

$ python script_name.py
Usage:
script_name.py [-a] [-b] <path>
$ python script_name.py something
{'-a': False,
'-b': False,
'<path>': 'something'}
$ python script_name.py something -a
{'-a': True,
'-b': False,
'<path>': 'something'}
$ python script_name.py -b something -a
{'-a': True,
'-b': True,
'<path>': 'something'}

Setzen Sie sich gegenseitig ausschließende Argumente mit argparse

Wenn zwei oder mehr Argumente sich gegenseitig ausschließen sollen. Sie können die Funktion
argparse.ArgumentParser.add_mutually_exclusive_group() . Im folgenden Beispiel können entweder
foo oder bar vorhanden sein, jedoch nicht beide gleichzeitig.

import argparse

https://riptutorial.com/de/home 88
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-f", "--foo")
group.add_argument("-b", "--bar")
args = parser.parse_args()
print "foo = ", args.foo
print "bar = ", args.bar

Wenn Sie versuchen, das Skript --foo --bar Argumente --foo und --bar , beschwert sich das
Skript mit der folgenden Meldung.

error: argument -b/--bar: not allowed with argument -f/--foo

Befehlszeilenargumente mit argv verwenden

Wenn ein Python-Skript von der Befehlszeile aus aufgerufen wird, kann der Benutzer zusätzliche
Befehlszeilenargumente angeben, die an das Skript übergeben werden. Diese Argumente
werden an den Programmierer von der Systemvariablen zur Verfügung sys.argv ( „argv“ ist ein
traditioneller Name in den meisten Programmiersprachen verwendet, und es bedeutet „arg
UMENT v ector“).

sys.argv ist das erste Element in der Liste sys.argv der Name des Python-Skripts selbst, während
die übrigen Elemente die Token sind, die der Benutzer beim Aufrufen des Skripts sys.argv .

# cli.py
import sys
print(sys.argv)

$ python cli.py
=> ['cli.py']

$ python cli.py fizz


=> ['cli.py', 'fizz']

$ python cli.py fizz buzz


=> ['cli.py', 'fizz', 'buzz']

Hier ist ein weiteres Beispiel für die Verwendung von argv . Wir entfernen zunächst das
ursprüngliche Element von sys.argv, da es den Namen des Skripts enthält. Dann kombinieren wir
den Rest der Argumente in einem einzigen Satz und drucken diesen Satz vor dem Namen des
aktuell angemeldeten Benutzers (damit ein Chat-Programm emuliert wird).

import getpass
import sys

words = sys.argv[1:]
sentence = " ".join(words)
print("[%s] %s" % (getpass.getuser(), sentence))

Der Algorithmus, der häufig verwendet wird, wenn eine Anzahl nicht-positioneller Argumente
"manuell" analysiert wird, besteht darin, die Liste sys.argv . Eine Möglichkeit ist, die Liste
durchzugehen und jedes Element davon zu platzieren:

https://riptutorial.com/de/home 89
# reverse and copy sys.argv
argv = reversed(sys.argv)
# extract the first element
arg = argv.pop()
# stop iterating when there's no more args to pop()
while len(argv) > 0:
if arg in ('-f', '--foo'):
print('seen foo!')
elif arg in ('-b', '--bar'):
print('seen bar!')
elif arg in ('-a', '--with-arg'):
arg = arg.pop()
print('seen value: {}'.format(arg))
# get the next value
arg = argv.pop()

Benutzerdefinierte Parser-Fehlernachricht mit Argumenten

Sie können Parser-Fehlermeldungen entsprechend Ihren Skriptanforderungen erstellen. Dies


geschieht über die Funktion argparse.ArgumentParser.error . Das folgende Beispiel zeigt, dass das
Skript eine Verwendung und eine --foo an stderr --foo wenn --foo wird, aber nicht --bar .

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-f", "--foo")
parser.add_argument("-b", "--bar")
args = parser.parse_args()
if args.foo and args.bar is None:
parser.error("--foo requires --bar. You did not specify bar.")

print "foo =", args.foo


print "bar =", args.bar

Angenommen, Ihr Skriptname lautet sample.py, und wir führen python sample.py --foo
ds_in_fridge : python sample.py --foo ds_in_fridge

Das Skript wird sich mit folgendem beschweren:

usage: sample.py [-h] [-f FOO] [-b BAR]


sample.py: error: --foo requires --bar. You did not specify bar.

Konzeptionelle Gruppierung von Argumenten mit


argparse.add_argument_group ()

Wenn Sie argparse ArgumentParser () erstellen und Ihr Programm mit '-h' ausführen, erhalten Sie
eine automatisierte Verwendungsnachricht, in der erläutert wird, mit welchen Argumenten Sie Ihre
Software ausführen können. Positionsargumente und bedingte Argumente sind standardmäßig in
zwei Kategorien unterteilt. Beispiel: Ein kleines Skript (example.py) und die Ausgabe, wenn Sie
python example.py -h ausführen.

import argparse

https://riptutorial.com/de/home 90
parser = argparse.ArgumentParser(description='Simple example')
parser.add_argument('name', help='Who to greet', default='World')
parser.add_argument('--bar_this')
parser.add_argument('--bar_that')
parser.add_argument('--foo_this')
parser.add_argument('--foo_that')
args = parser.parse_args()

usage: example.py [-h] [--bar_this BAR_THIS] [--bar_that BAR_THAT]


[--foo_this FOO_THIS] [--foo_that FOO_THAT]
name

Simple example

positional arguments:
name Who to greet

optional arguments:
-h, --help show this help message and exit
--bar_this BAR_THIS
--bar_that BAR_THAT
--foo_this FOO_THIS
--foo_that FOO_THAT

Es gibt Situationen, in denen Sie Ihre Argumente in weitere konzeptionelle Abschnitte unterteilen
möchten, um Ihren Benutzer zu unterstützen. Beispielsweise möchten Sie möglicherweise alle
Eingabeoptionen in einer Gruppe und alle Optionen zur Ausgabeformatierung in einer anderen
Gruppe haben. Das obige Beispiel kann angepasst werden, um die --foo_* args von den --bar_*
args zu trennen.

import argparse

parser = argparse.ArgumentParser(description='Simple example')


parser.add_argument('name', help='Who to greet', default='World')
# Create two argument groups
foo_group = parser.add_argument_group(title='Foo options')
bar_group = parser.add_argument_group(title='Bar options')
# Add arguments to those groups
foo_group.add_argument('--bar_this')
foo_group.add_argument('--bar_that')
bar_group.add_argument('--foo_this')
bar_group.add_argument('--foo_that')
args = parser.parse_args()

Was erzeugt diese Ausgabe, wenn python example.py -h wird:

usage: example.py [-h] [--bar_this BAR_THIS] [--bar_that BAR_THAT]


[--foo_this FOO_THIS] [--foo_that FOO_THAT]
name

Simple example

positional arguments:
name Who to greet

optional arguments:

https://riptutorial.com/de/home 91
-h, --help show this help message and exit

Foo options:
--bar_this BAR_THIS
--bar_that BAR_THAT

Bar options:
--foo_this FOO_THIS
--foo_that FOO_THAT

Erweitertes Beispiel mit docopt und docopt_dispatch

Wie bei docopt bilden Sie mit [docopt_dispatch] Ihre --help in die Variable __doc__ Ihres
Einstiegspunktmoduls. Dort rufen Sie dispatch mit dem doc-String als Argument auf, damit der
Parser darüber laufen kann.

Anstatt die Argumente manuell zu handhaben (was normalerweise in einer if / else-Struktur mit
hoher Zyklizität endet), überlassen Sie es dem Versand, indem Sie nur angeben, wie Sie die
Menge der Argumente behandeln wollen.

Dafür gibt es den dispatch.on Dekorator: Sie geben ihm das Argument oder die Folge von
Argumenten, die die Funktion auslösen sollen, und diese Funktion wird mit den
übereinstimmenden Werten als Parameter ausgeführt.

"""Run something in development or production mode.

Usage: run.py --development <host> <port>


run.py --production <host> <port>
run.py items add <item>
run.py items delete <item>

"""
from docopt_dispatch import dispatch

@dispatch.on('--development')
def development(host, port, **kwargs):
print('in *development* mode')

@dispatch.on('--production')
def development(host, port, **kwargs):
print('in *production* mode')

@dispatch.on('items', 'add')
def items_add(item, **kwargs):
print('adding item...')

@dispatch.on('items', 'delete')
def items_delete(item, **kwargs):
print('deleting item...')

if __name__ == '__main__':
dispatch(__doc__)

Befehlszeilenargumente analysieren online lesen:


https://riptutorial.com/de/python/topic/1382/befehlszeilenargumente-analysieren

https://riptutorial.com/de/home 92
Kapitel 16: Benutzerdefinierte Fehler /
Ausnahmen auslösen
Einführung
In Python gibt es viele Ausnahmen, die das Programm dazu zwingen, einen Fehler auszugeben,
wenn ein Fehler auftritt.

Manchmal müssen Sie jedoch benutzerdefinierte Ausnahmen erstellen, die Ihrem Zweck dienen.

In Python können Benutzer solche Ausnahmen definieren, indem sie eine neue Klasse erstellen.
Diese Ausnahmeklasse muss direkt oder indirekt von der Ausnahmeklasse abgeleitet werden. Die
meisten der integrierten Ausnahmen sind auch von dieser Klasse abgeleitet.

Examples
Benutzerdefinierte Ausnahme

Hier haben wir eine benutzerdefinierte Ausnahme namens CustomError erstellt, die von der
Exception-Klasse abgeleitet wird. Diese neue Ausnahme kann wie andere Ausnahmen ausgelöst
werden, wenn die Erhöhungsanweisung mit einer optionalen Fehlermeldung verwendet wird.

class CustomError(Exception):
pass

x = 1

if x == 1:
raise CustomError('This is custom error')

Ausgabe:

Traceback (most recent call last):


File "error_custom.py", line 8, in <module>
raise CustomError('This is custom error')
__main__.CustomError: This is custom error

Fange eine benutzerdefinierte Ausnahme

Dieses Beispiel zeigt, wie benutzerdefinierte Ausnahmen abgerufen werden

class CustomError(Exception):
pass

try:
raise CustomError('Can you catch me ?')
except CustomError as e:

https://riptutorial.com/de/home 93
print ('Catched CustomError :{}'.format(e))
except Exception as e:
print ('Generic exception: {}'.format(e))

Ausgabe:

Catched CustomError :Can you catch me ?

Benutzerdefinierte Fehler / Ausnahmen auslösen online lesen:


https://riptutorial.com/de/python/topic/10882/benutzerdefinierte-fehler---ausnahmen-auslosen

https://riptutorial.com/de/home 94
Kapitel 17: Benutzerdefinierte Methoden
Examples
Benutzerdefinierte Methodenobjekte erstellen

Benutzerdefinierte Methodenobjekte können erstellt werden, wenn ein Attribut einer Klasse
abgerufen wird (möglicherweise über eine Instanz dieser Klasse), wenn dieses Attribut ein
benutzerdefiniertes Funktionsobjekt, ein ungebundenes benutzerdefiniertes Methodenobjekt oder
ein Klassenmethodenobjekt ist.

class A(object):
# func: A user-defined function object
#
# Note that func is a function object when it's defined,
# and an unbound method object when it's retrieved.
def func(self):
pass

# classMethod: A class method


@classmethod
def classMethod(self):
pass

class B(object):
# unboundMeth: A unbound user-defined method object
#
# Parent.func is an unbound user-defined method object here,
# because it's retrieved.
unboundMeth = A.func

a = A()
b = B()

print A.func
# output: <unbound method A.func>
print a.func
# output: <bound method A.func of <__main__.A object at 0x10e9ab910>>
print B.unboundMeth
# output: <unbound method A.func>
print b.unboundMeth
# output: <unbound method A.func>
print A.classMethod
# output: <bound method type.classMethod of <class '__main__.A'>>
print a.classMethod
# output: <bound method type.classMethod of <class '__main__.A'>>

Wenn das Attribut ein benutzerdefiniertes Methodenobjekt ist, wird ein neues Methodenobjekt nur
erstellt, wenn die Klasse, von der es abgerufen wird, mit der im ursprünglichen Methodenobjekt
gespeicherten Klasse übereinstimmt oder davon abgeleitet ist. Andernfalls wird das ursprüngliche
Methodenobjekt unverändert verwendet.

# Parent: The class stored in the original method object

https://riptutorial.com/de/home 95
class Parent(object):
# func: The underlying function of original method object
def func(self):
pass
func2 = func

# Child: A derived class of Parent


class Child(Parent):
func = Parent.func

# AnotherClass: A different class, neither subclasses nor subclassed


class AnotherClass(object):
func = Parent.func

print Parent.func is Parent.func # False, new object created


print Parent.func2 is Parent.func2 # False, new object created
print Child.func is Child.func # False, new object created
print AnotherClass.func is AnotherClass.func # True, original object used

Schildkröte zum Beispiel

Im Folgenden finden Sie ein Beispiel für die Verwendung einer benutzerdefinierten Funktion, die in
einem Skript einfach (∞) mal aufgerufen werden kann.

import turtle, time, random #tell python we need 3 different modules


turtle.speed(0) #set draw speed to the fastest
turtle.colormode(255) #special colormode
turtle.pensize(4) #size of the lines that will be drawn
def triangle(size): #This is our own function, in the parenthesis is a variable we have
defined that will be used in THIS FUNCTION ONLY. This fucntion creates a right triangle
turtle.forward(size) #to begin this function we go forward, the amount to go forward by is
the variable size
turtle.right(90) #turn right by 90 degree
turtle.forward(size) #go forward, again with variable
turtle.right(135) #turn right again
turtle.forward(size * 1.5) #close the triangle. thanks to the Pythagorean theorem we know
that this line must be 1.5 times longer than the other two(if they are equal)
while(1): #INFINITE LOOP
turtle.setpos(random.randint(-200, 200), random.randint(-200, 200)) #set the draw point to
a random (x,y) position
turtle.pencolor(random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))
#randomize the RGB color
triangle(random.randint(5, 55)) #use our function, because it has only one variable we can
simply put a value in the parenthesis. The value that will be sent will be random between 5 -
55, end the end it really just changes ow big the triangle is.
turtle.pencolor(random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))
#randomize color again

Benutzerdefinierte Methoden online lesen:


https://riptutorial.com/de/python/topic/3965/benutzerdefinierte-methoden

https://riptutorial.com/de/home 96
Kapitel 18: Binärdaten
Syntax
• pack (fmt, v1, v2, ...)
• entpacken (fmt, puffer)

Examples
Formatieren Sie eine Liste von Werten in ein Byteobjekt

from struct import pack

print(pack('I3c', 123, b'a', b'b', b'c')) # b'{\x00\x00\x00abc'

Entpacken Sie ein Byte-Objekt gemäß einer Formatzeichenfolge

from struct import unpack

print(unpack('I3c', b'{\x00\x00\x00abc')) # (123, b'a', b'b', b'c')

Struktur verpacken

Das Modul " struct " bietet die Möglichkeit, Python-Objekte als zusammenhängende Byte-Blöcke
zu packen oder eine Menge von Byte in Python-Strukturen zu zerlegen.

Die Pack-Funktion akzeptiert eine Formatzeichenfolge und ein oder mehrere Argumente und gibt
eine Binärzeichenfolge zurück. Das sieht fast so aus, als würden Sie eine Zeichenfolge
formatieren, mit der Ausnahme, dass die Ausgabe keine Zeichenfolge ist, sondern ein Teil von
Bytes.

import struct
import sys
print "Native byteorder: ", sys.byteorder
# If no byteorder is specified, native byteorder is used
buffer = struct.pack("ihb", 3, 4, 5)
print "Byte chunk: ", repr(buffer)
print "Byte chunk unpacked: ", struct.unpack("ihb", buffer)
# Last element as unsigned short instead of unsigned char ( 2 Bytes)
buffer = struct.pack("ihh", 3, 4, 5)
print "Byte chunk: ", repr(buffer)

Ausgabe:

Native Byte-Reihenfolge: kleiner Byte-Block: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x05'
Byte-Block entpackt: (3, 4, 5) Byte-Block: '\ x03 \ x00 \ x00 \ x00 \ x04 \ x00 \ x05 \ x00 '

https://riptutorial.com/de/home 97
Sie können die Bytereihenfolge des Netzwerks für Daten verwenden, die vom Netzwerk
empfangen werden, oder Packdaten, um sie an das Netzwerk zu senden.

import struct
# If no byteorder is specified, native byteorder is used
buffer = struct.pack("hhh", 3, 4, 5)
print "Byte chunk native byte order: ", repr(buffer)
buffer = struct.pack("!hhh", 3, 4, 5)
print "Byte chunk network byte order: ", repr(buffer)

Ausgabe:

Byte-Byte-Byte-Reihenfolge: '\ x03 \ x00 \ x04 \ x00 \ x05 \ x00'

Reihenfolge der Bytes des Byte-Chunks: '\ x00 \ x03 \ x00 \ x04 \ x00 \ x05'

Sie können die Optimierung optimieren, indem Sie den Aufwand für die Zuweisung eines neuen
Puffers vermeiden, indem Sie einen zuvor erstellten Puffer bereitstellen.

import struct
from ctypes import create_string_buffer
bufferVar = create_string_buffer(8)
bufferVar2 = create_string_buffer(8)
# We use a buffer that has already been created
# provide format, buffer, offset and data
struct.pack_into("hhh", bufferVar, 0, 3, 4, 5)
print "Byte chunk: ", repr(bufferVar.raw)
struct.pack_into("hhh", bufferVar2, 2, 3, 4, 5)
print "Byte chunk: ", repr(bufferVar2.raw)

Ausgabe:

Byte-Block: '\ x03 \ x00 \ x04 \ x00 \ x05 \ x00 \ x00 \ x00'

Byte-Block: '\ x00 \ x00 \ x03 \ x00 \ x04 \ x00 \ x05 \ x00'

Binärdaten online lesen: https://riptutorial.com/de/python/topic/2978/binardaten

https://riptutorial.com/de/home 98
Kapitel 19: Bitweise Operatoren
Einführung
Bitweise Operationen ändern binäre Zeichenfolgen auf Bitebene. Diese Operationen sind
unglaublich einfach und werden vom Prozessor direkt unterstützt. Diese wenigen Operationen
sind für die Arbeit mit Gerätetreibern, Low-Level-Grafik, Kryptografie und Netzwerkkommunikation
erforderlich. Dieser Abschnitt enthält nützliche Kenntnisse und Beispiele für die bitweisen
Operatoren von Python.

Syntax
• x << y # Bitweise Linksverschiebung

• x >> y # Bitweise Rechtsverschiebung

• x & y # Bitweise UND

• x | y # Bitweise ODER

• ~ x # Bitweise NICHT

• x ^ y # Bitweise XOR

Examples
Bitweises AND

Der Operator & führt ein binäres AND aus , wobei ein Bit kopiert wird, wenn es in beiden
Operanden vorhanden ist. Das bedeutet:

# 0 & 0 = 0
# 0 & 1 = 0
# 1 & 0 = 0
# 1 & 1 = 1

# 60 = 0b111100
# 30 = 0b011110
60 & 30
# Out: 28
# 28 = 0b11100

bin(60 & 30)


# Out: 0b11100

Bitweises ODER

Die | Der Operator führt ein binäres "oder" aus, wobei ein Bit kopiert wird, wenn es in einem der

https://riptutorial.com/de/home 99
Operanden vorhanden ist. Das bedeutet:

# 0 | 0 = 0
# 0 | 1 = 1
# 1 | 0 = 1
# 1 | 1 = 1

# 60 = 0b111100
# 30 = 0b011110
60 | 30
# Out: 62
# 62 = 0b111110

bin(60 | 30)
# Out: 0b111110

Bitweises XOR (exklusives ODER)

Der Operator ^ führt eine binäre XOR aus, in der eine binäre 1 genau dann kopiert wird, wenn es
sich um den Wert genau eines Operanden handelt. Eine andere Möglichkeit dies zu sagen ist,
dass das Ergebnis nur 1 , wenn die Operanden unterschiedlich sind. Beispiele beinhalten:

# 0 ^ 0 = 0
# 0 ^ 1 = 1
# 1 ^ 0 = 1
# 1 ^ 1 = 0

# 60 = 0b111100
# 30 = 0b011110
60 ^ 30
# Out: 34
# 34 = 0b100010

bin(60 ^ 30)
# Out: 0b100010

Bitweise Linksverschiebung

Der Operator << führt eine bitweise "Linksverschiebung" aus, bei der der Wert des linken
Operanden um die vom rechten Operanden angegebene Anzahl Bits nach links verschoben wird.

# 2 = 0b10
2 << 2
# Out: 8
# 8 = 0b1000

bin(2 << 2)
# Out: 0b1000

Das Durchführen einer Verschiebung um 1 nach links entspricht der Multiplikation mit 2 :

7 << 1
# Out: 14

https://riptutorial.com/de/home 100
Das Durchführen einer Verschiebung des linken Bits um n entspricht der Multiplikation mit 2**n :

3 << 4
# Out: 48

Bitweise Rechtsverschiebung

Der Operator >> führt eine bitweise "Rechtsverschiebung" aus, bei der der Wert des linken
Operanden um die vom rechten Operanden angegebene Anzahl von Bits nach rechts verschoben
wird.

# 8 = 0b1000
8 >> 2
# Out: 2
# 2 = 0b10

bin(8 >> 2)
# Out: 0b10

Das Durchführen einer Verschiebung um 1 nach rechts entspricht der Division von Ganzzahlen
durch 2 :

36 >> 1
# Out: 18

15 >> 1
# Out: 7

Das Durchführen einer Verschiebung um n rechts nach rechts entspricht der ganzzahligen Division
um 2**n :

48 >> 4
# Out: 3

59 >> 3
# Out: 7

Bitweises NICHT

Der Operator ~ dreht alle Bits in der Zahl um. Da Computer vorzeichenbehaftete
Zahlendarstellungen verwenden - vor allem die Zweierkomplementschreibweise zur Kodierung
negativer Binärzahlen, wobei negative Zahlen mit einer führenden Zahl (1) anstelle einer
führenden Null (0) geschrieben werden.

Das bedeutet, wenn Sie 8 Bits für die Darstellung Ihrer Zweierkomplement-Zahlen verwenden,
würden Sie Muster von 0000 0000 bis 0111 1111 , dass sie Zahlen von 0 bis 127 darstellen, und 1xxx
xxxx für negative Zahlen.

Acht-Bit-Zwei-Komplement-Zahlen

https://riptutorial.com/de/home 101
Bits Vorzeichenloser Wert Zwei-Komplementwert

0000 0000 0 0

0000 0001 1 1

0000 0010 2 2

0111 1110 126 126

0111 1111 127 127

1000 0000 128 -128

1000 0001 129 -127

1000 0010 130 -126

1111 1110 254 -2

1111 1111 255 -1

Im Wesentlichen bedeutet dies, dass 1010 0110 einen vorzeichenlosen Wert von 166 hat (durch
Hinzufügen von (128 * 1) + (64 * 0) + (32 * 1) + (16 * 0) + (8 * 0) + (4 * 1) + (2 * 1) + (1 *
0) ) hat es einen Zweierkomplementwert von -90 (durch Hinzufügen von (128 * 1) - (64 * 0) -
(32 * 1) - (16 * 0) - (8 * 0) - (4 * 1) - (2 * 1) - (1 * 0) und den Wert ergänzen).

Auf diese Weise reichen negative Zahlen bis -128 ( 1000 0000 ). Null (0) wird als 0000 0000 und
minus Eins (-1) als 1111 1111 .

Im Allgemeinen bedeutet dies jedoch ~n = -n - 1 .

# 0 = 0b0000 0000
~0
# Out: -1
# -1 = 0b1111 1111

# 1 = 0b0000 0001
~1
# Out: -2
# -2 = 1111 1110

# 2 = 0b0000 0010
~2
# Out: -3
# -3 = 0b1111 1101

# 123 = 0b0111 1011


~123
# Out: -124
# -124 = 0b1000 0100

Beachten Sie , dass die Gesamtwirkung dieses Vorgangs bei Anwendung auf positive Zahlen

https://riptutorial.com/de/home 102
zusammengefasst werden kann:

~n -> -|n+1|

Bei einer Anwendung auf negative Zahlen lautet der entsprechende Effekt:

~-n -> |n-1|

Die folgenden Beispiele veranschaulichen diese letzte Regel ...

# -0 = 0b0000 0000
~-0
# Out: -1
# -1 = 0b1111 1111
# 0 is the obvious exception to this rule, as -0 == 0 always

# -1 = 0b1000 0001
~-1
# Out: 0
# 0 = 0b0000 0000

# -2 = 0b1111 1110
~-2
# Out: 1
# 1 = 0b0000 0001

# -123 = 0b1111 1011


~-123
# Out: 122
# 122 = 0b0111 1010

Inplace-Operationen

Alle Bitwise-Operatoren (außer ~ ) verfügen über eine eigene Version

a = 0b001
a &= 0b010
# a = 0b000

a = 0b001
a |= 0b010
# a = 0b011

a = 0b001
a <<= 2
# a = 0b100

a = 0b100
a >>= 2
# a = 0b001

a = 0b101
a ^= 0b011
# a = 0b110

Bitweise Operatoren online lesen: https://riptutorial.com/de/python/topic/730/bitweise-operatoren

https://riptutorial.com/de/home 103
Kapitel 20: Boolesche Operatoren
Examples
und

Bewertet das zweite Argument genau dann, wenn beide Argumente wahr sind. Ansonsten wird
das erste Falsey-Argument ausgewertet.

x = True
y = True
z = x and y # z = True

x = True
y = False
z = x and y # z = False

x = False
y = True
z = x and y # z = False

x = False
y = False
z = x and y # z = False

x = 1
y = 1
z = x and y # z = y, so z = 1, see `and` and `or` are not guaranteed to be a boolean

x = 0
y = 1
z = x and y # z = x, so z = 0 (see above)

x = 1
y = 0
z = x and y # z = y, so z = 0 (see above)

x = 0
y = 0
z = x and y # z = x, so z = 0 (see above)

Die 1 ‚s in dem obigen Beispiel kann an jeden truthy Wert geändert werden, und die 0 ‘ s kann auf
jeden Falsey Wert geändert werden.

oder

Bewertet das erste wahrheitsgemäße Argument, wenn eines der Argumente wahr ist Wenn beide
Argumente falsch sind, wird das zweite Argument bewertet.

x = True
y = True
z = x or y # z = True

https://riptutorial.com/de/home 104
x = True
y = False
z = x or y # z = True

x = False
y = True
z = x or y # z = True

x = False
y = False
z = x or y # z = False

x = 1
y = 1
z = x or y # z = x, so z = 1, see `and` and `or` are not guaranteed to be a boolean

x = 1
y = 0
z = x or y # z = x, so z = 1 (see above)

x = 0
y = 1
z = x or y # z = y, so z = 1 (see above)

x = 0
y = 0
z = x or y # z = y, so z = 0 (see above)

Die 1 ‚s in dem obigen Beispiel kann an jeden truthy Wert geändert werden, und die 0 ‘ s kann auf
jeden Falsey Wert geändert werden.

nicht

Es gibt das Gegenteil der folgenden Anweisung zurück:

x = True
y = not x # y = False

x = False
y = not x # y = True

Kurzschlussauswertung

Python wertet boolesche Ausdrücke minimal aus .

>>> def true_func():


... print("true_func()")
... return True
...
>>> def false_func():
... print("false_func()")
... return False
...
>>> true_func() or false_func()
true_func()
True

https://riptutorial.com/de/home 105
>>> false_func() or true_func()
false_func()
true_func()
True
>>> true_func() and false_func()
true_func()
false_func()
False
>>> false_func() and false_func()
false_func()
False

"und" und "oder" geben nicht garantiert einen Boolean zurück

Wenn Sie or , wird entweder der erste Wert im Ausdruck zurückgegeben, wenn er wahr ist,
andernfalls wird der zweite Wert blind angezeigt. Dh or entspricht:

def or_(a, b):


if a:
return a
else:
return b

Bei and wird der erste Wert zurückgegeben, wenn er falsch ist, ansonsten wird der letzte Wert
zurückgegeben:

def and_(a, b):


if not a:
return a
else:
return b

Ein einfaches Beispiel

In Python können Sie ein einzelnes Element mit zwei binären Operatoren vergleichen - einen auf
beiden Seiten:

if 3.14 < x < 3.142:


print("x is near pi")

In vielen (den meisten?) Programmiersprachen wird dies im Gegensatz zur regulären Mathematik
bewertet: (3.14 < x) < 3.142 , aber in Python wird es wie 3.14 < x and x < 3.142 , genau wie die
meisten Nichtprogrammierer würde erwarten.

Boolesche Operatoren online lesen: https://riptutorial.com/de/python/topic/1731/boolesche-


operatoren

https://riptutorial.com/de/home 106
Kapitel 21: ChemPy - Python-Paket
Einführung
ChemPy ist ein Python-Paket, das hauptsächlich zur Lösung und Behebung von Problemen in der
physikalischen, analytischen und anorganischen Chemie entwickelt wurde. Es ist ein kostenloses
Open-Source-Python-Toolkit für Anwendungen in den Bereichen Chemie, Chemieingenieurwesen
und Materialwissenschaft.

Examples
Analysieren von Formeln

from chempy import Substance


ferricyanide = Substance.from_formula('Fe(CN)6-3')
ferricyanide.composition == {0: -3, 26: 1, 6: 6, 7: 6}
True
print(ferricyanide.unicode_name)
Fe(CN)₆³⁻
print(ferricyanide.latex_name + ", " + ferricyanide.html_name)
Fe(CN)_{6}^{3-}, Fe(CN)<sub>6</sub><sup>3-</sup>
print('%.3f' % ferricyanide.mass)
211.955

In der Zusammensetzung werden die Ordnungszahlen (und 0 für die Ladung) als Schlüssel
verwendet, und die Anzahl jeder Art wurde zum jeweiligen Wert.

Ausgleichende Stöchiometrie einer chemischen Reaktion

from chempy import balance_stoichiometry # Main reaction in NASA's booster rockets:


reac, prod = balance_stoichiometry({'NH4ClO4', 'Al'}, {'Al2O3', 'HCl', 'H2O', 'N2'})
from pprint import pprint
pprint(reac)
{'Al': 10, 'NH4ClO4': 6}
pprint(prod)
{'Al2O3': 5, 'H2O': 9, 'HCl': 6, 'N2': 3}
from chempy import mass_fractions
for fractions in map(mass_fractions, [reac, prod]):
... pprint({k: '{0:.3g} wt%'.format(v*100) for k, v in fractions.items()})
...
{'Al': '27.7 wt%', 'NH4ClO4': '72.3 wt%'}
{'Al2O3': '52.3 wt%', 'H2O': '16.6 wt%', 'HCl': '22.4 wt%', 'N2': '8.62 wt%'}

Ausgleichende Reaktionen

from chempy import Equilibrium


from sympy import symbols
K1, K2, Kw = symbols('K1 K2 Kw')
e1 = Equilibrium({'MnO4-': 1, 'H+': 8, 'e-': 5}, {'Mn+2': 1, 'H2O': 4}, K1)

https://riptutorial.com/de/home 107
e2 = Equilibrium({'O2': 1, 'H2O': 2, 'e-': 4}, {'OH-': 4}, K2)
coeff = Equilibrium.eliminate([e1, e2], 'e-')
coeff
[4, -5]
redox = e1*coeff[0] + e2*coeff[1]
print(redox)
20 OH- + 32 H+ + 4 MnO4- = 26 H2O + 4 Mn+2 + 5 O2; K1**4/K2**5
autoprot = Equilibrium({'H2O': 1}, {'H+': 1, 'OH-': 1}, Kw)
n = redox.cancel(autoprot)
n
20
redox2 = redox + n*autoprot
print(redox2)
12 H+ + 4 MnO4- = 4 Mn+2 + 5 O2 + 6 H2O; K1**4*Kw**20/K2**5

Chemische Gleichgewichte

from chempy import Equilibrium


from chempy.chemistry import Species
water_autop = Equilibrium({'H2O'}, {'H+', 'OH-'}, 10**-14) # unit "molar" assumed
ammonia_prot = Equilibrium({'NH4+'}, {'NH3', 'H+'}, 10**-9.24) # same here
from chempy.equilibria import EqSystem
substances = map(Species.from_formula, 'H2O OH- H+ NH3 NH4+'.split())
eqsys = EqSystem([water_autop, ammonia_prot], substances)
print('\n'.join(map(str, eqsys.rxns))) # "rxns" short for "reactions"
H2O = H+ + OH-; 1e-14
NH4+ = H+ + NH3; 5.75e-10
from collections import defaultdict
init_conc = defaultdict(float, {'H2O': 1, 'NH3': 0.1})
x, sol, sane = eqsys.root(init_conc)
assert sol['success'] and sane
print(sorted(sol.keys())) # see package "pyneqsys" for more info
['fun', 'intermediate_info', 'internal_x_vecs', 'nfev', 'njev', 'success', 'x', 'x_vecs']
print(', '.join('%.2g' % v for v in x))
1, 0.0013, 7.6e-12, 0.099, 0.0013

Ionenstärke

from chempy.electrolytes import ionic_strength


ionic_strength({'Fe+3': 0.050, 'ClO4-': 0.150}) == .3
True

Chemische Kinetik (System gewöhnlicher Differentialgleichungen)

from chempy import ReactionSystem # The rate constants below are arbitrary
rsys = ReactionSystem.from_string("""2 Fe+2 + H2O2 -> 2 Fe+3 + 2 OH-; 42
2 Fe+3 + H2O2 -> 2 Fe+2 + O2 + 2 H+; 17
H+ + OH- -> H2O; 1e10
H2O -> H+ + OH-; 1e-4
Fe+3 + 2 H2O -> FeOOH(s) + 3 H+; 1
FeOOH(s) + 3 H+ -> Fe+3 + 2 H2O; 2.5""") # "[H2O]" = 1.0 (actually 55.4 at RT)
from chempy.kinetics.ode import get_odesys
odesys, extra = get_odesys(rsys)
from collections import defaultdict
import numpy as np
tout = sorted(np.concatenate((np.linspace(0, 23), np.logspace(-8, 1))))

https://riptutorial.com/de/home 108
c0 = defaultdict(float, {'Fe+2': 0.05, 'H2O2': 0.1, 'H2O': 1.0, 'H+': 1e-7, 'OH-': 1e-7})
result = odesys.integrate(tout, c0, atol=1e-12, rtol=1e-14)
import matplotlib.pyplot as plt
_ = plt.subplot(1, 2, 1)
_ = result.plot(names=[k for k in rsys.substances if k != 'H2O'])
_ = plt.legend(loc='best', prop={'size': 9}); _ = plt.xlabel('Time'); _ =
plt.ylabel('Concentration')
_ = plt.subplot(1, 2, 2)
_ = result.plot(names=[k for k in rsys.substances if k != 'H2O'], xscale='log', yscale='log')
_ = plt.legend(loc='best', prop={'size': 9}); _ = plt.xlabel('Time'); _ =
plt.ylabel('Concentration')
_ = plt.tight_layout()
plt.show()

ChemPy - Python-Paket online lesen: https://riptutorial.com/de/python/topic/10625/chempy---


python-paket

https://riptutorial.com/de/home 109
Kapitel 22: CLI-Unterbefehle mit präziser
Hilfeausgabe
Einführung
Verschiedene Möglichkeiten zum Erstellen von Unterbefehlen wie hg oder svn mit der genauen
Befehlszeilenschnittstelle und Hilfeausgabe (siehe Abschnitt "Anmerkungen")

Das Analysieren von Befehlszeilenargumenten deckt ein breiteres Thema der Argumentanalyse
ab.

Bemerkungen
Verschiedene Möglichkeiten zum Erstellen von Unterbefehlen wie hg oder svn mit der
Befehlszeilenschnittstelle in der Hilfemeldung

usage: sub <command>

commands:

status - show status


list - print list

Examples
Nativer Weg (keine Bibliotheken)

"""
usage: sub <command>

commands:

status - show status


list - print list
"""

import sys

def check():
print("status")
return 0

if sys.argv[1:] == ['status']:
sys.exit(check())
elif sys.argv[1:] == ['list']:
print("list")
else:
print(__doc__.strip())

https://riptutorial.com/de/home 110
Ausgabe ohne Argumente:

usage: sub <command>

commands:

status - show status


list - print list

Pros:

• keine deps
• Jeder sollte das lesen können
• vollständige Kontrolle über die Formatierung der Hilfe

argparse (Standard-Hilfeformatierer)

import argparse
import sys

def check():
print("status")
return 0

parser = argparse.ArgumentParser(prog="sub", add_help=False)


subparser = parser.add_subparsers(dest="cmd")

subparser.add_parser('status', help='show status')


subparser.add_parser('list', help='print list')

# hack to show help when no arguments supplied


if len(sys.argv) == 1:
parser.print_help()
sys.exit(0)

args = parser.parse_args()

if args.cmd == 'list':
print('list')
elif args.cmd == 'status':
sys.exit(check())

Ausgabe ohne Argumente:

usage: sub {status,list} ...

positional arguments:
{status,list}
status show status
list print list

Pros:

• kommt mit Python


• Option Parsing ist enthalten

https://riptutorial.com/de/home 111
argparse (benutzerdefinierte Formatierungshilfe)

Erweiterte Version von http://www.riptutorial.com/python/example/25282/argparse--default-help-


formatter- diese festgelegte Hilfeausgabe

import argparse
import sys

class CustomHelpFormatter(argparse.HelpFormatter):
def _format_action(self, action):
if type(action) == argparse._SubParsersAction:
# inject new class variable for subcommand formatting
subactions = action._get_subactions()
invocations = [self._format_action_invocation(a) for a in subactions]
self._subcommand_max_length = max(len(i) for i in invocations)

if type(action) == argparse._SubParsersAction._ChoicesPseudoAction:
# format subcommand help line
subcommand = self._format_action_invocation(action) # type: str
width = self._subcommand_max_length
help_text = ""
if action.help:
help_text = self._expand_help(action)
return " {:{width}} - {}\n".format(subcommand, help_text, width=width)

elif type(action) == argparse._SubParsersAction:


# process subcommand help section
msg = '\n'
for subaction in action._get_subactions():
msg += self._format_action(subaction)
return msg
else:
return super(CustomHelpFormatter, self)._format_action(action)

def check():
print("status")
return 0

parser = argparse.ArgumentParser(usage="sub <command>", add_help=False,


formatter_class=CustomHelpFormatter)

subparser = parser.add_subparsers(dest="cmd")
subparser.add_parser('status', help='show status')
subparser.add_parser('list', help='print list')

# custom help messge


parser._positionals.title = "commands"

# hack to show help when no arguments supplied


if len(sys.argv) == 1:
parser.print_help()
sys.exit(0)

args = parser.parse_args()

if args.cmd == 'list':
print('list')
elif args.cmd == 'status':

https://riptutorial.com/de/home 112
sys.exit(check())

Ausgabe ohne Argumente:

usage: sub <command>

commands:

status - show status


list - print list

CLI-Unterbefehle mit präziser Hilfeausgabe online lesen:


https://riptutorial.com/de/python/topic/7701/cli-unterbefehle-mit-praziser-hilfeausgabe

https://riptutorial.com/de/home 113
Kapitel 23: Codeblöcke, Ausführungsrahmen
und Namespaces
Einführung
Ein Codeblock ist ein Stück Python-Programmtext, der als Einheit ausgeführt werden kann,
beispielsweise als Modul, Klassendefinition oder Funktionskörper. Einige Codeblöcke (wie
Module) werden normalerweise nur einmal ausgeführt, andere (wie Funktionskörper) können
mehrmals ausgeführt werden. Codeblöcke können textuell andere Codeblöcke enthalten.
Codeblöcke können andere Codeblöcke (die möglicherweise textuell in ihnen enthalten sind) als
Teil ihrer Ausführung aufrufen, z.

Examples
Codeblock-Namespaces

Codeblocktyp Globaler Namensraum Lokaler Namensraum

Modul ns für das Modul gleich wie global

Skript (Datei oder Befehl) ns für __main__ gleich wie global

Interaktiver Befehl ns für __main__ gleich wie global

globale ns des
Klassendefinition neuer Namespace
enthaltenden Blocks

globale ns des
Funktionskörper neuer Namespace
enthaltenden Blocks

String wurde an die exec globale ns des lokaler Namespace des


Anweisung übergeben enthaltenden Blocks enthaltenden Blocks

Zeichenfolge an eval() globale ns des anrufers lokale ns des anrufers

Datei gelesen von execfile() globale ns des anrufers lokale ns des anrufers

Ausdruck gelesen von input() globale ns des anrufers lokale ns des anrufers

Codeblöcke, Ausführungsrahmen und Namespaces online lesen:


https://riptutorial.com/de/python/topic/10741/codeblocke--ausfuhrungsrahmen-und-namespaces

https://riptutorial.com/de/home 114
Kapitel 24: Commonwealth-Ausnahmen
Einführung
Hier in Stack Overflow sehen wir häufig Duplikate, die über dieselben Fehler sprechen:
"ImportError: No module named '??????' , SyntaxError: invalid syntax oder NameError: name '???' is
not defined . Dies ist ein Versuch, sie zu reduzieren und Dokumentation zu haben, auf die verlinkt
werden kann.

Examples
Einrückungsfehler (oder EinzugssyntaxErrors)

In den meisten anderen Sprachen ist die Einrückung nicht zwingend, sondern in Python (und
anderen Sprachen: frühe Versionen von FORTRAN, Makefiles, Whitespace (esoterische Sprache)
usw.). Dies ist jedoch nicht der Fall. wenn Sie Code von einem Beispiel zu Ihrem eigenen kopieren
oder einfach, wenn Sie neu sind.

IndentationError / SyntaxError: unerwarteter


Einzug
Diese Ausnahme wird ausgelöst, wenn die Einrückung ohne Grund steigt.

Beispiel
Es gibt keinen Grund, das Niveau hier zu erhöhen:

Python 2.x 2.0 2.7

print "This line is ok"


print "This line isn't ok"

Python 3.x 3.0

print("This line is ok")


print("This line isn't ok")

Hier gibt es zwei Fehler: den letzten und dass die Einrückung keiner Einrückungsebene entspricht.
Es wird jedoch nur eine gezeigt:

Python 2.x 2.0 2.7

print "This line is ok"


print "This line isn't ok"

https://riptutorial.com/de/home 115
Python 3.x 3.0

print("This line is ok")


print("This line isn't ok")

IndentationError / SyntaxError: unindent


passt zu keiner äußeren Einrückungsebene
Sieht aus, als ob Sie nicht vollständig entrückt wurden.

Beispiel
Python 2.x 2.0 2.7

def foo():
print "This should be part of foo()"
print "ERROR!"
print "This is not a part of foo()"

Python 3.x 3.0

print("This line is ok")


print("This line isn't ok")

IndentationError: Ein eingerückter Block


wurde erwartet
Nach einem Doppelpunkt (und dann einer neuen Zeile) muss die Einrückungsebene erhöht
werden. Dieser Fehler wird ausgelöst, wenn dies nicht der Fall ist.

Beispiel

if ok:
doStuff()

Anmerkung : Verwenden Sie das Schlüsselwort pass (das macht absolut nichts), um einfach eine
if , else , except class , method oder definition aber nicht zu sagen, was passiert, wenn der Aufruf /
condition true ist (tun Sie es aber später oder im Fall von except : einfach nichts tun):

def foo():
pass

https://riptutorial.com/de/home 116
IndentationError: Inkonsistente Verwendung
von Tabulatoren und Leerzeichen beim
Einzug
Beispiel

def foo():
if ok:
return "Two != Four != Tab"
return "i dont care i do whatever i want"

So vermeiden Sie diesen Fehler


Verwenden Sie keine Tabs. Es wird von PEP8 , dem Style Guide für Python, abgeraten.

1. Stellen Sie Ihren Editor so ein, dass er 4 Leerzeichen für die Einrückung verwendet.
2. Machen Sie eine Suche und ersetzen Sie sie, um alle Registerkarten durch 4 Leerzeichen
zu ersetzen.
3. Stellen Sie sicher, dass Ihr Editor so eingestellt ist, dass die Registerkarten als 8
Leerzeichen angezeigt werden, sodass Sie den Fehler leicht erkennen und beheben
können.

Sehen Sie sich diese Frage an, wenn Sie mehr erfahren möchten.

TypeErrors

Diese Ausnahmen werden verursacht, wenn der Typ eines Objekts unterschiedlich sein sollte

TypeError: [Definition / Methode] dauert?


Positionsargumente aber? wurde gegeben
Eine Funktion oder Methode wurde mit mehr (oder weniger) Argumenten als denjenigen
aufgerufen, die sie akzeptieren kann.

Beispiel
Wenn mehr Argumente angegeben werden:

def foo(a): return a


foo(a,b,c,d) #And a,b,c,d are defined

https://riptutorial.com/de/home 117
Wenn weniger Argumente angegeben werden:

def foo(a,b,c,d): return a += b + c + d


foo(a) #And a is defined

Hinweis : Wenn Sie eine unbekannte Anzahl von Argumenten verwenden möchten, können Sie
*args oder **kwargs . Siehe * args und ** kwargs

TypeError: nicht unterstützte


Operandentypen für [Operand]: '???' und
'???'
Einige Typen können je nach Operand nicht zusammen betrieben werden.

Beispiel
Zum Beispiel: + wird zum Verketten und Hinzufügen verwendet, aber Sie können keine davon für
beide Typen verwenden. Um zum Beispiel eine machen versuchen , set durch die Verkettung ( +
ing) 'set1' und 'tuple1' gibt den Fehler. Code:

set1, tuple1 = {1,2}, (3,4)


a = set1 + tuple1

Einige Typen (zB: int und string ) verwenden beide + jedoch für verschiedene Dinge:

b = 400 + 'foo'

Oder sie können nicht einmal für irgendetwas verwendet werden:

c = ["a","b"] - [1,2]

Sie können aber beispielsweise einen float zu einem int hinzufügen:

d = 1 + 1.0

TypeError: '???' Objekt ist nicht iterierbar /


subskribierbar:
Für ein Objekt iterable sein kann sequentielle Indizes nimmt von Null ausgehend , bis der Indizes

https://riptutorial.com/de/home 118
nicht mehr gültig ist , und ein IndexError angehoben wird (Technisch: es ist eine haben , hat
__iter__ Methode , die ein zurückgibt __iterator__ , oder das eines definiert __getitem__ Verfahren
, das tut was zuvor erwähnt wurde).

Beispiel
Hier sagen wir, dass bar der nullte Punkt von 1. ist.

foo = 1
bar = foo[0]

Dies ist eine diskrete Version: In diesem Beispiel for Versuche einstellen x amount[0] , das erste
Element in einem abzählbaren , aber es kann nicht , weil Menge ist ein int:

amount = 10
for x in amount: print(x)

TypeError: '???' Objekt ist nicht aufrufbar


Sie definieren eine Variable und rufen sie später auf (wie bei einer Funktion oder Methode).

Beispiel

foo = "notAFunction"
foo()

NameFehler: Name "???" ist nicht definiert

Wird ausgelöst, wenn Sie versucht haben, eine Variable, Methode oder Funktion zu verwenden,
die nicht initialisiert wurde (zumindest nicht vorher). Mit anderen Worten, es wird ausgelöst, wenn
ein angeforderter lokaler oder globaler Name nicht gefunden wird. Möglicherweise haben Sie den
Namen des Objekts falsch geschrieben oder vergessen, etwas zu import . Vielleicht auch in einem
anderen Bereich. Wir werden diese mit separaten Beispielen behandeln.

Es ist einfach nirgendwo im Code definiert


Es ist möglich, dass Sie die Initialisierung vergessen haben, insbesondere wenn es sich um eine
Konstante handelt

foo # This variable is not defined


bar() # This function is not defined

https://riptutorial.com/de/home 119
Vielleicht ist es später definiert:

baz()

def baz():
pass

Oder es wurde nicht import :

#needs import math

def sqrt():
x = float(input("Value: "))
return math.sqrt(x)

Python-Bereiche und die LEGB-Regel:


Die sogenannte LEGB-Regel spricht über die Python-Bereiche. Der Name basiert auf den
verschiedenen Bereichen, sortiert nach den entsprechenden Prioritäten:

Local → Enclosed → Global → Built-in.

• L ocal: Variablen, die nicht global deklariert oder in einer Funktion zugewiesen sind.
• E nclosing: Variablen in einer Funktion definiert , die innerhalb einer anderen Funktion
gewickelt ist.
• G lobale: Variablen erklärt global oder auf der obersten Ebene einer Datei zugeordnet.
• B uilt-in: Variablen vorbelegt im eingebauten Namen Modul.

Als Beispiel:

for i in range(4):
d = i * 2
print(d)

dist zugänglich, weil die for Schleife keinen neuen Gültigkeitsbereich markiert, aber wenn dies
der Fall wäre, hätten wir einen Fehler und sein Verhalten wäre ähnlich:

def noaccess():
for i in range(4):
d = i * 2
noaccess()
print(d)

Python sagt, dass NameError: name 'd' is not defined

Andere Fehler

https://riptutorial.com/de/home 120
AssertError
Die assert Anweisung existiert in fast jeder Programmiersprache. Wenn Sie das tun:

assert condition

oder:

assert condition, message

Das ist gleichbedeutend mit:

if __debug__:
if not condition: raise AssertionError(message)

Zusicherungen können eine optionale Nachricht enthalten und Sie können sie deaktivieren, wenn
Sie mit dem Debuggen fertig sind.

Hinweis : Die eingebaute Variable debug ist unter normalen Umständen True, False, wenn die
Optimierung angefordert wird (Befehlszeilenoption -O). Zuweisungen zum Debuggen sind illegal.
Der Wert für die integrierte Variable wird beim Start des Interpreters festgelegt.

KeyboardInterrupt
Fehler ausgelöst , wenn der Benutzer die Interrupt - Taste drückt, normalerweise Strg + C oder
del.

ZeroDivisionError
Sie haben versucht, 1/0 zu berechnen, das nicht definiert ist. Sehen Sie sich dieses Beispiel an,
um die Teiler einer Zahl zu finden:

Python 2.x 2.0 2.7

div = float(raw_input("Divisors of: "))


for x in xrange(div+1): #includes the number itself and zero
if div/x == div//x:
print x, "is a divisor of", div

Python 3.x 3.0

div = int(input("Divisors of: "))


for x in range(div+1): #includes the number itself and zero
if div/x == div//x:
print(x, "is a divisor of", div)

https://riptutorial.com/de/home 121
ZeroDivisionError da die for Schleife diesen Wert x zuordnet. Stattdessen sollte es sein:

Python 2.x 2.0 2.7

div = float(raw_input("Divisors of: "))


for x in xrange(1,div+1): #includes the number itself but not zero
if div/x == div//x:
print x, "is a divisor of", div

Python 3.x 3.0

div = int(input("Divisors of: "))


for x in range(1,div+1): #includes the number itself but not zero
if div/x == div//x:
print(x, "is a divisor of", div)

Syntaxfehler bei gutem Code

Die grobe Mehrheit der Zeit, zu der ein SyntaxError auf eine uninteressante Zeile verweist,
bedeutet, dass ein Problem in der Zeile davor vorliegt (in diesem Beispiel fehlt eine Klammer):

def my_print():
x = (1 + 1
print(x)

Kehrt zurück

File "<input>", line 3


print(x)
^
SyntaxError: invalid syntax

Der häufigste Grund für dieses Problem sind nicht übereinstimmende Klammern / Klammern, wie
das Beispiel zeigt.

In Python 3 gibt es einen wichtigen Vorbehalt für Druckanweisungen:

Python 3.x 3.0

>>> print "hello world"


File "<stdin>", line 1
print "hello world"
^
SyntaxError: invalid syntax

Da die Anweisung print durch die Funktion print() , möchten Sie:

print("hello world") # Note this is valid for both Py2 & Py3

Commonwealth-Ausnahmen online lesen:


https://riptutorial.com/de/python/topic/9300/commonwealth-ausnahmen

https://riptutorial.com/de/home 122
Kapitel 25: Conditionals
Einführung
Bedingte Ausdrücke mit Schlüsselwörtern wie if, elif und anderen geben Python-Programmen die
Möglichkeit, abhängig von einer booleschen Bedingung verschiedene Aktionen auszuführen: True
oder False. In diesem Abschnitt wird die Verwendung von Python-Bedingungen, Booleschen Logik
und ternären Anweisungen beschrieben.

Syntax
• <Ausdruck> wenn <Bedingt> sonst <Ausdruck> # Ternärer Operator

Examples
wenn, elif und sonst

In Python können Sie eine Reihe von conditionals mit definieren , if für die ersten, elif für den
Rest, bis die endgültigen (optional) else für alles , was nicht von dem anderen conditionals
gefangen.

number = 5

if number > 2:
print("Number is bigger than 2.")
elif number < 2: # Optional clause (you can have multiple elifs)
print("Number is smaller than 2.")
else: # Optional clause (you can only have one else)
print("Number is 2.")

Number is bigger than 2 Ausgänge Number is bigger than 2

Die Verwendung von else if anstelle von elif löst einen Syntaxfehler aus und ist nicht zulässig.

Bedingter Ausdruck (oder "Der ternäre Operator")

Der ternäre Operator wird für inline bedingte Ausdrücke verwendet. Es wird am besten für
einfache, präzise Operationen verwendet, die leicht zu lesen sind.

• Die Reihenfolge der Argumente unterscheidet sich von vielen anderen Sprachen (wie z. B.
C, Ruby, Java usw.). Dies kann zu Fehlern führen, wenn Personen, die mit Pythons
"überraschendem" Verhalten nicht vertraut sind, sie verwenden (sie können die Reihenfolge
umkehren).
• Einige finden es "unhandlich", da es dem normalen Gedankenfluss zuwiderläuft (zuerst an
den Zustand denken und dann an die Auswirkungen).

https://riptutorial.com/de/home 123
n = 5

"Greater than 2" if n > 2 else "Smaller than or equal to 2"


# Out: 'Greater than 2'

Das Ergebnis dieses Ausdrucks wird so sein, wie er auf Englisch gelesen wird. Wenn der
Bedingungsausdruck "True" ist, wird der Ausdruck auf der linken Seite ausgewertet, ansonsten
auf der rechten Seite.

Tenäre Operationen können auch verschachtelt werden, wie hier:

n = 5
"Hello" if n > 10 else "Goodbye" if n > 5 else "Good day"

Sie bieten auch eine Methode zum Einbinden von Bedingungen in Lambda-Funktionen .

Wenn Aussage

if condition:
body

Die if Anweisungen prüfen die Bedingung. Wenn es als True ausgewertet wird, führt es den
Hauptteil der if Anweisung aus. Wenn es als False ausgewertet wird, wird der Körper
übersprungen.

if True:
print "It is true!"
>> It is true!

if False:
print "This won't get printed.."

Die Bedingung kann ein beliebiger gültiger Ausdruck sein:

if 2 + 2 == 4:
print "I know math!"
>> I know math!

Else Aussage

if condition:
body
else:
body

Die else-Anweisung führt ihren Rumpf nur dann aus, wenn alle vorausgehenden
Bedingungsanweisungen zu False ausgewertet werden.

if True:
print "It is true!"

https://riptutorial.com/de/home 124
else:
print "This won't get printed.."

# Output: It is true!

if False:
print "This won't get printed.."
else:
print "It is false!"

# Output: It is false!

Boolesche Logikausdrücke

Boolesche Logikausdrücke geben nicht nur True oder False , sondern geben den Wert zurück , der
als True oder False interpretiert wurde. Es ist eine Pythonic-Methode, um Logik darzustellen, für
die ansonsten ein If-else-Test erforderlich wäre.

Und Betreiber
Der Operator and wertet alle Ausdrücke aus und gibt den letzten Ausdruck zurück, wenn alle
Ausdrücke den Wert True . Andernfalls wird der erste Wert zurückgegeben, der den Wert False
ergibt:

>>> 1 and 2
2

>>> 1 and 0
0

>>> 1 and "Hello World"


"Hello World"

>>> "" and "Pancakes"


""

Oder Betreiber
Der Operator or wertet die Ausdrücke von links nach rechts aus und gibt den ersten Wert, der den
Wert True ergibt, oder den letzten Wert zurück (wenn keiner True ).

>>> 1 or 2
1

>>> None or 1
1

>>> 0 or []
[]

https://riptutorial.com/de/home 125
Faule Auswertung
Wenn Sie diesen Ansatz verwenden, denken Sie daran, dass die Auswertung faul ist. Ausdrücke,
die zur Ermittlung des Ergebnisses nicht ausgewertet werden müssen, werden nicht ausgewertet.
Zum Beispiel:

>>> def print_me():


print('I am here!')
>>> 0 and print_me()
0

Im obigen Beispiel wird print_me niemals ausgeführt, da Python feststellen kann, dass der
gesamte Ausdruck False wenn er auf 0 ( False ) trifft. print_me Sie dies, wenn print_me muss, um
Ihre Programmlogik zu bedienen.

Testen auf mehrere Bedingungen


Ein häufiger Fehler bei der Prüfung auf mehrere Bedingungen ist die falsche Anwendung der
Logik.

In diesem Beispiel wird geprüft, ob zwei Variablen jeweils größer als 2 sind. Die Anweisung wird
als - if (a) and (b > 2) ausgewertet. Dies führt zu einem unerwarteten Ergebnis, da bool(a) als
True ausgewertet wird, wenn a nicht Null ist.

>>> a = 1
>>> b = 6
>>> if a and b > 2:
... print('yes')
... else:
... print('no')

yes

Jede Variable muss separat verglichen werden.

>>> if a > 2 and b > 2:


... print('yes')
... else:
... print('no')

no

Ein anderer, ähnlicher Fehler wird gemacht, wenn geprüft wird, ob eine Variable einen von
mehreren Werten hat. Die Anweisung in diesem Beispiel wird als - if (a == 3) or (4) or (6)
ausgewertet. Dies führt zu einem unerwarteten Ergebnis, da bool(4) und bool(6) jeweils True

>>> a = 1

https://riptutorial.com/de/home 126
>>> if a == 3 or 4 or 6:
... print('yes')
... else:
... print('no')

yes

Wieder muss jeder Vergleich separat durchgeführt werden

>>> if a == 3 or a == 4 or a == 6:
... print('yes')
... else:
... print('no')

no

Die Verwendung des in-Operators ist die kanonische Schreibweise.

>>> if a in (3, 4, 6):


... print('yes')
... else:
... print('no')

no

Wahrheitswerte

Die folgenden Werte werden als Falsey betrachtet, da sie bei Anwendung auf einen booleschen
Operator als False ausgewertet werden.

• Keiner
• Falsch
• 0 oder ein beliebiger numerischer Wert gleich Null, zum Beispiel 0L , 0.0 , 0j
• Leere Sequenzen: '' , "" , () , []
• Leere Zuordnungen: {}
• Benutzerdefinierte Typen, bei denen die Methoden __bool__ oder __len__ 0 oder False

Alle anderen Werte in Python werden mit True ausgewertet.

Hinweis: Ein häufiger Fehler besteht darin, einfach nach der Falschheit einer Operation zu
suchen, die verschiedene Falsey-Werte zurückgibt, bei denen der Unterschied von Bedeutung ist.
Verwenden Sie zum Beispiel if foo() anstelle des expliziteren if foo() is None

Verwenden der Funktion cmp zum Abrufen des Vergleichsergebnisses zweier


Objekte

Python 2 enthält eine cmp Funktion, mit der Sie feststellen können, ob ein Objekt kleiner als ein
anderes Objekt ist oder diesem entspricht. Diese Funktion kann verwendet werden, um eine
Auswahl aus einer Liste basierend auf einer dieser drei Optionen auszuwählen.

https://riptutorial.com/de/home 127
Angenommen, Sie müssen 'greater than' drucken 'greater than' wenn x > y , 'less than' wenn x
< y und 'equal' wenn x == y .

['equal', 'greater than', 'less than', ][cmp(x,y)]

# x,y = 1,1 output: 'equal'


# x,y = 1,2 output: 'less than'
# x,y = 2,1 output: 'greater than'

cmp(x,y) gibt die folgenden Werte zurück

Vergleich Ergebnis

x <y -1

x == y 0

x> y 1

Diese Funktion wird auf Python entfernt 3. Sie können die Verwendung cmp_to_key(func) in sich
Helferfunktion functools in Python 3 zu alten Vergleichsfunktionen auf die wichtigsten Funktionen
zu konvertieren.

Bedingte Ausdrucksauswertung mit List Comprehensions

Mit Python können Sie Listenverständnisse hacken, um bedingte Ausdrücke auszuwerten.

Zum Beispiel,

[value_false, value_true][<conditional-test>]

Beispiel:

>> n = 16
>> print [10, 20][n <= 15]
10

Hier gibt n<=15 False (was in Python gleich 0 ist). Was Python bewertet, ist also:

[10, 20][n <= 15]


==> [10, 20][False]
==> [10, 20][0] #False==0, True==1 (Check Boolean Equivalencies in Python)
==> 10

Python 2.x 2.7

Die eingebaute __cmp __cmp__ Methode gab 3 mögliche Werte zurück: 0, 1, -1, wobei cmp (x, y) 0:
zurückgab, wenn beide Objekte gleich 1 waren: x> y -1: x <y

Dies könnte bei List Comprehensions verwendet werden, um das erste (dh Index 0), zweite (dh

https://riptutorial.com/de/home 128
Index 1) und letzte (dh Index -1) Element der Liste zurückzugeben. Geben Sie uns eine
Bedingung dieses Typs:

[value_equals, value_greater, value_less][<conditional-test>]

Schließlich wertet Python in allen obigen Beispielen beide Zweige aus, bevor er einen auswählt.
Um nur den ausgewählten Zweig auszuwerten:

[lambda: value_false, lambda: value_true][<test>]()

Durch das Hinzufügen von () am Ende wird sichergestellt, dass die Lambda-Funktionen nur am
Ende aufgerufen / ausgewertet werden. Daher bewerten wir nur den ausgewählten Zweig.

Beispiel:

count = [lambda:0, lambda:N+1][count==N]()

Testen Sie, ob ein Objekt Keine ist, und weisen Sie es zu

Oft möchten Sie einem Objekt etwas zuweisen, wenn es None ist, um None , dass es noch nicht
zugewiesen wurde. Wir werden ein aDate .

Der einfachste Weg, dies zu tun, ist die Verwendung des is None Tests.

if aDate is None:
aDate=datetime.date.today()

(Beachten Sie, dass es mehr Pythonic ist, um zu sagen, is None statt == None .)

Dies kann jedoch geringfügig optimiert werden, indem die Vorstellung ausgenutzt wird, dass " not
None in einem boolschen Ausdruck als " True ausgewertet wird. Der folgende Code ist gleichwertig:

if not aDate:
aDate=datetime.date.today()

Es gibt aber einen mehr pythonischen Weg. Der folgende Code ist ebenfalls gleichwertig:

aDate=aDate or datetime.date.today()

Dies führt eine Kurzschlussbewertung durch . Wenn aDate initialisiert ist und not None , wird es sich
ohne Nettoeffekt zugewiesen. Wenn is None , wird datetime.date.today() einem aDate zugewiesen.

Conditionals online lesen: https://riptutorial.com/de/python/topic/1111/conditionals

https://riptutorial.com/de/home 129
Kapitel 26: configparser
Einführung
Dieses Modul stellt die ConfigParser-Klasse bereit, die eine grundlegende Konfigurationssprache
in INI-Dateien implementiert. Sie können dies verwenden, um Python-Programme zu schreiben,
die vom Endbenutzer leicht angepasst werden können.

Syntax
• Jede neue Zeile enthält ein neues Schlüsselwertpaar, getrennt durch das Zeichen =
• Schlüssel können in Abschnitte unterteilt werden
• In der INI-Datei wird jeder Abschnittstitel in Klammern geschrieben: []

Bemerkungen
Alle Rückgabewerte von ConfigParser.ConfigParser().get sind Strings. Dank eval kann es in
gängigere Typen umgewandelt werden

Examples
Grundlegende Verwendung

In der config.ini:

[DEFAULT]
debug = True
name = Test
password = password

[FILES]
path = /path/to/file

In Python:

from ConfigParser import ConfigParser


config = ConfigParser()

#Load configuration file


config.read("config.ini")

# Access the key "debug" in "DEFAULT" section


config.get("DEFAULT", "debug")
# Return 'True'

# Access the key "path" in "FILES" destion


config.get("FILES", "path")
# Return '/path/to/file'

https://riptutorial.com/de/home 130
Konfigurationsdatei programmatisch erstellen

Konfigurationsdatei enthält Abschnitte, jeder Abschnitt enthält Schlüssel und Werte. Das
configparser-Modul kann zum Lesen und Schreiben von Konfigurationsdateien verwendet werden.
Erstellen der Konfigurationsdatei: -

import configparser
config = configparser.ConfigParser()
config['settings']={'resolution':'320x240',
'color':'blue'}
with open('example.ini', 'w') as configfile:
config.write(configfile)

Die Ausgabedatei enthält folgende Struktur

[settings]
resolution = 320x240
color = blue

Wenn Sie ein bestimmtes Feld ändern möchten, rufen Sie das Feld ab und weisen Sie den Wert
zu

settings=config['settings']
settings['color']='red'

configparser online lesen: https://riptutorial.com/de/python/topic/9186/configparser

https://riptutorial.com/de/home 131
Kapitel 27: CSV lesen und schreiben
Examples
TSV-Datei schreiben

Python
import csv

with open('/tmp/output.tsv', 'wt') as out_file:


tsv_writer = csv.writer(out_file, delimiter='\t')
tsv_writer.writerow(['name', 'field'])
tsv_writer.writerow(['Dijkstra', 'Computer Science'])
tsv_writer.writerow(['Shelah', 'Math'])
tsv_writer.writerow(['Aumann', 'Economic Sciences'])

Ausgabedatei
$ cat /tmp/output.tsv

name field
Dijkstra Computer Science
Shelah Math
Aumann Economic Sciences

Pandas benutzen

Schreiben Sie eine CSV-Datei aus einem dict oder einem DataFrame .

import pandas as pd

d = {'a': (1, 101), 'b': (2, 202), 'c': (3, 303)}


pd.DataFrame.from_dict(d, orient="index")
df.to_csv("data.csv")

Lesen Sie eine CSV-Datei als DataFrame und konvertieren Sie sie in ein dict :

df = pd.read_csv("data.csv")
d = df.to_dict()

CSV lesen und schreiben online lesen: https://riptutorial.com/de/python/topic/2116/csv-lesen-und-


schreiben

https://riptutorial.com/de/home 132
Kapitel 28: ctypes
Einführung
ctypes ist eine in Python integrierte Bibliothek, die exportierte Funktionen aus nativen kompilierten
Bibliotheken aufruft.

Hinweis: Da diese Bibliothek kompilierten Code verarbeitet, ist sie relativ vom Betriebssystem
abhängig.

Examples
Grundlegende Verwendung

Nehmen wir an, wir wollen die ntohl Funktion von libc ntohl .

Zuerst müssen wir libc.so laden:

>>> from ctypes import *


>>> libc = cdll.LoadLibrary('libc.so.6')
>>> libc
<CDLL 'libc.so.6', handle baadf00d at 0xdeadbeef>

Dann erhalten wir das Funktionsobjekt:

>>> ntohl = libc.ntohl


>>> ntohl
<_FuncPtr object at 0xbaadf00d>

Und jetzt können wir einfach die Funktion aufrufen:

>>> ntohl(0x6C)
1811939328
>>> hex(_)
'0x6c000000'

Was genau das tut, was wir erwarten.

Häufige Fehler

Laden einer Datei fehlgeschlagen


Der erste mögliche Fehler ist das Laden der Bibliothek. In diesem Fall wird normalerweise ein
OSError ausgelöst.

Dies liegt entweder daran, dass die Datei nicht existiert (oder vom Betriebssystem nicht gefunden

https://riptutorial.com/de/home 133
wird):

>>> cdll.LoadLibrary("foobar.so")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/ctypes/__init__.py", line 425, in LoadLibrary
return self._dlltype(name)
File "/usr/lib/python3.5/ctypes/__init__.py", line 347, in __init__
self._handle = _dlopen(self._name, mode)
OSError: foobar.so: cannot open shared object file: No such file or directory

Wie Sie sehen können, ist der Fehler klar und bezeichnend.

Der zweite Grund ist, dass die Datei gefunden wurde, aber nicht das richtige Format hat.

>>> cdll.LoadLibrary("libc.so")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/ctypes/__init__.py", line 425, in LoadLibrary
return self._dlltype(name)
File "/usr/lib/python3.5/ctypes/__init__.py", line 347, in __init__
self._handle = _dlopen(self._name, mode)
OSError: /usr/lib/i386-linux-gnu/libc.so: invalid ELF header

In diesem Fall ist die Datei eine Skriptdatei und keine .so Datei. Dies kann auch passieren, wenn
Sie versuchen, eine .dll Datei auf einem Linux-Computer oder eine 64-Bit-Datei auf einem 32-Bit-
Python-Interpreter zu öffnen. Wie Sie sehen, ist der Fehler in diesem Fall etwas ungenauer und
erfordert einige Eingrabungen.

Fehler beim Zugriff auf eine Funktion


Wenn wir die .so Datei erfolgreich geladen .so , müssen wir wie im ersten Beispiel auf unsere
Funktion zugreifen.

Wenn eine nicht vorhandene Funktion verwendet wird, wird ein AttributeError ausgelöst:

>>> libc.foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/ctypes/__init__.py", line 360, in __getattr__
func = self.__getitem__(name)
File "/usr/lib/python3.5/ctypes/__init__.py", line 365, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /lib/i386-linux-gnu/libc.so.6: undefined symbol: foo

Basisobjekt für ctypes

Das grundlegendste Objekt ist ein int:

>>> obj = ctypes.c_int(12)


>>> obj

https://riptutorial.com/de/home 134
c_long(12)

Nun bezieht sich obj auf einen Speicherblock, der den Wert 12 enthält.

Dieser Wert kann direkt abgerufen und sogar geändert werden:

>>> obj.value
12
>>> obj.value = 13
>>> obj
c_long(13)

Da sich obj auf einen Speicherplatz bezieht, können wir auch die Größe und den Speicherort
ermitteln:

>>> sizeof(obj)
4
>>> hex(addressof(obj))
'0xdeadbeef'

ctypes Arrays

Wie jeder gute C-Programmierer weiß, wird ein einzelner Wert Sie nicht so weit bringen. Was uns
wirklich in Fahrt bringen wird, sind Arrays!

>>> c_int * 16
<class '__main__.c_long_Array_16'>

Dies ist kein tatsächliches Array, aber es ist verdammt nah! Wir haben eine Klasse erstellt, die ein
Array von 16 int s kennzeichnet.

Jetzt müssen wir es nur noch initialisieren:

>>> arr = (c_int * 16)(*range(16))


>>> arr
<__main__.c_long_Array_16 object at 0xbaddcafe>

Jetzt ist arr ein tatsächliches Array, das die Zahlen von 0 bis 15 enthält.

Sie können wie jede Liste aufgerufen werden:

>>> arr[5]
5
>>> arr[5] = 20
>>> arr[5]
20

Und wie jedes andere ctypes Objekt hat es auch eine Größe und einen Ort:

>>> sizeof(arr)

https://riptutorial.com/de/home 135
64 # sizeof(c_int) * 16
>>> hex(addressof(arr))
'0xc000l0ff'

Wrapping-Funktionen für ctypes

In einigen Fällen akzeptiert eine C-Funktion einen Funktionszeiger. Als avid ctypes Benutzer
möchten wir diese Funktionen verwenden und sogar die Python-Funktion als Argumente
übergeben.

Definieren wir eine Funktion:

>>> def max(x, y):


return x if x >= y else y

Nun nimmt diese Funktion zwei Argumente an und gibt ein Ergebnis desselben Typs zurück.
Nehmen wir im Beispiel an, dass type ein int ist.

Wie beim Array-Beispiel können wir ein Objekt definieren, das diesen Prototyp kennzeichnet:

>>> CFUNCTYPE(c_int, c_int, c_int)


<CFunctionType object at 0xdeadbeef>

Dieser Prototyp bezeichnet eine Funktion, die ein c_int (das erste Argument) c_int und zwei c_int
Argumente (die anderen Argumente) akzeptiert.

Lassen Sie uns nun die Funktion umschließen:

>>> CFUNCTYPE(c_int, c_int, c_int)(max)


<CFunctionType object at 0xdeadbeef>

Funktionsprototypen haben mehr Verwendung: Sie können ctypes function (wie libc.ntohl )
libc.ntohl und überprüfen, ob beim Aufrufen der Funktion die richtigen Argumente verwendet
werden.

>>> libc.ntohl() # garbage in - garbage out


>>> CFUNCTYPE(c_int, c_int)(libc.ntohl)()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: this function takes at least 1 argument (0 given)

Komplexe Verwendung

Lassen Sie uns alle obigen Beispiele in einem komplexen Szenario kombinieren: Verwenden Sie
die lfind Funktion von libc .

Weitere Informationen zu dieser Funktion finden Sie in der Manpage . Ich bitte Sie dringend, es zu
lesen, bevor Sie fortfahren.

https://riptutorial.com/de/home 136
Zuerst definieren wir die richtigen Prototypen:

>>> compar_proto = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))


>>> lfind_proto = CFUNCTYPE(c_void_p, c_void_p, c_void_p, POINTER(c_uint), c_uint,
compar_proto)

Dann lassen Sie uns die Variablen erstellen:

>>> key = c_int(12)


>>> arr = (c_int * 16)(*range(16))
>>> nmemb = c_uint(16)

Und jetzt definieren wir die Vergleichsfunktion:

>>> def compar(x, y):


return x.contents.value - y.contents.value

Beachten Sie, dass x und y POINTER(c_int) sind POINTER(c_int) müssen wir sie dereferenzieren und
ihre Werte verwenden, um den im Speicher gespeicherten Wert vergleichen zu können.

Jetzt können wir alles miteinander kombinieren:

>>> lfind = lfind_proto(libc.lfind)


>>> ptr = lfind(byref(key), byref(arr), byref(nmemb), sizeof(c_int), compar_proto(compar))

ptr ist der zurückgegebene Leerzeiger. Wenn der key nicht in arr gefunden wurde, arr der Wert
None , aber in diesem Fall haben wir einen gültigen Wert erhalten.

Jetzt können wir es konvertieren und auf den Wert zugreifen:

>>> cast(ptr, POINTER(c_int)).contents


c_long(12)

Wir können auch sehen, dass ptr auf den korrekten Wert innerhalb von arr :

>>> addressof(arr) + 12 * sizeof(c_int) == ptr


True

ctypes online lesen: https://riptutorial.com/de/python/topic/9050/ctypes

https://riptutorial.com/de/home 137
Kapitel 29: Das base64-Modul
Einführung
Die Base 64-Codierung stellt ein allgemeines Schema für die Codierung von Binärzeichen in das
ASCII-Zeichenfolgenformat mit Radix 64 dar. Das Base64-Modul ist Teil der Standardbibliothek,
dh es wird zusammen mit Python installiert. Das Verständnis von Bytes und Strings ist für dieses
Thema von entscheidender Bedeutung und kann hier überprüft werden . In diesem Thema wird
erläutert, wie Sie die verschiedenen Funktionen und Nummernbasis des base64-Moduls
verwenden.

Syntax
• base64.b64encode (s, altchars = None)
• base64.b64decode (s, altchars = None, validate = False)
• base64.standard_b64encode (s)
• base64.standard_b64decode (s)
• base64.urlsafe_b64encode (s)
• base64.urlsafe_b64decode (s)
• base64.b32encode (s)
• base64.b32decode (s)
• base64.b16encode (s)
• base64.b16decode (s)
• base64.a85encode (b, foldspaces = False, wrapcol = 0, pad = False, adobe = False)
• base64.a85decode (b, foldpaces = False, adobe = False, ignorechars = b \ t \ n \ r \ v
• base64.b85encode (b, pad = False)
• base64.b85decode (b)

Parameter

Parameter Beschreibung

base64.b64encode(s, altchars=None)

s Ein Byte ähnliches Objekt

Ein Byte ähnliches Objekt der Länge 2+ von


Zeichen, das die Zeichen '+' und '=' beim Erstellen
Altäre
des Base64-Alphabets ersetzt. Zusätzliche Zeichen
werden ignoriert.

base64.b64decode(s, altchars=None,
validate=False)

s Ein Byte ähnliches Objekt

https://riptutorial.com/de/home 138
Parameter Beschreibung

Ein Byte ähnliches Objekt der Länge 2+ von


Zeichen, das die Zeichen '+' und '=' beim Erstellen
Altäre
des Base64-Alphabets ersetzt. Zusätzliche Zeichen
werden ignoriert.

Wenn valide True ist, werden die Zeichen, die nicht


im normalen Base64-Alphabet oder im alternativen
bestätigen
Alphabet sind , vor der Auffüllprüfung nicht
gelöscht

base64.standard_b64encode(s)

s Ein Byte ähnliches Objekt

base64.standard_b64decode(s)

s Ein Byte ähnliches Objekt

base64.urlsafe_b64encode(s)

s Ein Byte ähnliches Objekt

base64.urlsafe_b64decode(s)

s Ein Byte ähnliches Objekt

b32encode(s)

s Ein Byte ähnliches Objekt

b32decode(s)

s Ein Byte ähnliches Objekt

base64.b16encode(s)

s Ein Byte ähnliches Objekt

base64.b16decode(s)

s Ein Byte ähnliches Objekt

base64.a85encode(b, foldspaces=False,
wrapcol=0, pad=False, adobe=False)

b Ein Byte ähnliches Objekt

Wenn foldspaces auf True gesetzt ist, wird das


Falträume Zeichen 'y' anstelle von 4 aufeinander folgenden
Leerzeichen verwendet.

Wrapcol Die Anzahl der Zeichen vor einem Zeilenumbruch

https://riptutorial.com/de/home 139
Parameter Beschreibung

(0 bedeutet keine Zeilenumbrüche)

Wenn pad true ist, werden die Bytes vor der


Pad
Codierung auf ein Vielfaches von 4 aufgefüllt

Wenn adobe den Wert True hat, wird die kodierte


Adobe Sequenz mit '<~' und '' ~> 'wie bei Adobe-
Produkten eingerahmt

base64.a85decode(b, foldspaces=False,
adobe=False, ignorechars=b'\t\n\r\v')

b Ein Byte ähnliches Objekt

Wenn foldspaces auf True gesetzt ist, wird das


Falträume Zeichen 'y' anstelle von 4 aufeinander folgenden
Leerzeichen verwendet.

Wenn adobe den Wert True hat, wird die kodierte


Adobe Sequenz mit '<~' und '' ~> 'wie bei Adobe-
Produkten eingerahmt

Ein bytesähnliches Objekt aus Zeichen, das bei der


Ignorarechars
Kodierung ignoriert werden soll

base64.b85encode(b, pad=False)

b Ein Byte ähnliches Objekt

Wenn pad true ist, werden die Bytes vor der


Pad
Codierung auf ein Vielfaches von 4 aufgefüllt

base64.b85decode(b)

b Ein Byte ähnliches Objekt

Bemerkungen
Bis zum Erscheinen von Python 3.4 funktionierten base64-Codierungs- und -
Decodierungsfunktionen nur mit bytes oder bytearray Typen. Jetzt akzeptieren diese Funktionen
alle bytesähnlichen Objekte .

Examples
Codierung und Decodierung von Base64

Um das base64-Modul in Ihr Skript aufzunehmen, müssen Sie es zuerst importieren:

https://riptutorial.com/de/home 140
import base64

Die base64-Codierungs- und -Decodierungsfunktionen erfordern beide ein bytesähnliches Objekt .


Um unseren String in Bytes zu bekommen, müssen Sie ihn mit der integrierten
Codierungsfunktion von Python codieren. Am häufigsten wird die UTF-8 Codierung verwendet. Eine
vollständige Liste dieser Standardcodierungen (einschließlich Sprachen mit unterschiedlichen
Zeichen) finden Sie hier in der offiziellen Python-Dokumentation. Im Folgenden finden Sie ein
Beispiel zum Codieren einer Zeichenfolge in Bytes:

s = "Hello World!"
b = s.encode("UTF-8")

Die Ausgabe der letzten Zeile wäre:

b'Hello World!'

Das Präfix b wird verwendet, um anzugeben, dass der Wert ein Byteobjekt ist.

Um diese Bytes zu codieren, verwenden wir die Funktion base64.b64encode() :

import base64
s = "Hello World!"
b = s.encode("UTF-8")
e = base64.b64encode(b)
print(e)

Dieser Code würde folgendes ausgeben:

b'SGVsbG8gV29ybGQh'

die noch im Byte-Objekt ist. Um einen String aus diesen Bytes zu erhalten, können wir die
decode() Methode von Python mit der UTF-8 Codierung verwenden:

import base64
s = "Hello World!"
b = s.encode("UTF-8")
e = base64.b64encode(b)
s1 = e.decode("UTF-8")
print(s1)

Die Ausgabe wäre dann:

SGVsbG8gV29ybGQh

Wenn wir den String codieren und dann decodieren base64.b64decode() , können wir die
base64.b64decode() -Methode verwenden:

import base64
# Creating a string
s = "Hello World!"
# Encoding the string into bytes
b = s.encode("UTF-8")
# Base64 Encode the bytes

https://riptutorial.com/de/home 141
e = base64.b64encode(b)
# Decoding the Base64 bytes to string
s1 = e.decode("UTF-8")
# Printing Base64 encoded string
print("Base64 Encoded:", s1)
# Encoding the Base64 encoded string into bytes
b1 = s1.encode("UTF-8")
# Decoding the Base64 bytes
d = base64.b64decode(b1)
# Decoding the bytes to string
s2 = d.decode("UTF-8")
print(s2)

Wie Sie vielleicht erwartet haben, wäre die Ausgabe die Originalzeichenfolge:

Base64 Encoded: SGVsbG8gV29ybGQh


Hello World!

Codierung und Decodierung von Base32

Das base64-Modul enthält auch Codierungs- und Decodierungsfunktionen für Base32. Diese
Funktionen sind den Base64-Funktionen sehr ähnlich:

import base64
# Creating a string
s = "Hello World!"
# Encoding the string into bytes
b = s.encode("UTF-8")
# Base32 Encode the bytes
e = base64.b32encode(b)
# Decoding the Base32 bytes to string
s1 = e.decode("UTF-8")
# Printing Base32 encoded string
print("Base32 Encoded:", s1)
# Encoding the Base32 encoded string into bytes
b1 = s1.encode("UTF-8")
# Decoding the Base32 bytes
d = base64.b32decode(b1)
# Decoding the bytes to string
s2 = d.decode("UTF-8")
print(s2)

Dies würde die folgende Ausgabe erzeugen:

Base32 Encoded: JBSWY3DPEBLW64TMMQQQ====


Hello World!

Codierung und Decodierung von Base16

Das base64-Modul enthält auch Codierungs- und Decodierungsfunktionen für Base16. Die Basis
16 wird am häufigsten als Hexadezimal bezeichnet . Diese Funktionen sind den Funktionen
Base64 und Base32 sehr ähnlich:

https://riptutorial.com/de/home 142
import base64
# Creating a string
s = "Hello World!"
# Encoding the string into bytes
b = s.encode("UTF-8")
# Base16 Encode the bytes
e = base64.b16encode(b)
# Decoding the Base16 bytes to string
s1 = e.decode("UTF-8")
# Printing Base16 encoded string
print("Base16 Encoded:", s1)
# Encoding the Base16 encoded string into bytes
b1 = s1.encode("UTF-8")
# Decoding the Base16 bytes
d = base64.b16decode(b1)
# Decoding the bytes to string
s2 = d.decode("UTF-8")
print(s2)

Dies würde die folgende Ausgabe erzeugen:

Base16 Encoded: 48656C6C6F20576F726C6421


Hello World!

Kodierung und Dekodierung von ASCII85

Adobe hat eine eigene Kodierung namens ASCII85 erstellt, die der von Base85 ähnelt, jedoch
Unterschiede aufweist. Diese Kodierung wird häufig in Adobe PDF-Dateien verwendet. Diese
Funktionen wurden in Python Version 3.4 veröffentlicht. Ansonsten base64.a85encode() die
Funktionen base64.a85encode() und base64.a85encode() der vorherigen:

import base64
# Creating a string
s = "Hello World!"
# Encoding the string into bytes
b = s.encode("UTF-8")
# ASCII85 Encode the bytes
e = base64.a85encode(b)
# Decoding the ASCII85 bytes to string
s1 = e.decode("UTF-8")
# Printing ASCII85 encoded string
print("ASCII85 Encoded:", s1)
# Encoding the ASCII85 encoded string into bytes
b1 = s1.encode("UTF-8")
# Decoding the ASCII85 bytes
d = base64.a85decode(b1)
# Decoding the bytes to string
s2 = d.decode("UTF-8")
print(s2)

Dies gibt Folgendes aus:

ASCII85 Encoded: 87cURD]i,"Ebo80


Hello World!

https://riptutorial.com/de/home 143
Codierung und Decodierung von Base85

Genau wie die Funktionen Base64, Base32 und Base16 sind die Codierungs- und
Decodierungsfunktionen von base64.b85encode() und base64.b85decode() :

import base64
# Creating a string
s = "Hello World!"
# Encoding the string into bytes
b = s.encode("UTF-8")
# Base85 Encode the bytes
e = base64.b85encode(b)
# Decoding the Base85 bytes to string
s1 = e.decode("UTF-8")
# Printing Base85 encoded string
print("Base85 Encoded:", s1)
# Encoding the Base85 encoded string into bytes
b1 = s1.encode("UTF-8")
# Decoding the Base85 bytes
d = base64.b85decode(b1)
# Decoding the bytes to string
s2 = d.decode("UTF-8")
print(s2)

was gibt folgendes aus:

Base85 Encoded: NM&qnZy;B1a%^NF


Hello World!

Das base64-Modul online lesen: https://riptutorial.com/de/python/topic/8678/das-base64-modul

https://riptutorial.com/de/home 144
Kapitel 30: Das dis-Modul
Examples
Konstanten im dis-Modul

EXTENDED_ARG = 145 # All opcodes greater than this have 2 operands


HAVE_ARGUMENT = 90 # All opcodes greater than this have at least 1 operands

cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', 'is ...
# A list of comparator id's. The indecies are used as operands in some opcodes

# All opcodes in these lists have the respective types as there operands
hascompare = [107]
hasconst = [100]
hasfree = [135, 136, 137]
hasjabs = [111, 112, 113, 114, 115, 119]
hasjrel = [93, 110, 120, 121, 122, 143]
haslocal = [124, 125, 126]
hasname = [90, 91, 95, 96, 97, 98, 101, 106, 108, 109, 116]

# A map of opcodes to ids


opmap = {'BINARY_ADD': 23, 'BINARY_AND': 64, 'BINARY_DIVIDE': 21, 'BIN...
# A map of ids to opcodes
opname = ['STOP_CODE', 'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'DUP_TOP', '...

Was ist Python-Bytecode?

Python ist ein Hybridinterpreter. Wenn ein Programm ausgeführt wird, fügt es es zunächst in
Bytecode zusammen, der dann im Python-Interpreter (auch als virtuelle Python-Maschine
bezeichnet ) ausgeführt werden kann. Das Modul dis in der Standardbibliothek kann verwendet
werden, um den Python-Bytecode durch Disassemblieren von Klassen, Methoden, Funktionen
und Codeobjekten lesbar zu machen.

>>> def hello():


... print "Hello, World"
...
>>> dis.dis(hello)
2 0 LOAD_CONST 1 ('Hello, World')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE

Der Python-Interpreter ist stapelbasiert und verwendet ein First-In-Last-Out-System.

Jeder Operationscode (Opcode) in der Python-Assemblersprache (der Bytecode) nimmt eine feste
Anzahl von Elementen aus dem Stapel und gibt eine feste Anzahl von Elementen an den Stapel
zurück. Wenn auf dem Stack nicht genügend Elemente für einen Opcode vorhanden sind, stürzt
der Python-Interpreter möglicherweise ohne Fehlermeldung ab.

https://riptutorial.com/de/home 145
Module demontieren

Um ein Python-Modul zu zerlegen, muss dieses zunächst in eine .pyc Datei umgewandelt werden
(Python kompiliert). Um dies zu tun, renne

python -m compileall <file>.py

Dann laufen Sie in einem Dolmetscher

import dis
import marshal
with open("<file>.pyc", "rb") as code_f:
code_f.read(8) # Magic number and modification time
code = marshal.load(code_f) # Returns a code object which can be disassembled
dis.dis(code) # Output the disassembly

Dadurch wird ein Python-Modul kompiliert und die Bytecode-Anweisungen mit dis ausgegeben.
Das Modul wird niemals importiert, so dass die Verwendung mit nicht vertrauenswürdigem Code
sicher ist.

Das dis-Modul online lesen: https://riptutorial.com/de/python/topic/1763/das-dis-modul

https://riptutorial.com/de/home 146
Kapitel 31: Das Ländereinstellungsmodul
Bemerkungen
Python 2-Dokumente: [ https://docs.python.org/2/library/locale.html#locale.currency]

Examples
Währungsformatierung in US-Dollar mit dem Gebietsschema-Modul

import locale

locale.setlocale(locale.LC_ALL, '')
Out[2]: 'English_United States.1252'

locale.currency(762559748.49)
Out[3]: '$762559748.49'

locale.currency(762559748.49, grouping=True)
Out[4]: '$762,559,748.49'

Das Ländereinstellungsmodul online lesen: https://riptutorial.com/de/python/topic/1783/das-


landereinstellungsmodul

https://riptutorial.com/de/home 147
Kapitel 32: Das os-Modul
Einführung
Dieses Modul bietet eine tragbare Möglichkeit, betriebssystemabhängige Funktionen zu
verwenden.

Syntax
• import os

Parameter

Parameter Einzelheiten

Pfad Ein Pfad zu einer Datei. Das os.path.sep kann mit os.path.sep bestimmt werden.

Modus Die gewünschte Erlaubnis in Oktal (zB 0700 )

Examples
Erstellen Sie ein Verzeichnis

os.mkdir('newdir')

Wenn Sie die Berechtigungen angeben müssen, können Sie die optionale Verwendung mode
Argument:

os.mkdir('newdir', mode=0700)

Aktuelles Verzeichnis abrufen

Verwenden Sie die Funktion os.getcwd() :

print(os.getcwd())

Bestimmen Sie den Namen des Betriebssystems

Das os Modul stellt eine Schnittstelle bereit, um zu bestimmen, auf welchem Betriebssystem der
Code aktuell ausgeführt wird.

os.name

https://riptutorial.com/de/home 148
Dies kann in Python 3 einen der folgenden Werte zurückgeben:

• posix
• nt
• ce
• java

Detailliertere Informationen können von sys.platform abgerufen sys.platform

Ein Verzeichnis entfernen

Entfernen Sie das Verzeichnis unter path :

os.rmdir(path)

Sie sollten os.remove() nicht verwenden, um ein Verzeichnis zu entfernen. Diese Funktion ist für
Dateien und die Verwendung in Verzeichnissen führt zu einem OSError

Einem Symlink folgen (POSIX)

Manchmal müssen Sie das Ziel eines Symlinks bestimmen. os.readlink macht das:

print(os.readlink(path_to_symlink))

Ändern Sie die Berechtigungen für eine Datei

os.chmod(path, mode)

Dabei ist mode die gewünschte Berechtigung in Oktal.

Makedirs - rekursive Verzeichniserstellung

Dazu ein lokales Verzeichnis mit folgendem Inhalt:

└── dir1
├── subdir1
└── subdir2

Wir möchten dasselbe Unterverzeichnis1, Unterverzeichnis2 unter einem neuen Verzeichnis dir2
erstellen, das noch nicht vorhanden ist.

import os

os.makedirs("./dir2/subdir1")
os.makedirs("./dir2/subdir2")

Ausführen dieser Ergebnisse in

https://riptutorial.com/de/home 149
├── dir1
│   ├── subdir1
│   └── subdir2
└── dir2
├── subdir1
└── subdir2

dir2 wird nur erstellt, wenn es zum ersten Mal für die Erstellung von Unterverzeichnis1 benötigt
wird.

Wenn wir stattdessen os.mkdir verwendet hätten , hätten wir eine Ausnahme gehabt, weil dir2
noch nicht existiert hätte.

os.mkdir("./dir2/subdir1")
OSError: [Errno 2] No such file or directory: './dir2/subdir1'

os.makedirs mag es nicht, wenn das Zielverzeichnis bereits existiert. Wenn wir es noch einmal
ausführen:

OSError: [Errno 17] File exists: './dir2/subdir1'

Dies kann jedoch leicht behoben werden, indem Sie die Ausnahme abfangen und prüfen, ob das
Verzeichnis erstellt wurde.

try:
os.makedirs("./dir2/subdir1")
except OSError:
if not os.path.isdir("./dir2/subdir1"):
raise

try:
os.makedirs("./dir2/subdir2")
except OSError:
if not os.path.isdir("./dir2/subdir2"):
raise

Das os-Modul online lesen: https://riptutorial.com/de/python/topic/4127/das-os-modul

https://riptutorial.com/de/home 150
Kapitel 33: Dateien entpacken
Einführung
Zum Extrahieren oder Dekomprimieren einer Tarball-, ZIP- oder Gzip-Datei werden die Python-
Tarfile-, Zipfile- und Gzip-Module bereitgestellt. Das Tarfile-Modul von Python bietet die Funktion
TarFile.extractall(path=".", members=None) zum Extrahieren aus einer Tarball-Datei. Das Zipfile-
Modul von Python bietet die Funktion ZipFile.extractall([path[, members[, pwd]]]) zum
Extrahieren oder Entpacken von ZIP-komprimierten Dateien. Schließlich stellt das Gzip-Modul von
Python die GzipFile-Klasse zum Dekomprimieren bereit.

Examples
Verwenden Sie Python ZipFile.extractall (), um eine ZIP-Datei zu
dekomprimieren

file_unzip = 'filename.zip'
unzip = zipfile.ZipFile(file_unzip, 'r')
unzip.extractall()
unzip.close()

Verwenden von Python TarFile.extractall () zum Dekomprimieren eines


Tarballs

file_untar = 'filename.tar.gz'
untar = tarfile.TarFile(file_untar)
untar.extractall()
untar.close()

Dateien entpacken online lesen: https://riptutorial.com/de/python/topic/9505/dateien-entpacken

https://riptutorial.com/de/home 151
Kapitel 34: Dateien und Ordner E / A
Einführung
Wenn Sie Daten speichern, lesen oder kommunizieren möchten, ist das Arbeiten mit den Dateien
eines Betriebssystems mit Python sowohl notwendig als auch einfach. Im Gegensatz zu anderen
Sprachen, in denen für die Dateieingabe und -ausgabe komplexes Lesen und Schreiben von
Objekten erforderlich ist, vereinfacht Python den Vorgang, indem nur Befehle zum Öffnen, Lesen
und Schreiben der Datei benötigt werden. In diesem Thema wird erläutert, wie Python mit Dateien
auf dem Betriebssystem kommunizieren kann.

Syntax
• file_object = open (Dateiname [, Zugriffsmodus] [, Pufferung])

Parameter

Parameter Einzelheiten

den Pfad zu Ihrer Datei oder, wenn sich die Datei im Arbeitsverzeichnis
Dateiname
befindet, den Dateinamen Ihrer Datei

Zugriffsmodus ein Zeichenfolgewert, der bestimmt, wie die Datei geöffnet wird

Pufferung Ein ganzzahliger Wert, der für die optionale Zeilenpufferung verwendet wird

Bemerkungen

Vermeiden Sie das plattformübergreifende


Encoding Hell
Bei der Verwendung von Pythons integriertem open() ist es am besten, das encoding immer zu
übergeben, wenn der Code plattformübergreifend ausgeführt werden soll. Der Grund dafür ist,
dass die Standardkodierung eines Systems von Plattform zu Plattform unterschiedlich ist.

Während linux Systeme tatsächlich utf-8 als Standard verwenden, gilt dies nicht unbedingt für
Mac und Windows.

So überprüfen Sie die Standardkodierung eines Systems:

import sys
sys.getdefaultencoding()

https://riptutorial.com/de/home 152
von jedem Python-Interpreter.

Daher ist es ratsam, immer eine Codierung zu spezifizieren, um sicherzustellen, dass die Strings,
mit denen Sie arbeiten, so codiert werden, wie Sie sie für wahrscheinlich halten.

with open('somefile.txt', 'r', encoding='UTF-8') as f:


for line in f:
print(line)

Examples
Dateimodi

Es gibt verschiedene Modi, mit denen Sie eine Datei öffnen können, die durch den mode
angegeben wird. Diese schließen ein:

• - Lesemodus. Der Standard. Sie können die Datei nur lesen, nicht ändern. In diesem
'r'
Modus muss die Datei vorhanden sein.

• 'w'- Schreibmodus. Falls nicht vorhanden, wird eine neue Datei erstellt. Andernfalls wird die
Datei gelöscht und Sie können schreiben.

• 'a' - Anfügemodus. Es werden Daten an das Ende der Datei geschrieben. Die Datei wird
nicht gelöscht, und die Datei muss für diesen Modus vorhanden sein.

• - Lesemodus im Binärmodus. Dies ist ähnlich wie bei r nur dass das Lesen im binären
'rb'
Modus erzwungen wird. Dies ist auch eine Standardeinstellung.

• 'r+' - Lesemodus und gleichzeitig Schreibmodus. Auf diese Weise können Sie Dateien
gleichzeitig lesen und beschreiben, ohne r und w .

• 'rb+' - Lese- und Schreibmodus im Binärmodus. Dasselbe wie r+ außer dass die Daten
binär sind

• 'wb' - Schreibmodus in binär. Dasselbe wie w außer dass die Daten binär sind.

• 'w+'- Schreib- und Lesemodus. Genau wie r+ aber wenn die Datei nicht existiert, wird eine
neue erstellt. Andernfalls wird die Datei überschrieben.

• 'wb+' - Schreib- und Lesemodus im Binärmodus. Dasselbe wie w+ aber die Daten sind binär.

• 'ab' - im binären Modus anhängen. Ähnlich wie a dass die Daten binär sind.

• 'a+' - Anhänge- und Lesemodus. Ähnlich wie w+ da eine neue Datei erstellt wird, wenn die
Datei nicht vorhanden ist. Andernfalls befindet sich der Dateizeiger am Ende der Datei,
sofern vorhanden.

• 'ab+' - Anfügen und Lesen im Binärmodus. Dasselbe wie a+ außer dass die Daten binär
sind.

https://riptutorial.com/de/home 153
with open(filename, 'r') as f:
f.read()
with open(filename, 'w') as f:
f.write(filedata)
with open(filename, 'a') as f:
f.write('\n' + newdata)

r r+ w w+ ein a+

Lesen ✔ ✔ ✘ ✔ ✘ ✔

Schreiben ✘ ✔ ✔ ✔ ✔ ✔

Erzeugt eine Datei ✘ ✘ ✔ ✔ ✔ ✔

Löscht die Datei ✘ ✘ ✔ ✔ ✘ ✘

Ausgangsposition Start Start Start Start Ende Ende

Python 3 fügte einen neuen Modus für die exclusive creation damit Sie nicht versehentlich
vorhandene Dateien abschneiden oder überschreiben.

• - offen für exklusive Erstellung, wird FileExistsError wenn die Datei bereits vorhanden ist
'x'
• 'xb' - offen für den Schreibmodus für exklusive Schreibvorgänge in binär. Dasselbe wie x
außer dass die Daten binär sind.
• 'x+' - Lese- und Schreibmodus. Ähnlich wie w+ da eine neue Datei erstellt wird, wenn die
Datei nicht vorhanden ist. Andernfalls wird FileExistsError .
• 'xb+' - Schreib- und Lesemodus. Genau wie x+ aber die Daten sind binär

x x+

Lesen ✘ ✔

Schreiben ✔ ✔

Erzeugt eine Datei ✔ ✔

Löscht die Datei ✘ ✘

Ausgangsposition Start Start

Erlauben Sie einem, Ihren offenen Code für Ihre Datei pythonischer zu schreiben:

Python 3.x 3.3

try:
with open("fname", "r") as fout:
# Work with your open file
except FileExistsError:

https://riptutorial.com/de/home 154
# Your error handling goes here

In Python 2 hätten Sie so etwas gemacht

Python 2.x 2.0

import os.path
if os.path.isfile(fname):
with open("fname", "w") as fout:
# Work with your open file
else:
# Your error handling goes here

Zeile für Zeile eine Datei lesen

Die einfachste Möglichkeit, eine Datei zeilenweise zu durchlaufen:

with open('myfile.txt', 'r') as fp:


for line in fp:
print(line)

readline() ermöglicht eine detailliertere Kontrolle der zeilenweisen Iteration. Das Beispiel unten
entspricht dem obigen Beispiel:

with open('myfile.txt', 'r') as fp:


while True:
cur_line = fp.readline()
# If the result is an empty string
if cur_line == '':
# We have reached the end of the file
break
print(cur_line)

Die gemeinsame Verwendung von for-Loop-Iterator und readline () gilt als schlechte Praxis.

Normalerweise wird die readlines() -Methode zum Speichern einer iterierbaren Auflistung der
Dateizeilen verwendet:

with open("myfile.txt", "r") as fp:


lines = fp.readlines()
for i in range(len(lines)):
print("Line " + str(i) + ": " + line)

Dies würde Folgendes drucken:

Zeile 0: Hallo

Zeile 1: Welt

Den vollständigen Inhalt einer Datei abrufen

https://riptutorial.com/de/home 155
Die bevorzugte Methode für Datei-E / A ist die Verwendung des Schlüsselworts with . Dadurch
wird sichergestellt, dass das Dateihandle geschlossen wird, sobald das Lesen oder Schreiben
abgeschlossen ist.

with open('myfile.txt') as in_file:


content = in_file.read()

print(content)

oder zu handhaben, die Datei manuell zu schließen, können Sie verzichten with und rufen Sie
einfach close Sie sich:

in_file = open('myfile.txt', 'r')


content = in_file.read()
print(content)
in_file.close()

Denken Sie daran, dass Sie ohne die Verwendung einer with Anweisung die Datei aus Versehen
offen halten können, falls eine unerwartete Ausnahme auftritt:

in_file = open('myfile.txt', 'r')


raise Exception("oops")
in_file.close() # This will never be called

In eine Datei schreiben

with open('myfile.txt', 'w') as f:


f.write("Line 1")
f.write("Line 2")
f.write("Line 3")
f.write("Line 4")

Wenn Sie myfile.txt öffnen, werden Sie myfile.txt sehen:

Zeile 1Line 2Line 3Line 4

Python fügt nicht automatisch Zeilenumbrüche ein. Sie müssen dies manuell tun:

with open('myfile.txt', 'w') as f:


f.write("Line 1\n")
f.write("Line 2\n")
f.write("Line 3\n")
f.write("Line 4\n")

Linie 1
Zeile 2
Zeile 3
Zeile 4

Verwenden Sie os.linesep als os.linesep , wenn Sie im Textmodus geöffnete Dateien schreiben
(Standardeinstellung). Verwenden Sie stattdessen \n .

https://riptutorial.com/de/home 156
Wenn Sie eine Codierung angeben möchten, fügen Sie einfach die encoding Parameter an die open
Funktion:

with open('my_file.txt', 'w', encoding='utf-8') as f:


f.write('utf-8 text')

Es ist auch möglich, die print-Anweisung zum Schreiben in eine Datei zu verwenden. Die
Mechanismen unterscheiden sich in Python 2 von Python 3, das Konzept ist jedoch das gleiche,
dass Sie die Ausgabe, die auf den Bildschirm gegangen wäre, nehmen und sie stattdessen in eine
Datei senden kann.

Python 3.x 3.0

with open('fred.txt', 'w') as outfile:


s = "I'm Not Dead Yet!"
print(s) # writes to stdout
print(s, file = outfile) # writes to outfile

#Note: it is possible to specify the file parameter AND write to the screen
#by making sure file ends up with a None value either directly or via a variable
myfile = None
print(s, file = myfile) # writes to stdout
print(s, file = None) # writes to stdout

In Python 2 hätten Sie so etwas gemacht

Python 2.x 2.0

outfile = open('fred.txt', 'w')


s = "I'm Not Dead Yet!"
print s # writes to stdout
print >> outfile, s # writes to outfile

Im Gegensatz zur Verwendung der Schreibfunktion fügt die Druckfunktion automatisch


Zeilenumbrüche ein.

Inhalte einer Datei in eine andere Datei kopieren

with open(input_file, 'r') as in_file, open(output_file, 'w') as out_file:


for line in in_file:
out_file.write(line)

• Verwenden des shutil Moduls:

import shutil
shutil.copyfile(src, dst)

Prüfen Sie, ob eine Datei oder ein Pfad vorhanden ist

Verwenden Sie den EAFP- Codierstil und try zu öffnen.

https://riptutorial.com/de/home 157
import errno

try:
with open(path) as f:
# File exists
except IOError as e:
# Raise the exception if it is not ENOENT (No such file or directory)
if e.errno != errno.ENOENT:
raise
# No such file or directory

Dadurch werden auch Race-Bedingungen vermieden, wenn ein anderer Prozess die Datei
zwischen der Prüfung und der Verwendung gelöscht hat. Diese Wettlaufsituation kann in
folgenden Fällen auftreten:

• Verwenden des os Moduls:

import os
os.path.isfile('/path/to/some/file.txt')

Python 3.x 3.4

• pathlib :

import pathlib
path = pathlib.Path('/path/to/some/file.txt')
if path.is_file():
...

Um zu überprüfen, ob ein bestimmter Pfad existiert oder nicht, können Sie das oben beschriebene
EAFP-Verfahren befolgen oder den Pfad explizit überprüfen:

import os
path = "/home/myFiles/directory1"

if os.path.exists(path):
## Do stuff

Kopieren Sie eine Verzeichnisstruktur

import shutil
source='//192.168.1.2/Daily Reports'
destination='D:\\Reports\\Today'
shutil.copytree(source, destination)

Das Zielverzeichnis darf noch nicht existieren .

Dateien iterieren (rekursiv)

Um alle Dateien, auch in Unterverzeichnissen, zu iterieren, verwenden Sie os.walk:

https://riptutorial.com/de/home 158
import os
for root, folders, files in os.walk(root_dir):
for filename in files:
print root, filename

root_dir kann "." um vom aktuellen Verzeichnis oder einem anderen Pfad aus zu starten.

Python 3.x 3.5

Wenn Sie auch Informationen über die Datei erhalten möchten, können Sie die effizientere
Methode os.scandir wie folgt verwenden :

for entry in os.scandir(path):


if not entry.name.startswith('.') and entry.is_file():
print(entry.name)

Lesen Sie eine Datei zwischen einem Zeilenbereich

Nehmen wir an, Sie möchten nur zwischen bestimmten Zeilen einer Datei iterieren

itertools können Sie itertools

import itertools

with open('myfile.txt', 'r') as f:


for line in itertools.islice(f, 12, 30):
# do something here

Dies wird durch die Zeilen 13 bis 20 gelesen, da bei der Python-Indexierung von 0 aus begonnen
wird. Daher wird Zeile 1 als 0 indiziert

Da können auch einige zusätzliche Zeilen gelesen werden, indem hier das next() Schlüsselwort
verwendet wird.

Wenn Sie das Dateiobjekt als iterierbares Objekt verwenden, verwenden Sie die readline()
Anweisung hier nicht, da die beiden Verfahren zum Durchlaufen einer Datei nicht miteinander
gemischt werden sollen

Zufälliger Dateizugriff mit mmap

Durch Verwendung des mmap Moduls kann der Benutzer willkürlich auf Positionen in einer Datei
zugreifen, indem er die Datei in den Arbeitsspeicher einfügt. Dies ist eine Alternative zur
Verwendung normaler Dateivorgänge.

import mmap

with open('filename.ext', 'r') as fd:


# 0: map the whole file
mm = mmap.mmap(fd.fileno(), 0)

# print characters at indices 5 through 10

https://riptutorial.com/de/home 159
print mm[5:10]

# print the line starting from mm's current position


print mm.readline()

# write a character to the 5th index


mm[5] = 'a'

# return mm's position to the beginning of the file


mm.seek(0)

# close the mmap object


mm.close()

Ersetzen von Text in einer Datei

import fileinput

replacements = {'Search1': 'Replace1',


'Search2': 'Replace2'}

for line in fileinput.input('filename.txt', inplace=True):


for search_for in replacements:
replace_with = replacements[search_for]
line = line.replace(search_for, replace_with)
print(line, end='')

Prüfen, ob eine Datei leer ist

>>> import os
>>> os.stat(path_to_file).st_size == 0

oder

>>> import os
>>> os.path.getsize(path_to_file) > 0

Beide geben jedoch eine Ausnahme aus, wenn die Datei nicht vorhanden ist. Um zu vermeiden,
einen solchen Fehler abfangen zu müssen, führen Sie folgende Schritte aus:

import os
def is_empty_file(fpath):
return os.path.isfile(fpath) and os.path.getsize(fpath) > 0

was einen bool Wert bool .

Dateien und Ordner E / A online lesen: https://riptutorial.com/de/python/topic/267/dateien-und-


ordner-e---a

https://riptutorial.com/de/home 160
Kapitel 35: Daten kopieren
Examples
Durchführen einer flachen Kopie

Eine flache Kopie ist eine Kopie einer Sammlung, ohne eine Kopie ihrer Elemente auszuführen.

>>> import copy


>>> c = [[1,2]]
>>> d = copy.copy(c)
>>> c is d
False
>>> c[0] is d[0]
True

Durchführen einer tiefen Kopie

Wenn Sie verschachtelte Listen haben, ist es wünschenswert, auch die verschachtelten Listen zu
klonen. Diese Aktion wird als Tiefenkopie bezeichnet.

>>> import copy


>>> c = [[1,2]]
>>> d = copy.deepcopy(c)
>>> c is d
False
>>> c[0] is d[0]
False

Durchführen einer flachen Kopie einer Liste

Sie können mit Slices flache Kopien von Listen erstellen.

>>> l1 = [1,2,3]
>>> l2 = l1[:] # Perform the shallow copy.
>>> l2
[1,2,3]
>>> l1 is l2
False

Wörterbuch kopieren

Ein Dictionary - Objekt hat die Methode copy . Es führt eine flache Kopie des Wörterbuchs aus.

>>> d1 = {1:[]}
>>> d2 = d1.copy()
>>> d1 is d2
False
>>> d1[1] is d2[1]

https://riptutorial.com/de/home 161
True

Ein Set kopieren

Sets haben auch eine copy . Mit dieser Methode können Sie eine flache Kopie erstellen.

>>> s1 = {()}
>>> s2 = s1.copy()
>>> s1 is s2
False
>>> s2.add(3)
>>> s1
{[]}
>>> s2
{3,[]}

Daten kopieren online lesen: https://riptutorial.com/de/python/topic/920/daten-kopieren

https://riptutorial.com/de/home 162
Kapitel 36: Datenbankzugriff
Bemerkungen
Python kann viele verschiedene Arten von Datenbanken verarbeiten. Für jeden dieser Typen gibt
es eine andere API. Um die Ähnlichkeit zwischen diesen verschiedenen APIs zu fördern, wurde
PEP 249 eingeführt.

Diese API wurde definiert, um die Ähnlichkeit zwischen den Python-Modulen zu


fördern, die für den Zugriff auf Datenbanken verwendet werden. Auf diese Weise
hoffen wir, eine Konsistenz zu erreichen, die zu leicht verständlicheren Modulen, zu
generell mehr portablem Code für Datenbanken und zu einer größeren Reichweite der
Datenbankkonnektivität von Python führt. PEP-249

Examples
Zugriff auf MySQL-Datenbank mit MySQLdb

Als Erstes müssen Sie mit der connect-Methode eine Verbindung zur Datenbank herstellen.
Danach benötigen Sie einen Cursor, der mit dieser Verbindung arbeitet.

Verwenden Sie die Ausführungsmethode des Cursors, um mit der Datenbank zu interagieren, und
machen Sie die Änderungen gelegentlich mit der Festschreibungsmethode des
Verbindungsobjekts fest.

Vergessen Sie nicht, den Cursor und die Verbindung zu schließen.

Hier ist eine Dbconnect-Klasse mit allem, was Sie brauchen.

import MySQLdb

class Dbconnect(object):

def __init__(self):

self.dbconection = MySQLdb.connect(host='host_example',
port=int('port_example'),
user='user_example',
passwd='pass_example',
db='schema_example')
self.dbcursor = self.dbconection.cursor()

def commit_db(self):
self.dbconection.commit()

def close_db(self):
self.dbcursor.close()
self.dbconection.close()

Die Interaktion mit der Datenbank ist einfach. Nachdem Sie das Objekt erstellt haben, verwenden

https://riptutorial.com/de/home 163
Sie einfach die Ausführungsmethode.

db = Dbconnect()
db.dbcursor.execute('SELECT * FROM %s' % 'table_example')

Wenn Sie eine gespeicherte Prozedur aufrufen möchten, verwenden Sie die folgende Syntax.
Beachten Sie, dass die Parameterliste optional ist.

db = Dbconnect()
db.callproc('stored_procedure_name', [parameters] )

Nachdem die Abfrage abgeschlossen ist, können Sie auf mehrere Arten auf die Ergebnisse
zugreifen. Das Cursorobjekt ist ein Generator, der alle Ergebnisse abrufen oder als Schleife
ausführen kann.

results = db.dbcursor.fetchall()
for individual_row in results:
first_field = individual_row[0]

Wenn Sie eine Schleife verwenden möchten, die direkt den Generator verwendet:

for individual_row in db.dbcursor:


first_field = individual_row[0]

Wenn Sie Änderungen an der Datenbank festschreiben möchten:

db.commit_db()

Wenn Sie den Cursor und die Verbindung schließen wollen:

db.close_db()

SQLite

SQLite ist eine leichtgewichtige, festplattenbasierte Datenbank. Da kein separater


Datenbankserver erforderlich ist, wird er häufig zum Prototyping oder für kleine Anwendungen
verwendet, die häufig von einem einzelnen Benutzer oder von einem Benutzer zu einem
bestimmten Zeitpunkt verwendet werden.

import sqlite3

conn = sqlite3.connect("users.db")
c = conn.cursor()

c.execute("CREATE TABLE user (name text, age integer)")

c.execute("INSERT INTO user VALUES ('User A', 42)")


c.execute("INSERT INTO user VALUES ('User B', 43)")

conn.commit()

https://riptutorial.com/de/home 164
c.execute("SELECT * FROM user")
print(c.fetchall())

conn.close()

Der obige Code stellt eine Verbindung zu der Datenbank her, die in der Datei mit dem Namen
users.db gespeichert ist. Die Datei wird zuerst erstellt, wenn sie noch nicht vorhanden ist. Sie
können über SQL-Anweisungen mit der Datenbank interagieren.

Das Ergebnis dieses Beispiels sollte sein:

[(u'User A', 42), (u'User B', 43)]

Die SQLite-Syntax: Eine eingehende Analyse


Fertig machen

1. Importieren Sie das sqlite-Modul mit

>>> import sqlite3

2. Um das Modul verwenden zu können, müssen Sie zuerst ein Connection-Objekt erstellen,
das die Datenbank darstellt. Hier werden die Daten in der Datei example.db gespeichert:

>>> conn = sqlite3.connect('users.db')

Alternativ können Sie auch den speziellen Namen :memory: erstellen Sie eine temporäre
Datenbank im RAM:

>>> conn = sqlite3.connect(':memory:')

3. Sobald Sie eine Connection , können Sie ein Cursor Objekt erstellen und seine Methode
execute() aufrufen, um SQL-Befehle auszuführen:

c = conn.cursor()

# Create table
c.execute('''CREATE TABLE stocks
(date text, trans text, symbol text, qty real, price real)''')

# Insert a row of data


c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")

# Save (commit) the changes


conn.commit()

# We can also close the connection if we are done with it.

https://riptutorial.com/de/home 165
# Just be sure any changes have been committed or they will be lost.
conn.close()

Wichtige Eigenschaften und Funktionen der Connection


1. isolation_level

Mit diesem Attribut wird die aktuelle Isolationsstufe abgerufen oder festgelegt. Keine für den
Autocommit-Modus oder eine der DEFERRED , IMMEDIATE oder EXCLUSIVE .

2. cursor

Das Cursorobjekt wird verwendet, um SQL-Befehle und Abfragen auszuführen.

3. commit()

Übernimmt die aktuelle Transaktion.

4. rollback()

Macht alle Änderungen rückgängig, die seit dem letzten Aufruf von commit()

5. close()

Schließt die Datenbankverbindung. commit() automatisch aufgerufen. Wenn close()


aufgerufen wird, ohne vorher commit() aufzurufen (vorausgesetzt, Sie befinden sich nicht im
Autocommit-Modus), gehen alle vorgenommenen Änderungen verloren.

6. total_changes

Ein Attribut, das die Gesamtzahl der Zeilen protokolliert, die seit dem Öffnen der Datenbank
geändert, gelöscht oder eingefügt wurden.

7. execute , executemany und executescript

Diese Funktionen funktionieren genauso wie die des Cursorobjekts. Dies ist eine Abkürzung,
da der Aufruf dieser Funktionen über das Verbindungsobjekt zur Erstellung eines Cursor-
Zwischenobjekts und zum Aufrufen der entsprechenden Methode des Cursorobjekts führt

8. row_factory

Sie können dieses Attribut in eine aufrufbare Eigenschaft ändern, die den Cursor und die
ursprüngliche Zeile als Tupel akzeptiert und die tatsächliche Ergebniszeile zurückgibt.

def dict_factory(cursor, row):


d = {}
for i, col in enumerate(cursor.description):
d[col[0]] = row[i]
return d

conn = sqlite3.connect(":memory:")
conn.row_factory = dict_factory

https://riptutorial.com/de/home 166
Wichtige Funktionen des Cursor
1. execute(sql[, parameters])

Führt eine einzelne SQL-Anweisung aus. Die SQL-Anweisung kann parametrisiert werden
(dh Platzhalter statt SQL-Literale). Das Modul sqlite3 unterstützt zwei Arten von Platzhaltern:
Fragezeichen ? ("Qmark style") und benannte Platzhalter :name ("named style").

import sqlite3
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("create table people (name, age)")

who = "Sophia"
age = 37
# This is the qmark style:
cur.execute("insert into people values (?, ?)",
(who, age))

# And this is the named style:


cur.execute("select * from people where name=:who and age=:age",
{"who": who, "age": age}) # the keys correspond to the placeholders in SQL

print(cur.fetchone())

Achtung: Verwenden Sie %s zum Einfügen von Zeichenfolgen in SQL-Befehle, da Ihr


Programm dadurch anfällig für einen SQL-Injection-Angriff werden kann (siehe SQL
Injection ).

2. executemany(sql, seq_of_parameters)

Führt einen SQL-Befehl für alle in der Sequenz sql gefundenen Parametersequenzen oder -
zuordnungen aus. Das Modul sqlite3 ermöglicht auch die Verwendung eines Iterators, der
anstelle einer Sequenz Parameter liefert.

L = [(1, 'abcd', 'dfj', 300), # A list of tuples to be inserted into the database
(2, 'cfgd', 'dyfj', 400),
(3, 'sdd', 'dfjh', 300.50)]

conn = sqlite3.connect("test1.db")
conn.execute("create table if not exists book (id int, name text, author text, price
real)")
conn.executemany("insert into book values (?, ?, ?, ?)", L)

for row in conn.execute("select * from book"):


print(row)

Sie können auch Iterator-Objekte als Parameter an das ausführende Unternehmen


übergeben, und die Funktion durchläuft jedes Tupel von Werten, das der Iterator zurückgibt.
Der Iterator muss ein Tupel von Werten zurückgeben.

import sqlite3

class IterChars:

https://riptutorial.com/de/home 167
def __init__(self):
self.count = ord('a')

def __iter__(self):
return self

def __next__(self): # (use next(self) for Python 2)


if self.count > ord('z'):
raise StopIteration
self.count += 1
return (chr(self.count - 1),)

conn = sqlite3.connect("abc.db")
cur = conn.cursor()
cur.execute("create table characters(c)")

theIter = IterChars()
cur.executemany("insert into characters(c) values (?)", theIter)

rows = cur.execute("select c from characters")


for row in rows:
print(row[0]),

3. executescript(sql_script)

Dies ist eine nicht dem Standard entsprechende Methode zum gleichzeitigen Ausführen
mehrerer SQL-Anweisungen. Es gibt zuerst eine COMMIT Anweisung aus und führt dann das
SQL-Skript aus, das es als Parameter erhält.

sql_script kann eine Instanz von str oder bytes .

import sqlite3
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.executescript("""
create table person(
firstname,
lastname,
age
);

create table book(


title,
author,
published
);

insert into book(title, author, published)


values (
'Dirk Gently''s Holistic Detective Agency',
'Douglas Adams',
1987
);
""")

Die nächsten Funktionen werden in Verbindung mit SELECT Anweisungen in SQL verwendet.
Um Daten nach der Ausführung einer SELECT Anweisung abzurufen, können Sie den Cursor
entweder als Iterator behandeln, die Methode fetchone() des Cursors fetchone() , um eine

https://riptutorial.com/de/home 168
einzelne übereinstimmende Zeile fetchall() , oder fetchall() aufrufen, um eine Liste der
übereinstimmenden Zeilen fetchall() .

Beispiel für das Iterator-Formular:

import sqlite3
stocks = [('2006-01-05', 'BUY', 'RHAT', 100, 35.14),
('2006-03-28', 'BUY', 'IBM', 1000, 45.0),
('2006-04-06', 'SELL', 'IBM', 500, 53.0),
('2006-04-05', 'BUY', 'MSFT', 1000, 72.0)]
conn = sqlite3.connect(":memory:")
conn.execute("create table stocks (date text, buysell text, symb text, amount int, price
real)")
conn.executemany("insert into stocks values (?, ?, ?, ?, ?)", stocks)
cur = conn.cursor()

for row in cur.execute('SELECT * FROM stocks ORDER BY price'):


print(row)

# Output:
# ('2006-01-05', 'BUY', 'RHAT', 100, 35.14)
# ('2006-03-28', 'BUY', 'IBM', 1000, 45.0)
# ('2006-04-06', 'SELL', 'IBM', 500, 53.0)
# ('2006-04-05', 'BUY', 'MSFT', 1000, 72.0)

4. fetchone()

Ruft die nächste Zeile eines Abfrageergebnissatzes ab und gibt eine einzelne Sequenz
zurück oder Keine, wenn keine weiteren Daten verfügbar sind.

cur.execute('SELECT * FROM stocks ORDER BY price')


i = cur.fetchone()
while(i):
print(i)
i = cur.fetchone()

# Output:
# ('2006-01-05', 'BUY', 'RHAT', 100, 35.14)
# ('2006-03-28', 'BUY', 'IBM', 1000, 45.0)
# ('2006-04-06', 'SELL', 'IBM', 500, 53.0)
# ('2006-04-05', 'BUY', 'MSFT', 1000, 72.0)

5. fetchmany(size=cursor.arraysize)

Ruft die nächsten Zeilen eines Abfrageergebnisses ab (durch Größe angegeben) und gibt
eine Liste zurück. Wenn size nicht angegeben wird, gibt fetchmany eine einzelne Zeile
zurück. Eine leere Liste wird zurückgegeben, wenn keine weiteren Zeilen verfügbar sind.

cur.execute('SELECT * FROM stocks ORDER BY price')


print(cur.fetchmany(2))

# Output:
# [('2006-01-05', 'BUY', 'RHAT', 100, 35.14), ('2006-03-28', 'BUY', 'IBM', 1000, 45.0)]

6. fetchall()

https://riptutorial.com/de/home 169
Ruft alle (verbleibenden) Zeilen eines Abfrageergebnisses ab und gibt eine Liste zurück.

cur.execute('SELECT * FROM stocks ORDER BY price')


print(cur.fetchall())

# Output:
# [('2006-01-05', 'BUY', 'RHAT', 100, 35.14), ('2006-03-28', 'BUY', 'IBM', 1000, 45.0),
('2006-04-06', 'SELL', 'IBM', 500, 53.0), ('2006-04-05', 'BUY', 'MSFT', 1000, 72.0)]

SQLite- und Python-Datentypen

SQLite unterstützt nativ die folgenden Typen: NULL, INTEGER, REAL, TEXT, BLOB.

Auf diese Weise werden die Datentypen konvertiert, wenn von SQL zu Python oder umgekehrt
gewechselt wird.

None <-> NULL


int <-> INTEGER/INT
float <-> REAL/FLOAT
str <-> TEXT/VARCHAR(n)
bytes <-> BLOB

PostgreSQL-Datenbankzugriff mit psycopg2

psycopg2 ist der beliebteste PostgreSQL-Datenbankadapter, der leicht und effizient ist. Es ist die
aktuelle Implementierung des PostgreSQL-Adapters.

Seine Hauptmerkmale sind die vollständige Implementierung der Python DB API 2.0-
Spezifikation und die Threadsicherheit (mehrere Threads können dieselbe Verbindung
gemeinsam nutzen).

Herstellen einer Verbindung zur Datenbank und Erstellen


einer Tabelle

import psycopg2

# Establish a connection to the database.


# Replace parameter values with database credentials.
conn = psycopg2.connect(database="testpython",
user="postgres",
host="localhost",
password="abc123",
port="5432")

# Create a cursor. The cursor allows you to execute database queries.


cur = conn.cursor()

# Create a table. Initialise the table name, the column names and data type.
cur.execute("""CREATE TABLE FRUITS (
id INT ,
fruit_name TEXT,
color TEXT,

https://riptutorial.com/de/home 170
price REAL
)""")
conn.commit()
conn.close()

Daten in die Tabelle einfügen:

# After creating the table as shown above, insert values into it.
cur.execute("""INSERT INTO FRUITS (id, fruit_name, color, price)
VALUES (1, 'Apples', 'green', 1.00)""")

cur.execute("""INSERT INTO FRUITS (id, fruit_name, color, price)


VALUES (1, 'Bananas', 'yellow', 0.80)""")

Tabellendaten abrufen:

# Set up a query and execute it


cur.execute("""SELECT id, fruit_name, color, price
FROM fruits""")

# Fetch the data


rows = cur.fetchall()

# Do stuff with the data


for row in rows:
print "ID = {} ".format(row[0])
print "FRUIT NAME = {}".format(row[1])
print("COLOR = {}".format(row[2]))
print("PRICE = {}".format(row[3]))

Die Ausgabe des obigen wäre:

ID = 1
NAME = Apples
COLOR = green
PRICE = 1.0

ID = 2
NAME = Bananas
COLOR = yellow
PRICE = 0.8

Und jetzt wissen Sie die Hälfte von allem, was Sie über psycopg2 wissen müssen ! :)

Oracle-Datenbank

Voraussetzungen:

• cx_Oracle-Paket - Hier finden Sie alle Versionen


• Oracle Instant Client - Für Windows x64 , Linux x64

https://riptutorial.com/de/home 171
Konfiguration:

• Installieren Sie das cx_Oracle-Paket wie folgt:

sudo rpm -i <YOUR_PACKAGE_FILENAME>

• Extrahieren Sie den Oracle Instant Client und legen Sie die Umgebungsvariablen wie folgt
fest:

ORACLE_HOME=<PATH_TO_INSTANTCLIENT>
PATH=$ORACLE_HOME:$PATH
LD_LIBRARY_PATH=<PATH_TO_INSTANTCLIENT>:$LD_LIBRARY_PATH

Verbindung herstellen:

import cx_Oracle

class OraExec(object):
_db_connection = None
_db_cur = None

def __init__(self):
self._db_connection =
cx_Oracle.connect('<USERNAME>/<PASSWORD>@<HOSTNAME>:<PORT>/<SERVICE_NAME>')
self._db_cur = self._db_connection.cursor()

Datenbankversion abrufen:

ver = con.version.split(".")
print ver

Sample-Ausgabe: ['12 ',' 1 ',' 0 ',' 2 ',' 0 ']

Abfrage ausführen: SELECT

_db_cur.execute("select * from employees order by emp_id")


for result in _db_cur:
print result

Die Ausgabe erfolgt in Python-Tupeln:

(10, 'SYSADMIN', 'IT-INFRA', 7)

(23, 'HR ASSOCIATE', 'MENSCHLICHE RESSOURCEN', 6)

Abfrage ausführen: INSERT

_db_cur.execute("insert into employees(emp_id, title, dept, grade)


values (31, 'MTS', 'ENGINEERING', 7)
_db_connection.commit()

Wenn Sie Einfüge- / Aktualisierungs- / Löschvorgänge in einer Oracle-Datenbank durchführen,

https://riptutorial.com/de/home 172
sind die Änderungen nur in Ihrer Sitzung verfügbar, bis Sie ein commit ausführen. Wenn die
aktualisierten Daten für die Datenbank festgeschrieben sind, stehen sie anderen Benutzern und
Sitzungen zur Verfügung.

Abfrage ausführen: INSERT mit Bind-Variablen

Referenz

Bindungsvariablen ermöglichen es Ihnen, Anweisungen mit neuen Werten erneut auszuführen,


ohne dass die Anweisung erneut analysiert werden muss. Bindungsvariablen verbessern die
Wiederverwendbarkeit von Code und können das Risiko von SQL Injection-Angriffen verringern.

rows = [ (1, "First" ),


(2, "Second" ),
(3, "Third" ) ]
_db_cur.bindarraysize = 3
_db_cur.setinputsizes(int, 10)
_db_cur.executemany("insert into mytab(id, data) values (:1, :2)", rows)
_db_connection.commit()

Verbindung schließen:

_db_connection.close()

Die close () -Methode schließt die Verbindung. Alle Verbindungen, die nicht explizit geschlossen
wurden, werden automatisch freigegeben, wenn das Skript endet.

Verbindung

Verbindung herstellen

Gemäß PEP 249 sollte die Verbindung zu einer Datenbank mithilfe eines connect() Konstruktors
hergestellt werden, der ein Connection Objekt zurückgibt. Die Argumente für diesen Konstruktor
sind datenbankabhängig. In den datenbankspezifischen Themen finden Sie die relevanten
Argumente.

import MyDBAPI

con = MyDBAPI.connect(*database_dependent_args)

Dieses Verbindungsobjekt verfügt über vier Methoden:

1: schließen

con.close()

Schließt die Verbindung sofort. Beachten Sie, dass die Verbindung automatisch geschlossen wird,
wenn die Connection.__del___ Methode aufgerufen wird. Alle ausstehenden Transaktionen werden
implizit zurückgesetzt.

https://riptutorial.com/de/home 173
2: begehen

con.commit()

Überträgt jede ausstehende Transaktion in die Datenbank.

3: Rollback

con.rollback()

Rollt zum Beginn einer ausstehenden Transaktion zurück. Mit anderen Worten: Dies bricht jede
nicht festgeschriebene Transaktion in der Datenbank ab.

4: Cursor

cur = con.cursor()

Gibt ein Cursor Objekt zurück. Damit werden Transaktionen in der Datenbank ausgeführt.

Sqlalchemy verwenden

So verwenden Sie sqlalchemy für die Datenbank:

from sqlalchemy import create_engine


from sqlalchemy.engine.url import URL

url = URL(drivername='mysql',
username='user',
password='passwd',
host='host',
database='db')

engine = create_engine(url) # sqlalchemy engine

Jetzt kann diese Engine verwendet werden: zB mit Pandas, um Dataframes direkt von MySQL
abzurufen

import pandas as pd

con = engine.connect()
dataframe = pd.read_sql(sql=query, con=con)

Datenbankzugriff online lesen: https://riptutorial.com/de/python/topic/4240/datenbankzugriff

https://riptutorial.com/de/home 174
Kapitel 37: Datenserialisierung
Syntax
• unpickled_string = pickle.loads (string)
• unpickled_string = pickle.load (file_object)
• pickled_string = pickle.dumps ([('', 'cmplx'), {('object',): Keine}],
pickle.HIGHEST_PROTOCOL)
• pickle.dump (('', 'cmplx'), {('object',): Keine}], file_object, pickle.HIGHEST_PROTOCOL)
• unjsoned_string = json.loads (string)
• unjsoned_string = json.load (file_object)
• jsoned_string = json.dumps (('a', 'b', 'c', [1, 2, 3]))
• json.dump (('a', 'b', 'c', [1, 2, 3]), file_object)

Parameter

Parameter Einzelheiten

Verwendung von pickle oder cPickle , ist es die Methode , die Objekte werden
Serialized / deserialisiert. pickle.HIGHEST_PROTOCOL möchten
protocol
pickle.HIGHEST_PROTOCOL hier pickle.HIGHEST_PROTOCOL , was die neueste Methode
bedeutet.

Bemerkungen
Warum JSON verwenden?

• Sprachübergreifende Unterstützung
• Für Menschen lesbar
• Anders als bei Pickle besteht keine Gefahr, beliebigen Code auszuführen

Warum nicht JSON verwenden?

• Unterstützt keine Pythonic-Datentypen


• Schlüssel in Wörterbüchern dürfen nur Datentypen für Zeichenfolgen sein.

Warum Pickle?

• Gute Möglichkeit, Pythonic zu serialisieren (Tupel, Funktionen, Klassen)


• Schlüssel in Wörterbüchern können jeden Datentyp haben.

Warum nicht Pickle?

• Sprachübergreifende Unterstützung fehlt


• Es ist nicht sicher, beliebige Daten zu laden

https://riptutorial.com/de/home 175
Examples
Serialisierung mit JSON

JSON ist eine vielsprachige Methode zur Serialisierung von Daten

Unterstützte Datentypen: int , float , boolean , string , list und dict . Weitere Informationen finden
Sie unter -> JSON-Wiki

Hier ist ein Beispiel, das die grundlegende Verwendung von JSON veranschaulicht : -

import json

families = (['John'], ['Mark', 'David', {'name': 'Avraham'}])

# Dumping it into string


json_families = json.dumps(families)
# [["John"], ["Mark", "David", {"name": "Avraham"}]]

# Dumping it to file
with open('families.json', 'w') as json_file:
json.dump(families, json_file)

# Loading it from string


json_families = json.loads(json_families)

# Loading it from file


with open('families.json', 'r') as json_file:
json_families = json.load(json_file)

Ausführliche Informationen zu JSON finden Sie im JSON-Modul .

Serialisierung mit Pickle

Hier ist ein Beispiel, das die grundlegende Verwendung von Pickle demonstriert: -

# Importing pickle
try:
import cPickle as pickle # Python 2
except ImportError:
import pickle # Python 3

# Creating Pythonic object:


class Family(object):
def __init__(self, names):
self.sons = names

def __str__(self):
return ' '.join(self.sons)

my_family = Family(['John', 'David'])

# Dumping to string
pickle_data = pickle.dumps(my_family, pickle.HIGHEST_PROTOCOL)

https://riptutorial.com/de/home 176
# Dumping to file
with open('family.p', 'w') as pickle_file:
pickle.dump(families, pickle_file, pickle.HIGHEST_PROTOCOL)

# Loading from string


my_family = pickle.loads(pickle_data)

# Loading from file


with open('family.p', 'r') as pickle_file:
my_family = pickle.load(pickle_file)

Siehe Pickle für detaillierte Informationen über Pickle.

WARNUNG : Die offizielle Dokumentation zu Pickle macht deutlich, dass es keine


Sicherheitsgarantien gibt. Laden Sie keine Daten, deren Herkunft Sie nicht kennen.

Datenserialisierung online lesen: https://riptutorial.com/de/python/topic/3347/datenserialisierung

https://riptutorial.com/de/home 177
Kapitel 38: Datenserialisierung von Pickles
Syntax
• pickle.dump (Objekt, Datei, Protokoll) #So serialisiert ein Objekt

• pickle.load (file) #Umserialisieren eines Objekts

• pickle.dumps (object, protocol) # Um ein Objekt in Bytes zu serialisieren

• pickle.loads (buffer) # Um ein Objekt von Bytes zu trennen

Parameter

Parameter Einzelheiten

Objekt Das Objekt, das gespeichert werden soll

Datei Die geöffnete Datei, die das Objekt enthalten soll

Protokoll Das zum Beizen des Objekts verwendete Protokoll (optionaler Parameter)

Puffer Ein Byte-Objekt, das ein serialisiertes Objekt enthält

Bemerkungen

Pickleable Typen
Die folgenden Objekte sind picklierbar.

• None , True und False


• Zahlen (aller Art)
• Saiten (aller Art)
• tuple s, list s, set s und dict s , die nur picklable Objekte
• Funktionen, die auf der obersten Ebene eines Moduls definiert sind
• eingebaute Funktionen
• Klassen, die auf der obersten Ebene eines Moduls definiert sind
○ Instanzen solcher Klassen, deren __dict__ oder das Ergebnis des Aufrufs von
__getstate__() picklierbar ist (Details finden Sie in den offiziellen Dokumenten ).

Basierend auf der offiziellen Python-Dokumentation .

pickle und Sicherheit


https://riptutorial.com/de/home 178
Das Pickle-Modul ist nicht sicher . Es sollte nicht verwendet werden, wenn die serialisierten
Daten von einer nicht vertrauenswürdigen Partei, z. B. über das Internet, empfangen werden.

Examples
Verwenden von Pickle zum Serialisieren und Deserialisieren eines Objekts

Das pickle Modul implementiert einen Algorithmus zum Umwandeln eines beliebigen Python-
Objekts in eine Reihe von Bytes. Dieser Vorgang wird auch als Serialisierung des Objekts
bezeichnet. Der das Objekt repräsentierende Byte-Datenstrom kann dann übertragen oder
gespeichert und später rekonstruiert werden, um ein neues Objekt mit denselben Eigenschaften
zu erstellen.

Für den einfachsten Code verwenden wir die Funktionen dump() und load() .

Das Objekt wird serialisiert


import pickle

# An arbitrary collection of objects supported by pickle.


data = {
'a': [1, 2.0, 3, 4+6j],
'b': ("character string", b"byte string"),
'c': {None, True, False}
}

with open('data.pickle', 'wb') as f:


# Pickle the 'data' dictionary using the highest protocol available.
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)

Das Objekt deserialisieren


import pickle

with open('data.pickle', 'rb') as f:


# The protocol version used is detected automatically, so we do not
# have to specify it.
data = pickle.load(f)

Pickle- und Byte-Objekte verwenden


Es ist auch möglich , in serialisiert und deserialisiert aus Byte Objekten, die unter Verwendung von
dumps und loads - Funktion, die äquivalent ist zu dump und load .

https://riptutorial.com/de/home 179
serialized_data = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
# type(serialized_data) is bytes

deserialized_data = pickle.loads(serialized_data)
# deserialized_data == data

Angepasste Daten anpassen

Einige Daten können nicht gebeizt werden. Andere Daten sollten aus anderen Gründen nicht
gepickt werden.

Was __getstate__ wird, kann in der __getstate__ Methode definiert werden. Diese Methode muss
etwas Pickelbares zurückgeben.

Auf der gegenüberliegenden Seite ist __setstate__ : Er erhält das, was __getstate__ erstellt hat,
und muss das Objekt initialisieren.

class A(object):
def __init__(self, important_data):
self.important_data = important_data

# Add data which cannot be pickled:


self.func = lambda: 7

# Add data which should never be pickled, because it expires quickly:


self.is_up_to_date = False

def __getstate__(self):
return [self.important_data] # only this is needed

def __setstate__(self, state):


self.important_data = state[0]

self.func = lambda: 7 # just some hard-coded unpicklable function

self.is_up_to_date = False # even if it was before pickling

Jetzt kann das gemacht werden:

>>> a1 = A('very important')


>>>
>>> s = pickle.dumps(a1) # calls a1.__getstate__()
>>>
>>> a2 = pickle.loads(s) # calls a1.__setstate__(['very important'])
>>> a2
<__main__.A object at 0x0000000002742470>
>>> a2.important_data
'very important'
>>> a2.func()
7

Die Implementierung hier enthält eine Liste mit einem Wert: [self.important_data] . Das war nur
ein Beispiel, __getstate__ hätte alles zurückgeben können, was picklierbar ist, solange
__setstate__ weiß, wie die Gegenseite zu tun ist. Eine gute Alternative ist ein Wörterbuch aller

https://riptutorial.com/de/home 180
Werte: {'important_data': self.important_data} .

Konstruktor wird nicht aufgerufen! Beachten Sie, dass im vorherigen Beispiel a2 in pickle.loads
ohne dass A.__init__ A.__setstate__ musste A.__setstate__ alles initialisieren, das __init__
initialisiert hätte, wenn es aufgerufen würde.

Datenserialisierung von Pickles online lesen:


https://riptutorial.com/de/python/topic/2606/datenserialisierung-von-pickles

https://riptutorial.com/de/home 181
Kapitel 39: Datenvisualisierung mit Python
Examples
Matplotlib

Matplotlib ist eine mathematische Plotterbibliothek für Python, die eine Vielzahl verschiedener
Plotfunktionen bietet.

Die Matplotlib-Dokumentation finden Sie hier , die SO-Dokumente stehen hier zur
Verfügung.

Matplotlib bietet zwei verschiedene Methoden zum Plotten, die jedoch größtenteils austauschbar
sind:

• Erstens bietet matplotlib die pyplot Schnittstelle, eine direkte und einfach zu verwendende
Schnittstelle, die das pyplot komplexer Diagramme in einem MATLAB-ähnlichen Stil
ermöglicht.
• Zweitens ermöglicht matplotlib dem Benutzer, die verschiedenen Aspekte (Achsen, Linien,
Hilfsstriche usw.) direkt über ein objektbasiertes System zu steuern. Dies ist schwieriger,
ermöglicht jedoch die vollständige Kontrolle über die gesamte Grafik.

Im Folgenden sehen Sie ein Beispiel für die Verwendung der pyplot Schnittstelle zum pyplot
einiger generierter Daten:

import matplotlib.pyplot as plt

# Generate some data for plotting.


x = [0, 1, 2, 3, 4, 5, 6]
y = [i**2 for i in x]

# Plot the data x, y with some keyword arguments that control the plot style.
# Use two different plot commands to plot both points (scatter) and a line (plot).

plt.scatter(x, y, c='blue', marker='x', s=100) # Create blue markers of shape "x" and size 100
plt.plot(x, y, color='red', linewidth=2) # Create a red line with linewidth 2.

# Add some text to the axes and a title.


plt.xlabel('x data')
plt.ylabel('y data')
plt.title('An example plot')

# Generate the plot and show to the user.


plt.show()

https://riptutorial.com/de/home 182
Beachten Sie, dass plt.show() bekanntermaßen in einigen Umgebungen problematisch ist, weil
matplotlib.pyplot im interaktiven Modus ausgeführt wird. Wenn dies der Fall ist, kann das
Blockierungsverhalten explizit überschrieben werden, indem das optionale Argument
plt.show(block=True) , um das Problem zu mildern.

Seaborn

Seaborn ist eine Hülle um Matplotlib, die das Erstellen gemeinsamer statistischer Diagramme
vereinfacht. Die Liste der unterstützten Diagramme umfasst univariate und bivariate
Verteilungsdiagramme, Regressionsdiagramme und eine Reihe von Methoden zum Zeichnen
kategorialer Variablen. Die vollständige Liste der Grundstücke, die Seaborn bietet, finden Sie in
der API-Referenz .

Das Erstellen von Diagrammen in Seaborn ist so einfach wie das Aufrufen der entsprechenden
Grafikfunktion. Hier ein Beispiel zum Erstellen eines Histogramms, einer Schätzung der
Kerndichte und eines Rug-Plots für zufällig generierte Daten.

import numpy as np # numpy used to create data from plotting

https://riptutorial.com/de/home 183
import seaborn as sns # common form of importing seaborn

# Generate normally distributed data


data = np.random.randn(1000)

# Plot a histogram with both a rugplot and kde graph superimposed


sns.distplot(data, kde=True, rug=True)

Der Stil des Diagramms kann auch mit einer deklarativen Syntax gesteuert werden.

# Using previously created imports and data.

# Use a dark background with no grid.


sns.set_style('dark')
# Create the plot again
sns.distplot(data, kde=True, rug=True)

https://riptutorial.com/de/home 184
Als zusätzlicher Bonus können noch normale Matplotlib-Befehle auf Seaborn-Plots angewendet
werden. Hier ein Beispiel zum Hinzufügen von Achsentiteln zu unserem zuvor erstellten
Histogramm.

# Using previously created data and style

# Access to matplotlib commands


import matplotlib.pyplot as plt

# Previously created plot.


sns.distplot(data, kde=True, rug=True)
# Set the axis labels.
plt.xlabel('This is my x-axis')
plt.ylabel('This is my y-axis')

https://riptutorial.com/de/home 185
MayaVI

MayaVI ist ein 3D-Visualisierungswerkzeug für wissenschaftliche Daten. Es verwendet das


Visualization Tool Kit oder VTK unter der Haube. Mit der Kraft von VTK kann MayaVI eine Vielzahl
von dreidimensionalen Darstellungen und Abbildungen erstellen . Es ist als separate
Softwareanwendung und auch als Bibliothek verfügbar. Ähnlich wie Matplotlib bietet diese
Bibliothek eine objektorientierte Programmiersprachenschnittstelle, um Plots zu erstellen, ohne
VTK zu kennen.

MayaVI ist nur in der Python 2.7x-Serie verfügbar! Es wird gehofft, bald in Python 3-x-Serie
verfügbar zu sein! (Obwohl einige Erfolge bei der Verwendung der Abhängigkeiten in
Python 3 zu verzeichnen sind)

Dokumentation finden Sie hier . Einige Galeriebeispiele finden Sie hier

Hier ist ein Beispieldiagramm, das mit MayaVI aus der Dokumentation erstellt wurde.

# Author: Gael Varoquaux <[email protected]>


# Copyright (c) 2007, Enthought, Inc.
# License: BSD Style.

https://riptutorial.com/de/home 186
from numpy import sin, cos, mgrid, pi, sqrt
from mayavi import mlab

mlab.figure(fgcolor=(0, 0, 0), bgcolor=(1, 1, 1))


u, v = mgrid[- 0.035:pi:0.01, - 0.035:pi:0.01]

X = 2 / 3. * (cos(u) * cos(2 * v)
+ sqrt(2) * sin(u) * cos(v)) * cos(u) / (sqrt(2) -
sin(2 * u) * sin(3 * v))
Y = 2 / 3. * (cos(u) * sin(2 * v) -
sqrt(2) * sin(u) * sin(v)) * cos(u) / (sqrt(2)
- sin(2 * u) * sin(3 * v))
Z = -sqrt(2) * cos(u) * cos(u) / (sqrt(2) - sin(2 * u) * sin(3 * v))
S = sin(u)

mlab.mesh(X, Y, Z, scalars=S, colormap='YlGnBu', )

# Nice view from the front


mlab.view(.0, - 5.0, 4)
mlab.show()

Plotly

Plotly ist eine moderne Plattform zum Plotten und zur Datenvisualisierung. Plotly ist eine
Bibliothek für Python , R , JavaScript , Julia und MATLAB . Es kann auch als Webanwendung
mit diesen Sprachen verwendet werden.

Benutzer können die plotly-Bibliothek installieren und nach der Benutzerauthentifizierung offline
verwenden. Die Installation dieser Bibliothek und Offline - Authentifizierung ist gegeben hier . Die
Diagramme können auch in Jupyter Notebooks erstellt werden.

Die Verwendung dieser Bibliothek erfordert ein Konto mit Benutzername und Kennwort. Dadurch
wird der Arbeitsbereich zum Speichern von Plots und Daten in der Cloud bereitgestellt.

Die kostenlose Version der Bibliothek hat einige geringfügig eingeschränkte Funktionen und ist für
die Erstellung von 250 Plots pro Tag konzipiert. Die kostenpflichtige Version bietet alle

https://riptutorial.com/de/home 187
Funktionen, unbegrenzte Plot-Downloads und mehr privaten Datenspeicher. Für weitere Details
kann man die Hauptseite hier besuchen.

Dokumentation und Beispiele finden Sie hier

Ein Beispieldiagramm aus den Dokumentationsbeispielen:

import plotly.graph_objs as go
import plotly as ply

# Create random data with numpy


import numpy as np

N = 100
random_x = np.linspace(0, 1, N)
random_y0 = np.random.randn(N)+5
random_y1 = np.random.randn(N)
random_y2 = np.random.randn(N)-5

# Create traces
trace0 = go.Scatter(
x = random_x,
y = random_y0,
mode = 'lines',
name = 'lines'
)
trace1 = go.Scatter(
x = random_x,
y = random_y1,
mode = 'lines+markers',
name = 'lines+markers'
)
trace2 = go.Scatter(
x = random_x,
y = random_y2,
mode = 'markers',
name = 'markers'
)
data = [trace0, trace1, trace2]

ply.offline.plot(data, filename='line-mode')

https://riptutorial.com/de/home 188
Datenvisualisierung mit Python online lesen:
https://riptutorial.com/de/python/topic/2388/datenvisualisierung-mit-python

https://riptutorial.com/de/home 189
Kapitel 40: Datum und Uhrzeit
Bemerkungen
Python bietet sowohl integrierte Methoden als auch externe Bibliotheken zum Erstellen, Ändern,
Analysieren und Bearbeiten von Datum und Uhrzeit .

Examples
Parsen einer Zeichenfolge in ein Zeitzonenobjekt mit Zeitzone

Python 3.2+ unterstützt das %z Format, wenn eine Zeichenfolge in ein datetime Objekt datetime
wird.

UTC-Offset in der Form +HHMM oder -HHMM (leere Zeichenfolge, wenn das Objekt nicht
aktiv ist).

Python 3.x 3.2

import datetime
dt = datetime.datetime.strptime("2016-04-15T08:27:18-0500", "%Y-%m-%dT%H:%M:%S%z")

Für andere Python-Versionen können Sie eine externe Bibliothek wie dateutil , wodurch das
Analysieren einer Zeichenfolge mit Zeitzone in ein datetime Objekt schnell ist.

import dateutil.parser
dt = dateutil.parser.parse("2016-04-15T08:27:18-0500")

Die Variable dt ist jetzt ein datetime Objekt mit dem folgenden Wert:

datetime.datetime(2016, 4, 15, 8, 27, 18, tzinfo=tzoffset(None, -18000))

Einfache Datumsberechnung

Termine existieren nicht isoliert. Es ist üblich, dass Sie die Zeit zwischen den Datumsangaben
oder das Datum für morgen bestimmen müssen. Dies kann mit timedelta Objekten erreicht werden

import datetime

today = datetime.date.today()
print('Today:', today)

yesterday = today - datetime.timedelta(days=1)


print('Yesterday:', yesterday)

tomorrow = today + datetime.timedelta(days=1)


print('Tomorrow:', tomorrow)

https://riptutorial.com/de/home 190
print('Time between tomorrow and yesterday:', tomorrow - yesterday)

Dies führt zu ähnlichen Ergebnissen:

Today: 2016-04-15
Yesterday: 2016-04-14
Tomorrow: 2016-04-16
Difference between tomorrow and yesterday: 2 days, 0:00:00

Grundlegende Verwendung von datetime-Objekten

Das datetime-Modul enthält drei Haupttypen von Objekten - date, time und datetime.

import datetime

# Date object
today = datetime.date.today()
new_year = datetime.date(2017, 01, 01) #datetime.date(2017, 1, 1)

# Time object
noon = datetime.time(12, 0, 0) #datetime.time(12, 0)

# Current datetime
now = datetime.datetime.now()

# Datetime object
millenium_turn = datetime.datetime(2000, 1, 1, 0, 0, 0) #datetime.datetime(2000, 1, 1, 0, 0)

Arithmetische Operationen für diese Objekte werden nur innerhalb desselben Datentyps
unterstützt. Wenn Sie eine einfache Arithmetik mit Instanzen verschiedener Typen ausführen, wird
ein TypeError-Wert erzeugt.

# subtraction of noon from today


noon-today
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.date'
However, it is straightforward to convert between types.

# Do this instead
print('Time since the millenium at midnight: ',
datetime.datetime(today.year, today.month, today.day) - millenium_turn)

# Or this
print('Time since the millenium at noon: ',
datetime.datetime.combine(today, noon) - millenium_turn)

Iteriere über Termine

Manchmal möchten Sie einen Datumsbereich von einem Startdatum bis zu einem Enddatum
durchlaufen. Sie können dies mit einer datetime Bibliothek und einem timedelta tun:

https://riptutorial.com/de/home 191
import datetime

# The size of each step in days


day_delta = datetime.timedelta(days=1)

start_date = datetime.date.today()
end_date = start_date + 7*day_delta

for i in range((end_date - start_date).days):


print(start_date + i*day_delta)

Was produziert:

2016-07-21
2016-07-22
2016-07-23
2016-07-24
2016-07-25
2016-07-26
2016-07-27

Analysieren einer Zeichenfolge mit einem kurzen Zeitzonennamen in ein


Zeitzonenobjekt mit Datum und Uhrzeit

Wenn Sie die dateutil Bibliothek wie im vorherigen Beispiel zum Analysieren von Zeitzonen mit
Zeitzonen verwenden , ist es auch möglich, Zeitmarken mit einem angegebenen "kurzen"
Zeitzonennamen zu parsen.

Für Datumsangaben, die mit kurzen Zeitzonennamen oder Abkürzungen formatiert sind, die im
Allgemeinen mehrdeutig sind (z. B. CST, z. B. Central Standard Time, China Standard Time,
Cuba Standard Time usw.) - weitere Informationen finden Sie hier , ist es erforderlich, eine
Zuordnung zwischen der Abkürzung für die Zeitzone und dem tzinfo Objekt tzinfo .

from dateutil import tz


from dateutil.parser import parse

ET = tz.gettz('US/Eastern')
CT = tz.gettz('US/Central')
MT = tz.gettz('US/Mountain')
PT = tz.gettz('US/Pacific')

us_tzinfos = {'CST': CT, 'CDT': CT,


'EST': ET, 'EDT': ET,
'MST': MT, 'MDT': MT,
'PST': PT, 'PDT': PT}

dt_est = parse('2014-01-02 04:00:00 EST', tzinfos=us_tzinfos)


dt_pst = parse('2016-03-11 16:00:00 PST', tzinfos=us_tzinfos)

Nach dem Ausführen dieses:

dt_est
# datetime.datetime(2014, 1, 2, 4, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Eastern'))
dt_pst

https://riptutorial.com/de/home 192
# datetime.datetime(2016, 3, 11, 16, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Pacific'))

Es ist erwähnenswert, dass bei Verwendung einer pytz Zeitzone mit dieser Methode diese nicht
richtig lokalisiert wird:

from dateutil.parser import parse


import pytz

EST = pytz.timezone('America/New_York')
dt = parse('2014-02-03 09:17:00 EST', tzinfos={'EST': EST})

Dadurch wird einfach die pytz Zeitzone an die datetime angehängt:

dt.tzinfo # Will be in Local Mean Time!


# <DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>

Wenn Sie diese Methode verwenden, sollten Sie nach dem Parsen wahrscheinlich den naiven Teil
der datetime neu localize :

dt_fixed = dt.tzinfo.localize(dt.replace(tzinfo=None))
dt_fixed.tzinfo # Now it's EST.
# <DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)

Zeitzonenbasierte Datenzeiten erstellen

Standardmäßig sind alle datetime Objekte nicht aktiv. Um sie tzinfo zu machen, müssen Sie ein
tzinfo Objekt anhängen, das den UTC-Offset und die Zeitzonenabkürzung als Funktion von
Datum und Uhrzeit bereitstellt.

Versetzte Zeitzonen korrigiert

Für Zeitzonen, die einen festen Versatz von UTC haben, stellt das Modul datetime in Python 3.2
und datetime die timezone bereit, eine konkrete Implementierung von tzinfo , die ein Zeit- timedelta
und einen (optionalen) Namensparameter benötigt:

Python 3.x 3.2

from datetime import datetime, timedelta, timezone


JST = timezone(timedelta(hours=+9))

dt = datetime(2015, 1, 1, 12, 0, 0, tzinfo=JST)


print(dt)
# 2015-01-01 12:00:00+09:00

print(dt.tzname())
# UTC+09:00

dt = datetime(2015, 1, 1, 12, 0, 0, tzinfo=timezone(timedelta(hours=9), 'JST'))


print(dt.tzname)
# 'JST'

Für Python-Versionen vor 3.2 ist es erforderlich, eine Drittanbieter-Bibliothek wie dateutil .

https://riptutorial.com/de/home 193
dateutilstellt eine äquivalente Klasse, tzoffset , zur tzoffset , die (ab Version 2.5.3) Argumente
der Form dateutil.tz.tzoffset(tzname, offset) , wobei der offset in Sekunden angegeben wird:

Python 3.x 3.2


Python 2.x 2.7

from datetime import datetime, timedelta


from dateutil import tz

JST = tz.tzoffset('JST', 9 * 3600) # 3600 seconds per hour


dt = datetime(2015, 1, 1, 12, 0, tzinfo=JST)
print(dt)
# 2015-01-01 12:00:00+09:00
print(dt.tzname)
# 'JST'

Zonen mit Sommerzeit

Für Zonen mit Sommerzeit stellen Python-Standardbibliotheken keine Standardklasse bereit.


Daher ist die Verwendung einer Drittanbieter-Bibliothek erforderlich. pytz und dateutil sind
beliebte Bibliotheken, die Zeitzonenklassen anbieten.

Neben statischen Zeitzonen bietet dateutil Zeitzonen-Klassen, die Sommerzeit verwenden (siehe
Dokumentation zum tz Modul ). Mit der Methode tz.gettz() Sie ein Zeitzonenobjekt datetime , das
direkt an den datetime Konstruktor übergeben werden kann:

from datetime import datetime


from dateutil import tz
local = tz.gettz() # Local time
PT = tz.gettz('US/Pacific') # Pacific time

dt_l = datetime(2015, 1, 1, 12, tzinfo=local) # I am in EST


dt_pst = datetime(2015, 1, 1, 12, tzinfo=PT)
dt_pdt = datetime(2015, 7, 1, 12, tzinfo=PT) # DST is handled automatically
print(dt_l)
# 2015-01-01 12:00:00-05:00
print(dt_pst)
# 2015-01-01 12:00:00-08:00
print(dt_pdt)
# 2015-07-01 12:00:00-07:00

VORSICHT : Seit Version 2.5.3 verarbeitet dateutil mehrdeutige Datumsangaben nicht korrekt
und verwendet immer das spätere Datum. Es ist nicht möglich, ein Objekt mit einer dateutil
Zeitzone zu dateutil , die beispielsweise 2015-11-01 1:30 EDT-4 , da dies während einer
Sommerzeitumstellung erfolgt.

Bei Verwendung von pytz alle Kantenfälle ordnungsgemäß pytz . pytz Zeitzonen sollten jedoch
nicht direkt durch den Konstruktor an Zeitzonen angehängt werden. Stattdessen sollte eine pytz
Zeitzone mit der localize Methode der Zeitzone angefügt werden:

from datetime import datetime, timedelta


import pytz

https://riptutorial.com/de/home 194
PT = pytz.timezone('US/Pacific')
dt_pst = PT.localize(datetime(2015, 1, 1, 12))
dt_pdt = PT.localize(datetime(2015, 11, 1, 0, 30))
print(dt_pst)
# 2015-01-01 12:00:00-08:00
print(dt_pdt)
# 2015-11-01 00:30:00-07:00

Beachten Sie, dass Sie, wenn Sie eine Datums-Zeit-Arithmetik in einer pytz aware-Zeitzone
durchführen, entweder die Berechnungen in UTC durchführen müssen (wenn Sie absolut
abgelaufene Zeit wünschen) oder das Ergebnis mit normalize() aufrufen:

dt_new = dt_pdt + timedelta(hours=3) # This should be 2:30 AM PST


print(dt_new)
# 2015-11-01 03:30:00-07:00
dt_corrected = PT.normalize(dt_new)
print(dt_corrected)
# 2015-11-01 02:30:00-08:00

Fuzzy-Datetime-Analyse (Extrahieren von Datetime aus einem Text)

Es ist möglich, ein Datum aus einem Text mit dem dateutil Parser in einem "Fuzzy" -Modus zu
extrahieren, wobei Komponenten der Zeichenfolge, die nicht als Teil eines Datums erkannt
werden, ignoriert werden.

from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)


print(dt)

dt ist jetzt ein datetime Objekt, und datetime.datetime(2047, 1, 1, 8, 21) gedruckt.

Zwischen Zeitzonen wechseln

Um zwischen Zeitzonen zu wechseln, benötigen Sie datetime-Objekte, die Zeitzonen


berücksichtigen.

from datetime import datetime


from dateutil import tz

utc = tz.tzutc()
local = tz.tzlocal()

utc_now = datetime.utcnow()
utc_now # Not timezone-aware.

utc_now = utc_now.replace(tzinfo=utc)
utc_now # Timezone-aware.

local_now = utc_now.astimezone(local)
local_now # Converted to local time.

https://riptutorial.com/de/home 195
Parsen eines beliebigen ISO 8601-Zeitstempels mit minimalen Bibliotheken

Python unterstützt die Analyse von Zeitstempeln nach ISO 8601 nur eingeschränkt. Für strptime
Sie genau wissen, in welchem Format es sich befindet. Als Komplikation ist die Stringifizierung
einer datetime ein Zeitstempel nach ISO 8601 mit Leerzeichen als Trennzeichen und 6-stelligem
Bruch:

str(datetime.datetime(2016, 7, 22, 9, 25, 59, 555555))


# '2016-07-22 09:25:59.555555'

Ist der Bruch 0, wird kein Bruchteil ausgegeben

str(datetime.datetime(2016, 7, 22, 9, 25, 59, 0))


# '2016-07-22 09:25:59'

Diese beiden Formulare benötigen jedoch ein anderes Format für die strptime . Darüber hinaus
unterstützt strptime' does not support at all parsing minute timezones that have a Folgendes
enthalten: in it, thus 2016-07-22 09: 25: 59 + 0300 can be parsed, but the standard format 2016-
07-22 09:25:59 +03: 00` kann nicht.

Es gibt eine Einzeldateibibliothek namens iso8601 die nur Zeitstempel von ISO 8601 und nur sie
richtig analysiert.

Es unterstützt Brüche und Zeitzonen und das T Trennzeichen mit einer einzigen Funktion:

import iso8601
iso8601.parse_date('2016-07-22 09:25:59')
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)
iso8601.parse_date('2016-07-22 09:25:59+03:00')
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<FixedOffset '+03:00' ...>)
iso8601.parse_date('2016-07-22 09:25:59Z')
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)
iso8601.parse_date('2016-07-22T09:25:59.000111+03:00')
# datetime.datetime(2016, 7, 22, 9, 25, 59, 111, tzinfo=<FixedOffset '+03:00' ...>)

Wenn keine Zeitzone eingestellt ist, wird der iso8601.parse_date auf UTC gesetzt. Die
Standardzone kann mit default_zone Schlüsselwortargument default_zone geändert werden.
Bemerkenswert ist , wenn dies None anstelle des Standard, dann werden diese Zeitstempel , die
stattdessen als naive Datetimes keine explizite Zeitzone haben werden zurückgegeben:

iso8601.parse_date('2016-07-22T09:25:59', default_timezone=None)
# datetime.datetime(2016, 7, 22, 9, 25, 59)
iso8601.parse_date('2016-07-22T09:25:59Z', default_timezone=None)
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)

Zeitstempel in Datumszeit konvertieren

Das datetime Modul kann einen POSIX- timestamp in ein ITC- datetime Objekt datetime .

Die Epoche ist am 1. Januar 1970 um Mitternacht.

https://riptutorial.com/de/home 196
import time
from datetime import datetime
seconds_since_epoch=time.time() #1469182681.709

utc_date=datetime.utcfromtimestamp(seconds_since_epoch) #datetime.datetime(2016, 7, 22, 10,


18, 1, 709000)

Monate genau von einem Datum abziehen

Verwenden des calendar

import calendar
from datetime import date

def monthdelta(date, delta):


m, y = (date.month+delta) % 12, date.year + ((date.month)+delta-1) // 12
if not m: m = 12
d = min(date.day, calendar.monthrange(y, m)[1])
return date.replace(day=d,month=m, year=y)

next_month = monthdelta(date.today(), 1) #datetime.date(2016, 10, 23)

Verwenden des dateutils Moduls

import datetime
import dateutil.relativedelta

d = datetime.datetime.strptime("2013-03-31", "%Y-%m-%d")
d2 = d - dateutil.relativedelta.relativedelta(months=1) #datetime.datetime(2013, 2, 28, 0, 0)

Zeitunterschiede berechnen

Das timedelta Modul ist nützlich, um Unterschiede zwischen den Zeiten zu berechnen:

from datetime import datetime, timedelta


now = datetime.now()
then = datetime(2016, 5, 23) # datetime.datetime(2016, 05, 23, 0, 0, 0)

Die Angabe der Uhrzeit ist optional, wenn ein neues datetime Objekt erstellt wird

delta = now-then

delta ist vom Typ timedelta

print(delta.days)
# 60
print(delta.seconds)
# 40826

Um einen Tag nach dem Tag und einen Tag vor dem Datum zu erhalten, könnten wir Folgendes
verwenden:

https://riptutorial.com/de/home 197
n Tag nach dem Datum:

def get_n_days_after_date(date_format="%d %B %Y", add_days=120):

date_n_days_after = datetime.datetime.now() + timedelta(days=add_days)


return date_n_days_after.strftime(date_format)

n Tage vor dem Datum:

def get_n_days_before_date(self, date_format="%d %B %Y", days_before=120):

date_n_days_ago = datetime.datetime.now() - timedelta(days=days_before)


return date_n_days_ago.strftime(date_format)

Erhalten Sie einen Zeitstempel nach ISO 8601

Ohne Zeitzone mit Mikrosekunden


from datetime import datetime

datetime.now().isoformat()
# Out: '2016-07-31T23:08:20.886783'

Mit Zeitzone, mit Mikrosekunden


from datetime import datetime
from dateutil.tz import tzlocal

datetime.now(tzlocal()).isoformat()
# Out: '2016-07-31T23:09:43.535074-07:00'

Mit Zeitzone, ohne Mikrosekunden


from datetime import datetime
from dateutil.tz import tzlocal

datetime.now(tzlocal()).replace(microsecond=0).isoformat()
# Out: '2016-07-31T23:10:30-07:00'

Siehe ISO 8601 für weitere Informationen über die ISO 8601 - Format.

Datum und Uhrzeit online lesen: https://riptutorial.com/de/python/topic/484/datum-und-uhrzeit

https://riptutorial.com/de/home 198
Kapitel 41: Datumsformatierung
Examples
Zeit zwischen zwei Datumszeiten

from datetime import datetime

a = datetime(2016,10,06,0,0,0)
b = datetime(2016,10,01,23,59,59)

a-b
# datetime.timedelta(4, 1)

(a-b).days
# 4
(a-b).total_seconds()
# 518399.0

Zeichenfolge in ein datetime-Objekt analysieren

Verwendet C - Standard - Format - Codes .

from datetime import datetime


datetime_string = 'Oct 1 2016, 00:00:00'
datetime_string_format = '%b %d %Y, %H:%M:%S'
datetime.strptime(datetime_string, datetime_string_format)
# datetime.datetime(2016, 10, 1, 0, 0)

Ausgeben des datetime-Objekts in eine Zeichenfolge

Verwendet C - Standard - Format - Codes .

from datetime import datetime


datetime_for_string = datetime(2016,10,1,0,0)
datetime_string_format = '%b %d %Y, %H:%M:%S'
datetime.strftime(datetime_for_string,datetime_string_format)
# Oct 01 2016, 00:00:00

Datumsformatierung online lesen: https://riptutorial.com/de/python/topic/7284/datumsformatierung

https://riptutorial.com/de/home 199
Kapitel 42: Debuggen
Examples
Der Python-Debugger: Schrittweises Debuggen mit _pdb_

Die Python Standard Library enthält eine interaktive Debugging-Bibliothek namens pdb . pdb
verfügt über umfangreiche Funktionen, wobei die am häufigsten verwendete Möglichkeit ist, ein
Programm schrittweise durchzugehen .

Um sofort mit dem schrittweisen Debugging zu beginnen, verwenden Sie Folgendes:

python -m pdb <my_file.py>

Dadurch wird der Debugger in der ersten Zeile des Programms gestartet.

Normalerweise möchten Sie einen bestimmten Abschnitt des Codes für das Debugging
verwenden. Dazu importieren wir die pdb-Bibliothek und unterbrechen mit set_trace () den Fluss
dieses problematischen Beispielcodes.

import pdb

def divide(a, b):


pdb.set_trace()
return a/b
# What's wrong with this? Hint: 2 != 3

print divide(1, 2)

Wenn Sie dieses Programm ausführen, wird der interaktive Debugger gestartet.

python foo.py
> ~/scratch/foo.py(5)divide()
-> return a/b
(Pdb)

Häufig wird dieser Befehl in einer Zeile verwendet, sodass er mit einem einzelnen # -Zeichen
auskommentiert werden kann

import pdf; pdb.set_trace()

Bei der Eingabeaufforderung (Pdb) können Befehle eingegeben werden. Diese Befehle können
Debugger-Befehle oder Python sein. Um Variablen zu drucken, können wir p aus dem Debugger
oder den Python- Druck verwenden .

(Pdb) p a
1
(Pdb) print a

https://riptutorial.com/de/home 200
1

Um eine Liste aller lokalen Variablen anzuzeigen, verwenden Sie

locals

eingebaute Funktion

Dies sind gute Debugger-Befehle, die Sie kennen sollten:

b <n> | <f>: set breakpoint at line *n* or function named *f*.


# b 3
# b divide
b: show all breakpoints.
c: continue until the next breakpoint.
s: step through this line (will enter a function).
n: step over this line (jumps over a function).
r: continue until the current function returns.
l: list a window of code around this line.
p <var>: print variable named *var*.
# p x
q: quit debugger.
bt: print the traceback of the current execution call stack
up: move your scope up the function call stack to the caller of the current function
down: Move your scope back down the function call stack one level
step: Run the program until the next line of execution in the program, then return control
back to the debugger
next: run the program until the next line of execution in the current function, then return
control back to the debugger
return: run the program until the current function returns, then return control back to the
debugger
continue: continue running the program until the next breakpoint (or set_trace si called
again)

Der Debugger kann Python auch interaktiv auswerten:

-> return a/b


(Pdb) p a+b
3
(Pdb) [ str(m) for m in [a,b]]
['1', '2']
(Pdb) [ d for d in xrange(5)]
[0, 1, 2, 3, 4]

Hinweis:

Wenn einer Ihrer Variablennamen mit den Debugger-Befehlen übereinstimmt, verwenden Sie ein
Ausrufezeichen ' ! 'vor dem var, um explizit auf die Variable und nicht auf den Debuggerbefehl zu
verweisen. Beispielsweise kann es oft vorkommen, dass Sie den Variablennamen ' c ' für einen
Zähler verwenden und Sie ihn möglicherweise im Debugger drucken möchten. Ein einfacher ' c' -
Befehl würde die Ausführung bis zum nächsten Haltepunkt fortsetzen. Verwenden Sie stattdessen
' ! C ', um den Wert der Variablen wie folgt zu drucken:

(Pdb) !c

https://riptutorial.com/de/home 201
4

Über IPython und ipdb

Wenn IPython (oder Jupyter ) installiert ist, kann der Debugger folgendermaßen aufgerufen
werden:

import ipdb
ipdb.set_trace()

Bei Erreichen wird der Code beendet und gedruckt:

/home/usr/ook.py(3)<module>()
1 import ipdb
2 ipdb.set_trace()
----> 3 print("Hello world!")

ipdb>

Das bedeutet natürlich, dass man den Code bearbeiten muss. Es gibt einen einfacheren Weg:

from IPython.core import ultratb


sys.excepthook = ultratb.FormattedTB(mode='Verbose',
color_scheme='Linux',
call_pdb=1)

Dies bewirkt, dass der Debugger aufgerufen wird, wenn eine nicht erfasste Ausnahme ausgelöst
wird.

Remote-Debugger

rpdbmüssen Sie Python-Code debuggen, der von einem anderen Prozess ausgeführt wird. In
diesem Fall ist rpdb .

rpdb ist ein Wrapper um pdb, der stdin und stdout zu einem Socket-Handler umleitet.
Standardmäßig wird der Debugger an Port 4444 geöffnet

Verwendungszweck:

# In the Python file you want to debug.


import rpdb
rpdb.set_trace()

Und dann müssen Sie dies im Terminal ausführen, um eine Verbindung zu diesem Prozess
herzustellen.

# Call in a terminal to see the output


$ nc 127.0.0.1 4444

Und du wirst pdb Promt bekommen

https://riptutorial.com/de/home 202
> /home/usr/ook.py(3)<module>()
-> print("Hello world!")
(Pdb)

Debuggen online lesen: https://riptutorial.com/de/python/topic/2077/debuggen

https://riptutorial.com/de/home 203
Kapitel 43: Dekorateure
Einführung
Decorator-Funktionen sind Software-Designmuster. Sie ändern die Funktionalität einer Funktion,
Methode oder Klasse dynamisch, ohne dass Sie Unterklassen direkt verwenden oder den
Quellcode der dekorierten Funktion ändern müssen. Bei richtiger Anwendung können Dekorateure
zu mächtigen Werkzeugen im Entwicklungsprozess werden. Dieses Thema behandelt die
Implementierung und Anwendung von Decorator-Funktionen in Python.

Syntax
• def decorator_function (f): pass # definiert einen Dekorateur mit dem Namen
decorator_function

• @decorator_function
def decor_function (): pass # Die Funktion ist jetzt mit decorator_function umschlossen
(dekoriert mit)

• = decorator_function ( @decorator_function ) # Dies entspricht der


@decorator_function
Verwendung der syntaktischen Zucker @decorator_function

Parameter

Parameter Einzelheiten

f Die zu dekorierende Funktion (verpackt)

Examples
Dekorateurfunktion

Dekorateure verbessern das Verhalten anderer Funktionen oder Methoden. Jede Funktion, die
eine Funktion als Parameter übernimmt und eine erweiterte Funktion zurückgibt, kann als
Dekorator verwendet werden .

# This simplest decorator does nothing to the function being decorated. Such
# minimal decorators can occasionally be used as a kind of code markers.
def super_secret_function(f):
return f

@super_secret_function
def my_function():
print("This is my secret function.")

https://riptutorial.com/de/home 204
Die @ -Notation ist ein syntaktischer Zucker, der dem folgenden entspricht:

my_function = super_secret_function(my_function)

Es ist wichtig, dies zu beachten, um zu verstehen, wie die Dekorateure arbeiten. Diese
"ungezugte" Syntax macht deutlich, warum die Decorator-Funktion eine Funktion als Argument
verwendet und warum sie eine andere Funktion zurückgeben soll. Es zeigt auch, was passiert,
wenn Sie keine Funktion zurückgeben:

def disabled(f):
"""
This function returns nothing, and hence removes the decorated function
from the local scope.
"""
pass

@disabled
def my_function():
print("This function can no longer be called...")

my_function()
# TypeError: 'NoneType' object is not callable

Daher definieren wir normalerweise eine neue Funktion im Dekorateur und geben sie zurück.
Diese neue Funktion würde zuerst etwas tun, was sie tun muss, dann die ursprüngliche Funktion
aufrufen und schließlich den Rückgabewert verarbeiten. Betrachten Sie diese einfache
Dekorationsfunktion, die die Argumente druckt, die die ursprüngliche Funktion empfängt, und sie
dann aufruft.

#This is the decorator


def print_args(func):
def inner_func(*args, **kwargs):
print(args)
print(kwargs)
return func(*args, **kwargs) #Call the original function with its arguments.
return inner_func

@print_args
def multiply(num_a, num_b):
return num_a * num_b

print(multiply(3, 5))
#Output:
# (3,5) - This is actually the 'args' that the function receives.
# {} - This is the 'kwargs', empty because we didn't specify keyword arguments.
# 15 - The result of the function.

Dekorateur Klasse

Wie in der Einleitung erwähnt, ist ein Dekorateur eine Funktion, die auf eine andere Funktion
angewendet werden kann, um ihr Verhalten zu verbessern. Der syntaktische Zucker entspricht
dem Folgenden: my_func = decorator(my_func) . Aber was wäre, wenn der decorator stattdessen
eine Klasse wäre? Die Syntax würde weiterhin funktionieren, mit der Ausnahme, dass my_func jetzt

https://riptutorial.com/de/home 205
durch eine Instanz der decorator Klasse ersetzt wird. Wenn diese Klasse die magische Methode
__call__() implementiert, ist es weiterhin möglich, my_func als Funktion zu verwenden:

class Decorator(object):
"""Simple decorator class."""

def __init__(self, func):


self.func = func

def __call__(self, *args, **kwargs):


print('Before the function call.')
res = self.func(*args, **kwargs)
print('After the function call.')
return res

@Decorator
def testfunc():
print('Inside the function.')

testfunc()
# Before the function call.
# Inside the function.
# After the function call.

Beachten Sie, dass eine mit einem Klassendekorateur dekorierte Funktion aus Sicht der
Typenprüfung nicht mehr als "Funktion" betrachtet wird:

import types
isinstance(testfunc, types.FunctionType)
# False
type(testfunc)
# <class '__main__.Decorator'>

Dekorationsmethoden
Für Dekorationsmethoden müssen Sie eine zusätzliche __get__ Methode definieren:

from types import MethodType

class Decorator(object):
def __init__(self, func):
self.func = func

def __call__(self, *args, **kwargs):


print('Inside the decorator.')
return self.func(*args, **kwargs)

def __get__(self, instance, cls):


# Return a Method if it is called on an instance
return self if instance is None else MethodType(self, instance)

class Test(object):
@Decorator
def __init__(self):
pass

https://riptutorial.com/de/home 206
a = Test()

Im Dekorateur.

Warnung!
Klassendekorateure erzeugen nur eine Instanz für eine bestimmte Funktion, so dass das
Dekorieren einer Methode mit einem Klassendekorateur denselben Dekorator für alle Instanzen
dieser Klasse verwendet:

from types import MethodType

class CountCallsDecorator(object):
def __init__(self, func):
self.func = func
self.ncalls = 0 # Number of calls of this method

def __call__(self, *args, **kwargs):


self.ncalls += 1 # Increment the calls counter
return self.func(*args, **kwargs)

def __get__(self, instance, cls):


return self if instance is None else MethodType(self, instance)

class Test(object):
def __init__(self):
pass

@CountCallsDecorator
def do_something(self):
return 'something was done'

a = Test()
a.do_something()
a.do_something.ncalls # 1
b = Test()
b.do_something()
b.do_something.ncalls # 2

Einen Dekorateur wie eine dekorierte Funktion aussehen lassen

Dekorateure entfernen normalerweise Funktionsmetadaten, da sie nicht gleich sind. Dies kann zu
Problemen führen, wenn Meta-Programme für den dynamischen Zugriff auf Funktionsmetadaten
verwendet werden. Metadaten enthalten auch die Dokumentzeichenfolgen und den Namen der
Funktion. functools.wraps lässt die dekorierte Funktion wie die ursprüngliche Funktion aussehen,
indem sie mehrere Attribute in die Wrapper-Funktion kopiert.

from functools import wraps

Die beiden Methoden zum Umwickeln eines Dekorateurs erreichen beim Verbergen der
ursprünglichen Funktion dasselbe. Es gibt keinen Grund, die Funktionsversion der Klassenversion

https://riptutorial.com/de/home 207
vorzuziehen, es sei denn, Sie verwenden bereits eine Version über der anderen.

Als eine Funktion


def decorator(func):
# Copies the docstring, name, annotations and module to the decorator
@wraps(func)
def wrapped_func(*args, **kwargs):
return func(*args, **kwargs)
return wrapped_func

@decorator
def test():
pass

test.__name__

'Prüfung'

Als eine Klasse


class Decorator(object):
def __init__(self, func):
# Copies name, module, annotations and docstring to the instance.
self._wrapped = wraps(func)(self)

def __call__(self, *args, **kwargs):


return self._wrapped(*args, **kwargs)

@Decorator
def test():
"""Docstring of test."""
pass

test.__doc__

"Docstring des Tests."

Dekorateur mit Argumenten (Dekorateurfabrik)

Ein Dekorateur hat nur ein Argument: die zu dekorierende Funktion. Es gibt keine Möglichkeit,
andere Argumente zu übergeben.

Zusätzliche Argumente sind jedoch oft erwünscht. Der Trick besteht darin, eine Funktion zu
erstellen, die willkürliche Argumente verwendet und einen Dekorator zurückgibt.

Dekorateurfunktionen

https://riptutorial.com/de/home 208
def decoratorfactory(message):
def decorator(func):
def wrapped_func(*args, **kwargs):
print('The decorator wants to tell you: {}'.format(message))
return func(*args, **kwargs)
return wrapped_func
return decorator

@decoratorfactory('Hello World')
def test():
pass

test()

Der Dekorateur möchte Ihnen sagen: Hallo Welt

Wichtige Notiz:
Bei solchen Dekorateurfabriken müssen Sie den Dekorateur mit einem Paar Klammern anrufen:

@decoratorfactory # Without parentheses


def test():
pass

test()

TypeError: decorator () fehlt 1 erforderliches Positionsargument: 'func'

Dekorateur Klassen
def decoratorfactory(*decorator_args, **decorator_kwargs):

class Decorator(object):
def __init__(self, func):
self.func = func

def __call__(self, *args, **kwargs):


print('Inside the decorator with arguments {}'.format(decorator_args))
return self.func(*args, **kwargs)

return Decorator

@decoratorfactory(10)
def test():
pass

test()

Im Dekorateur mit Argumenten (10,)

Erstellen Sie eine Einzelklasse mit einem Dekorateur

https://riptutorial.com/de/home 209
Ein Singleton ist ein Muster, das die Instantiierung einer Klasse auf eine Instanz / ein Objekt
beschränkt. Mit einem Dekorator können wir eine Klasse als Singleton definieren, indem die
Klasse gezwungen wird, entweder eine vorhandene Instanz der Klasse zurückzugeben oder eine
neue Instanz zu erstellen (falls diese nicht existiert).

def singleton(cls):
instance = [None]
def wrapper(*args, **kwargs):
if instance[0] is None:
instance[0] = cls(*args, **kwargs)
return instance[0]

return wrapper

Dieser Dekorator kann zu jeder Klassendeklaration hinzugefügt werden und stellt sicher, dass
höchstens eine Instanz der Klasse erstellt wird. Alle nachfolgenden Aufrufe geben die bereits
vorhandene Klasseninstanz zurück.

@singleton
class SomeSingletonClass:
x = 2
def __init__(self):
print("Created!")

instance = SomeSingletonClass() # prints: Created!


instance = SomeSingletonClass() # doesn't print anything
print(instance.x) # 2

instance.x = 3
print(SomeSingletonClass().x) # 3

Es ist also egal, ob Sie über Ihre lokale Variable auf die Klasseninstanz verweisen oder eine
andere "Instanz" erstellen, Sie erhalten immer dasselbe Objekt.

Verwenden eines Dekorators, um eine Funktion festzulegen

import time
def timer(func):
def inner(*args, **kwargs):
t1 = time.time()
f = func(*args, **kwargs)
t2 = time.time()
print 'Runtime took {0} seconds'.format(t2-t1)
return f
return inner

@timer
def example_function():
#do stuff

example_function()

Dekorateure online lesen: https://riptutorial.com/de/python/topic/229/dekorateure

https://riptutorial.com/de/home 210
Kapitel 44: Deque-Modul
Syntax
• dq = deque () # Erzeugt ein leeres Deque
• dq = deque (iterable) # Erzeugt einen Deque mit einigen Elementen
• dq.append (object) # Fügt ein Objekt rechts von der Deque hinzu
• dq.appendleft (object) # Fügt ein Objekt links vom Deque hinzu
• dq.pop () -> object # Entfernt das Objekt ganz rechts und gibt es zurück
• dq.popleft () -> object # Entfernt das linke Objekt und gibt es zurück
• dq.extend (iterable) # Fügt einige Elemente rechts vom Deque hinzu
• dq.extendleft (iterable) # Fügt einige Elemente links vom Deque hinzu

Parameter

Parameter Einzelheiten

Erzeugt den Deque mit ursprünglichen Elementen, die von einem anderen
iterable
iterierbaren Element kopiert wurden.

Begrenzt, wie groß der Deque sein kann, wobei alte Elemente als neue
maxlen
ausgegeben werden.

Bemerkungen
Diese Klasse ist nützlich, wenn Sie ein Objekt benötigen, das einer Liste ähnelt, die schnelle
Anhänge- und Popoperationen von beiden Seiten zulässt (der Name deque steht für " double-
ended queue ").

Die zur Verfügung gestellten Methoden sind in der Tat sehr ähnlich, mit der Ausnahme, dass
einige wie pop , append oder extend mit left . Die deque Datenstruktur sollte einer Liste vorgezogen
werden, wenn Elemente an beiden Enden häufig eingefügt und gelöscht werden müssen, da dies
zu einer konstanten Zeit O (1) möglich ist.

Examples
Basic Deque mit

Die wichtigsten Methoden, die für diese Klasse nützlich sind, sind popleft und appendleft

from collections import deque

d = deque([1, 2, 3])
p = d.popleft() # p = 1, d = deque([2, 3])

https://riptutorial.com/de/home 211
d.appendleft(5) # d = deque([5, 2, 3])

Begrenzung der Deque-Größe

Verwenden Sie den Parameter maxlen , während Sie eine Deque erstellen, um die Größe der
Deque zu begrenzen:

from collections import deque


d = deque(maxlen=3) # only holds 3 items
d.append(1) # deque([1])
d.append(2) # deque([1, 2])
d.append(3) # deque([1, 2, 3])
d.append(4) # deque([2, 3, 4]) (1 is removed because its maxlen is 3)

Verfügbare Methoden in deque

Leeren deque erstellen:

dl = deque() # deque([]) creating empty deque

Erstellen von Deque mit einigen Elementen:

dl = deque([1, 2, 3, 4]) # deque([1, 2, 3, 4])

Element zu deque hinzufügen:

dl.append(5) # deque([1, 2, 3, 4, 5])

Element links von deque hinzufügen:

dl.appendleft(0) # deque([0, 1, 2, 3, 4, 5])

Liste der Elemente zu deque hinzufügen:

dl.extend([6, 7]) # deque([0, 1, 2, 3, 4, 5, 6, 7])

Hinzufügen einer Liste von Elementen von links:

dl.extendleft([-2, -1]) # deque([-1, -2, 0, 1, 2, 3, 4, 5, 6, 7])

Mit dem Element .pop() wird ein Element auf der rechten Seite entfernt:

dl.pop() # 7 => deque([-1, -2, 0, 1, 2, 3, 4, 5, 6])

Verwenden .popleft() Elements .popleft() zum Entfernen eines Elements von der linken Seite:

dl.popleft() # -1 deque([-2, 0, 1, 2, 3, 4, 5, 6])

https://riptutorial.com/de/home 212
Element nach seinem Wert entfernen:

dl.remove(1) # deque([-2, 0, 2, 3, 4, 5, 6])

Kehren Sie die Reihenfolge der Elemente in deque um:

dl.reverse() # deque([6, 5, 4, 3, 2, 0, -2])

Breite erste Suche

Der Deque ist die einzige Python-Datenstruktur mit schnellen Warteschlangenoperationen .


(Hinweis queue.Queue ist normalerweise nicht geeignet, da sie für die Kommunikation zwischen
Threads queue.Queue ist.) Ein grundlegender Anwendungsfall einer Queue ist die erste Suche in
der Breite .

from collections import deque

def bfs(graph, root):


distances = {}
distances[root] = 0
q = deque([root])
while q:
# The oldest seen (but not yet visited) node will be the left most one.
current = q.popleft()
for neighbor in graph[current]:
if neighbor not in distances:
distances[neighbor] = distances[current] + 1
# When we see a new node, we add it to the right side of the queue.
q.append(neighbor)
return distances

Angenommen, wir haben eine einfache gerichtete Grafik:

graph = {1:[2,3], 2:[4], 3:[4,5], 4:[3,5], 5:[]}

Wir können nun die Entfernungen von einer Startposition aus finden:

>>> bfs(graph, 1)
{1: 0, 2: 1, 3: 1, 4: 2, 5: 2}

>>> bfs(graph, 3)
{3: 0, 4: 1, 5: 1}

Deque-Modul online lesen: https://riptutorial.com/de/python/topic/1976/deque-modul

https://riptutorial.com/de/home 213
Kapitel 45: Der Dolmetscher
(Befehlszeilenkonsole)
Examples
Allgemeine Hilfe anfordern

Wenn die help in der Konsole ohne Argumente aufgerufen wird, bietet Python eine interaktive
Hilfskonsole, in der Sie Informationen zu Python-Modulen, Symbolen, Schlüsselwörtern usw.
erhalten.

>>> help()

Welcome to Python 3.4's help utility!

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/3.4/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type


"modules", "keywords", "symbols", or "topics". Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".

Bezugnehmend auf den letzten Ausdruck

Verwenden Sie einen Unterstrich _ um den Wert des letzten Ergebnisses aus Ihrem letzten
Ausdruck in der Konsole zu erhalten.

>>> 2 + 2
4
>>> _
4
>>> _ + 6
10

Dieser magische Unterstrichwert wird nur aktualisiert, wenn ein Python-Ausdruck verwendet wird,
der einen Wert ergibt. Das Definieren von Funktionen oder für Schleifen ändert den Wert nicht.
Wenn der Ausdruck eine Ausnahme auslöst, werden keine Änderungen an _ .

>>> "Hello, {0}".format("World")


'Hello, World'
>>> _
'Hello, World'
>>> def wontchangethings():
... pass

https://riptutorial.com/de/home 214
>>> _
'Hello, World'
>>> 27 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> _
'Hello, World'

Denken Sie daran, dass diese magische Variable nur im interaktiven Python-Interpreter verfügbar
ist. Das Ausführen von Skripts führt dies nicht aus.

Öffnen der Python-Konsole

Die Konsole für die Hauptversion von Python kann normalerweise geöffnet werden, indem Sie in
Ihre Windows-Konsole py oder auf anderen Plattformen python eingeben.

$ py
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

Wenn Sie über mehrere Versionen verfügen, werden ihre ausführbaren Dateien standardmäßig
python2 bzw. python3 .

Dies hängt natürlich von den ausführbaren Python-Dateien in PATH ab.

Die PYTHONSTARTUP-Variable

Sie können eine Umgebungsvariable namens PYTHONSTARTUP für die Python-Konsole


festlegen. Wenn Sie die Python-Konsole aufrufen, wird diese Datei ausgeführt, sodass Sie der
Konsole zusätzliche Funktionen hinzufügen können, z.

Wenn die PYTHONSTARTUP-Variable auf den Speicherort einer Datei gesetzt wurde, die
Folgendes enthält:

print("Welcome!")

Das Öffnen der Python-Konsole würde dann zu dieser zusätzlichen Ausgabe führen:

$ py
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Welcome!
>>>

Kommandozeilenargumente

Python verfügt über verschiedene Befehlszeilenschalter, die an py . Diese können durch


Ausführen von py --help , die diese Ausgabe auf Python 3.4 liefert:

https://riptutorial.com/de/home 215
Python Launcher

usage: py [ launcher-arguments ] [ python-arguments ] script [ script-arguments ]

Launcher arguments:

-2 : Launch the latest Python 2.x version


-3 : Launch the latest Python 3.x version
-X.Y : Launch the specified Python version
-X.Y-32: Launch the specified 32bit Python version

The following help text is from Python:

usage: G:\Python34\python.exe [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-b : issue warnings about str(bytes_instance), str(bytearray_instance)
and comparing bytes/bytearray with str. (-bb: issue errors)
-B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x
-c cmd : program passed in as string (terminates option list)
-d : debug output from parser; also PYTHONDEBUG=x
-E : ignore PYTHON* environment variables (such as PYTHONPATH)
-h : print this help message and exit (also --help)
-i : inspect interactively after running script; forces a prompt even
if stdin does not appear to be a terminal; also PYTHONINSPECT=x
-I : isolate Python from the user's environment (implies -E and -s)
-m mod : run library module as a script (terminates option list)
-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x
-OO : remove doc-strings in addition to the -O optimizations
-q : don't print version and copyright messages on interactive startup
-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE
-S : don't imply 'import site' on initialization
-u : unbuffered binary stdout and stderr, stdin always buffered;
also PYTHONUNBUFFERED=x
see man page for details on internal buffering relating to '-u'
-v : verbose (trace import statements); also PYTHONVERBOSE=x
can be supplied multiple times to increase verbosity
-V : print the Python version number and exit (also --version)
-W arg : warning control; arg is action:message:category:module:lineno
also PYTHONWARNINGS=arg
-x : skip first line of source, allowing use of non-Unix forms of #!cmd
-X opt : set implementation-specific option
file : program read from script file
- : program read from stdin (default; interactive mode if a tty)
arg ...: arguments passed to program in sys.argv[1:]

Other environment variables:


PYTHONSTARTUP: file executed on interactive startup (no default)
PYTHONPATH : ';'-separated list of directories prefixed to the
default module search path. The result is sys.path.
PYTHONHOME : alternate <prefix> directory (or <prefix>;<exec_prefix>).
The default module search path uses <prefix>\lib.
PYTHONCASEOK : ignore case in 'import' statements (Windows).
PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.
PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.
PYTHONHASHSEED: if this variable is set to 'random', a random value is used
to seed the hashes of str, bytes and datetime objects. It can also be
set to an integer in the range [0,4294967295] to get hash values with a
predictable seed.

Hilfe zu einem Objekt erhalten

https://riptutorial.com/de/home 216
Die Python-Konsole fügt eine neue Funktion hinzu, help , mit der Informationen zu einer Funktion
oder einem Objekt abgerufen werden können.

Bei einer Funktion druckt help seine Signatur (Argumente) und seinen Docstring, falls die Funktion
eine hat.

>>> help(print)
Help on built-in function print in module builtins:

print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

Prints the values to a stream, or to sys.stdout by default.


Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.

Für ein Objekt listet help die Dokumentzeichenfolge des Objekts und die verschiedenen
Elementfunktionen auf, die das Objekt hat.

>>> x = 2
>>> help(x)
Help on int object:

class int(object)
| int(x=0) -> integer
| int(x, base=10) -> integer
|
| Convert a number or string to an integer, or return 0 if no arguments
| are given. If x is a number, return x.__int__(). For floating point
| numbers, this truncates towards zero.
|
| If x is not a number or if base is given, then x must be a string,
| bytes, or bytearray instance representing an integer literal in the
| given base. The literal can be preceded by '+' or '-' and be surrounded
| by whitespace. The base defaults to 10. Valid bases are 0 and 2-36.
| Base 0 means to interpret the base from the string as an integer literal.
| >>> int('0b100', base=0)
| 4
|
| Methods defined here:
|
| __abs__(self, /)
| abs(self)
|
| __add__(self, value, /)
| Return self+value...

Der Dolmetscher (Befehlszeilenkonsole) online lesen:


https://riptutorial.com/de/python/topic/2473/der-dolmetscher--befehlszeilenkonsole-

https://riptutorial.com/de/home 217
Kapitel 46: Designmuster
Einführung
Ein Entwurfsmuster ist eine allgemeine Lösung für ein häufig auftretendes Problem in der
Softwareentwicklung. In diesem Dokumentationsthema werden Beispiele für gängige
Entwurfsmuster in Python beschrieben.

Examples
Strategiemuster

Dieses Entwurfsmuster wird Strategiemuster genannt. Es wird verwendet, um eine Familie von
Algorithmen zu definieren, jeden zu kapseln und austauschbar zu machen. Das
Strategieentwurfsmuster lässt einen Algorithmus unabhängig von den Kunden variieren, die ihn
verwenden.

Zum Beispiel können Tiere auf viele verschiedene Arten "laufen". Gehen kann als eine Strategie
betrachtet werden, die von verschiedenen Tierarten umgesetzt wird:

from types import MethodType

class Animal(object):

def __init__(self, *args, **kwargs):


self.name = kwargs.pop('name', None) or 'Animal'
if kwargs.get('walk', None):
self.walk = MethodType(kwargs.pop('walk'), self)

def walk(self):
"""
Cause animal instance to walk

Walking funcionallity is a strategy, and is intended to


be implemented separately by different types of animals.
"""
message = '{} should implement a walk method'.format(
self.__class__.__name__)
raise NotImplementedError(message)

# Here are some different walking algorithms that can be used with Animal
def snake_walk(self):
print('I am slithering side to side because I am a {}.'.format(self.name))

def four_legged_animal_walk(self):
print('I am using all four of my legs to walk because I am a(n) {}.'.format(
self.name))

def two_legged_animal_walk(self):
print('I am standing up on my two legs to walk because I am a {}.'.format(

https://riptutorial.com/de/home 218
self.name))

Das Ausführen dieses Beispiels würde die folgende Ausgabe erzeugen:

generic_animal = Animal()
king_cobra = Animal(name='King Cobra', walk=snake_walk)
elephant = Animal(name='Elephant', walk=four_legged_animal_walk)
kangaroo = Animal(name='Kangaroo', walk=two_legged_animal_walk)

kangaroo.walk()
elephant.walk()
king_cobra.walk()
# This one will Raise a NotImplementedError to let the programmer
# know that the walk method is intended to be used as a strategy.
generic_animal.walk()

# OUTPUT:
#
# I am standing up on my two legs to walk because I am a Kangaroo.
# I am using all four of my legs to walk because I am a(n) Elephant.
# I am slithering side to side because I am a King Cobra.
# Traceback (most recent call last):
# File "./strategy.py", line 56, in <module>
# generic_animal.walk()
# File "./strategy.py", line 30, in walk
# raise NotImplementedError(message)
# NotImplementedError: Animal should implement a walk method

Beachten Sie, dass in Sprachen wie C ++ oder Java dieses Muster mithilfe einer abstrakten
Klasse oder einer Schnittstelle implementiert wird, um eine Strategie zu definieren. In Python ist
es sinnvoller, nur einige Funktionen extern zu definieren, die mithilfe von types.MethodType
dynamisch zu einer Klasse types.MethodType .

Einführung in Design Patterns und Singleton Pattern

Design Patterns bieten Lösungen für commonly occurring problems beim Softwaredesign. Die
Entwurfsmuster wurden zuerst von GoF(Gang of Four) in dem sie die häufig vorkommenden Muster
als Probleme beschrieben, die immer wieder auftreten, und Lösungen für diese Probleme.

Designmuster haben vier wesentliche Elemente:

1. The pattern name ist ein Handle, mit dem wir ein Designproblem, seine Lösungen und
Konsequenzen in ein oder zwei Worten beschreiben können.
2. The problem beschreibt, wann das Muster angewendet wird.
3. The solution beschreibt die Elemente, aus denen das Design besteht, sowie deren
Beziehungen, Verantwortlichkeiten und Kollaborationen.
4. The consequences sind die Ergebnisse und Kompromisse bei der Anwendung des Musters.

Vorteile von Design Patterns:

1. Sie können in mehreren Projekten wiederverwendet werden.


2. Die architektonische Ebene der Probleme kann gelöst werden
3. Sie sind langjährig erprobt und bewährt. Dies ist die Erfahrung von Entwicklern und

https://riptutorial.com/de/home 219
Architekten
4. Sie haben Zuverlässigkeit und Abhängigkeit

Entwurfsmuster können in drei Kategorien unterteilt werden:

1. Kreationelles Muster
2. Strukturelles Muster
3. Verhaltensmuster

Creational Pattern - Sie befassen sich mit der Erstellung des Objekts und isolieren die Details der
Objekterstellung.

- Sie gestalten die Struktur von Klassen und Objekten so, dass sie
Structural Pattern
komponieren können, um größere Ergebnisse zu erzielen.

- Sie befassen sich mit der Interaktion zwischen Objekten und der
Behavioral Pattern
Verantwortung von Objekten.

Singleton-Muster :

Es handelt sich um eine Art creational pattern , das einen Mechanismus bereitstellt, um nur ein
und ein Objekt eines bestimmten Typs zu haben und einen globalen Zugangspunkt
bereitzustellen.

Zum Beispiel kann Singleton in Datenbankoperationen verwendet werden, bei denen


Datenbankobjekte die Datenkonsistenz beibehalten sollen.

Implementierung

Wir können Singleton Pattern in Python implementieren, indem Sie nur eine Instanz der Singleton-
Klasse erstellen und dasselbe Objekt erneut bedienen.

class Singleton(object):
def __new__(cls):
# hasattr method checks if the class object an instance property or not.
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance

s = Singleton()
print ("Object created", s)

s1 = Singleton()
print ("Object2 created", s1)

Ausgabe:

('Object created', <__main__.Singleton object at 0x10a7cc310>)


('Object2 created', <__main__.Singleton object at 0x10a7cc310>)

Beachten Sie, dass dieses Muster in Sprachen wie C ++ oder Java implementiert wird, indem Sie
den Konstruktor privat machen und eine statische Methode erstellen, die die Objektinitialisierung

https://riptutorial.com/de/home 220
durchführt. Auf diese Weise wird beim ersten Aufruf ein Objekt erstellt, und die Klasse gibt danach
dasselbe Objekt zurück. In Python haben wir jedoch keine Möglichkeit, private Konstruktoren zu
erstellen.

Fabrikmuster

Das Fabrikmuster ist auch ein Creational pattern . Der Begriff factory bedeutet, dass eine Klasse
für das Erstellen von Objekten anderer Typen verantwortlich ist. Es gibt eine Klasse, die als
Factory fungiert und mit Objekten und Methoden verknüpft ist. Der Client erstellt ein Objekt durch
Aufrufen der Methoden mit bestimmten Parametern. Factory erstellt das Objekt des gewünschten
Typs und gibt es an den Client zurück.

from abc import ABCMeta, abstractmethod

class Music():
__metaclass__ = ABCMeta
@abstractmethod
def do_play(self):
pass

class Mp3(Music):
def do_play(self):
print ("Playing .mp3 music!")

class Ogg(Music):
def do_play(self):
print ("Playing .ogg music!")

class MusicFactory(object):
def play_sound(self, object_type):
return eval(object_type)().do_play()

if __name__ == "__main__":
mf = MusicFactory()
music = input("Which music you want to play Mp3 or Ogg")
mf.play_sound(music)

Ausgabe:

Which music you want to play Mp3 or Ogg"Ogg"


Playing .ogg music!

MusicFactoryist hier die Factory-Klasse, die je nach Wahl des Benutzers entweder ein Objekt vom
Typ Mp3 oder Ogg .

Proxy

Proxy-Objekte werden häufig verwendet, um den geschützten Zugriff auf ein anderes Objekt
sicherzustellen. Diese interne Geschäftslogik möchten wir nicht mit Sicherheitsanforderungen
belasten.

Angenommen, wir möchten garantieren, dass nur Benutzer bestimmter Berechtigungen auf die
Ressource zugreifen können.

https://riptutorial.com/de/home 221
Proxy-Definition: (Es wird sichergestellt, dass nur Benutzer, die tatsächlich Reservierungen sehen
können, denesen reservation_service verwenden können.)

from datetime import date


from operator import attrgetter

class Proxy:
def __init__(self, current_user, reservation_service):
self.current_user = current_user
self.reservation_service = reservation_service

def highest_total_price_reservations(self, date_from, date_to, reservations_count):


if self.current_user.can_see_reservations:
return self.reservation_service.highest_total_price_reservations(
date_from,
date_to,
reservations_count
)
else:
return []

#Models and ReservationService:

class Reservation:
def __init__(self, date, total_price):
self.date = date
self.total_price = total_price

class ReservationService:
def highest_total_price_reservations(self, date_from, date_to, reservations_count):
# normally it would be read from database/external service
reservations = [
Reservation(date(2014, 5, 15), 100),
Reservation(date(2017, 5, 15), 10),
Reservation(date(2017, 1, 15), 50)
]

filtered_reservations = [r for r in reservations if (date_from <= r.date <= date_to)]

sorted_reservations = sorted(filtered_reservations, key=attrgetter('total_price'),


reverse=True)

return sorted_reservations[0:reservations_count]