Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
programmiersprachen:python [2010/02/22 01:43] – st | programmiersprachen:python [2020/01/06 18:32] (aktuell) – [Umstellung auf Python version 3 als Standard] st | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Python ====== | ||
+ | [[wpde> | ||
+ | |||
+ | ===== Links ===== | ||
+ | |||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * **[[http:// | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ==== Python Beispiel-Code ==== | ||
+ | |||
+ | * **[[http:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | |||
+ | ==== Integration in Openoffice ==== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Drittanbietermodule ==== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Dokumentation finden ===== | ||
+ | |||
+ | - Kommentare im Quellcode | ||
+ | - Informationen über Attribute anzeigen mit der dir()-Funktion, | ||
+ | - Docstrings: < | ||
+ | print sys.__doc__</ | ||
+ | - PyDoc - bereitet docstrings auf:< | ||
+ | help(sys.modules)</ | ||
+ | |||
+ | |||
+ | ==== Anleitungen ==== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | ===== Entwicklungsumgebungen (IDE) ===== | ||
+ | |||
+ | * IDLE: mitgeliefert, | ||
+ | * [[http:// | ||
+ | * Komodo (kommerziell) | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | ===== Python-Interpreter ===== | ||
+ | |||
+ | Nach dem Aufruf des Interpreters übersetzt der den Quelltext in maschinenunabhängigen Bytecode (abgespeichert hat er die Dateiendung .pyc) der dann zur Laufzeit von der Python virtual machine (PVM) ausgeführt wird. | ||
+ | |||
+ | |||
+ | ==== Umstellung auf Python version 3 als Standard ==== | ||
+ | |||
+ | Python2 ist veraltet. Es wird weiterhin verfügbar sein, Programme sollten jedoch explizit auf den python2-Interpreter verweisen wenn sie nicht mit 3 laufen. | ||
+ | |||
+ | Der Standard-Python-Interpreterpfad (Aufruf von '' | ||
+ | |||
+ | Ablauf bei Debian/ | ||
+ | <code bash> | ||
+ | sudo update-alternatives --remove python / | ||
+ | sudo update-alternatives --install / | ||
+ | |||
+ | sudo apt install python3-pip | ||
+ | sudo apt remove python-pip #pip für version2 | ||
+ | # ggf. sind lokal Versionen installiert, | ||
+ | # "ln -s / | ||
+ | sudo ln -s / | ||
+ | </ | ||
+ | ==== Syntax-Regeln ==== | ||
+ | |||
+ | - **Einrückungen sind nicht optional sondern Teil der Syntax**! | ||
+ | - die **Reihenfolge der Anweisungen** richtet sich danach was hintereinander steht, außer es wird durch Kontrolflussanweisungen (if-Konstrukte etc.) anders bestimmt. | ||
+ | - **Blöcke und Anweisungsgrenzen** werden anhand von normalen Zeilenumbrüchen und Einrückungen erkannt | ||
+ | - **Verbundanweisungen** werden durch eine Kopfzeile (z.B. "if x:") und natürlich durch Einrückungen der folgenden Zeilen bestimmt | ||
+ | - **Leerzeichen** in Anweisungen und Ausdrücken **werden ignoriert**, | ||
+ | - **Leerzeilenwerden in Dateien ignoriert**, | ||
+ | - **Kommentare** | ||
+ | - einzeilig: (mit Raute "#" | ||
+ | - mehrzeilig: (mit drei Anführungzeichen """ | ||
+ | - **Dokumentationsstring** (kurz docstrings) werden ignoriert aber von einigen Programmen angezeigt | ||
+ | - docstrings sind der erste Text der in einem Objekt oder einer Funktion.< | ||
+ | print sys.__doc__</ | ||
+ | - PyDoc zeigt die docstrings noch einfacher an:<code python> | ||
+ | help(sys)</ | ||
+ | |||
+ | |||
+ | ==== Programme ausführen ==== | ||
+ | |||
+ | Vorraussetzung: | ||
+ | |||
+ | * **interaktiv**: | ||
+ | * nur Python-Code eingeben, keine Systemkommandos | ||
+ | * print anweisungen sind hier nicht explizit nötig, statt "print ' | ||
+ | * keine Einrückungen verwenden, führende Leerzeichen führen zu Fehlern | ||
+ | * **Aufruf des Interpreters** für eine Datei.py: " | ||
+ | * [[linux: | ||
+ | # -*- coding: utf-8 -*</ | ||
+ | |||
+ | ==== Implementierungen ==== | ||
+ | |||
+ | * **CPython**: | ||
+ | * **Jpython**: | ||
+ | * **Ironpython**: | ||
+ | * **Psyco**: Verhält sich anfangs ähnlich einer normalen PVM, ersetzt aber zur Laufzeit immer mehr Teile in maschinencode so dass Programme mit steigender Laufzeit immer performanter werden und sich der Geschwindigkeit von C annähern. | ||
+ | * **PyPy**: PVM in einer Untermenge von Python (Restricted Python) implementiert um als Framework die Übersetzung beliebiger Skriptsprachen in schnelle Zielsprache zu ermöglichen. | ||
+ | * **Binärdateien erzeugen** : [[windows: | ||
+ | |||
+ | |||
+ | |||
+ | ===== Sprachelemente ===== | ||
+ | |||
+ | Kommentare: | ||
+ | * einzeilig: # Kommentar | ||
+ | * mehrezeilig: | ||
+ | |||
+ | **Programmstruktur** | ||
+ | * Programme -> Module -> Anweisungen -> Ausdrücke -> bilden und verarbeiten Objekte | ||
+ | |||
+ | **Variablen** sind immer Zeiger auf unveränderliche Objekte, Ausnahmen sind u.a. Listen und Dictionaries wo Objekte an Ort und Stelle verändert werden. Nicht mehr benutzte Objekte werden freigegeben (garbage collection). Der Typ einer Variable kann mit type ausgegeben werden:< | ||
+ | |||
+ | |||
+ | ==== Kategorien von Typen (und Operationen) ==== | ||
+ | |||
+ | Es gibt 3 Kategorien von Typen (und Operationen): | ||
+ | |||
+ | - Abbildungen: | ||
+ | - Sequenzen: unterstützt werden Indizierung, | ||
+ | - Zahlen: unterstützt werden Addition, Multiplikikation etc. | ||
+ | |||
+ | Dabei unterscheiden sich | ||
+ | - veränderliche Typen die an Ort und Stelle geändert werden können und | ||
+ | - unveränderliche Typen für deren Änderung ein neues Objekt erzeugt werden muss. | ||
+ | |||
+ | |||
+ | ==== Typen ==== | ||
+ | |||
+ | |||
+ | ^ Objekttyp ^ (Erzeugungs-) Beispiele | ||
+ | ^ **Zahlen** ((Zahlen haben bei CPython die gleiche Genauigkeit wie der Compiler der den Python-Interpreter erstellt hat))((Erweiterung [[http:// | ||
+ | | Normale Ganzzahl ((in [[programmiersprachen: | ||
+ | | Lange Ganzzahl ((unbegrenzt; | ||
+ | | Fließkommazahl ((e oder E kennzeichnet den Exponenten mit oder ohne Vorzeichen; intern als [[programmiersprachen: | ||
+ | | Oktale und Hexadezimale Literale ((Klein oder Großbuchstaben sind gleichwertig)) | 0167, 0xf3f, 0XFF | | ||
+ | | Komplexe Zahlen ((Realteil (optional) + Imaginärteil (endet of j oder J))) | 3+4j, 3.0+4.0j, 3J | | ||
+ | ^ **Strings** (=Zeichenketten) ^^ | ||
+ | | Leerer String | a = < | ||
+ | | einfache und doppelte Anführungszeichen: | ||
+ | | dreifache Anführungszeichen: | ||
+ | | Escape-sequenzen | <code python> | ||
+ | | rohe strings (python escaped automatisch) | pfad = r' | ||
+ | | Unicode strings ((ab python 3 sind alle strings unicode; auch wide-character strings genannt. Explizite Konvertierung von unicode zu normal mit <code python> | ||
+ | ^ **Listen** - eine Sammlung beliebiger Objektarten ^^ | ||
+ | | Zugriff auf einzelne Elemente | <code python> | ||
+ | | Listen reagieren bei Operatoren ähnlich wie Strings | | | ||
+ | | Länge bestimmen | <code python> | ||
+ | | Verkettung | <code python> | ||
+ | | Enthalten? | <code python>3 in [1, 2, 3]</ | ||
+ | | Iteration | <code python> | ||
+ | ^ **Dictionaries** (=Wörterbücher weil Schlüssel-Wert-paar) bzw. **assoziative Arrays** ^^ | ||
+ | | Beschreibung/ | ||
+ | | Initialisieren | <code python> | ||
+ | | Wertzuweisung (Schlüssel)| <code python> | ||
+ | | Anzahl Einträge bestimmen | FIXME <code python> </ | ||
+ | | Alle Werte anzeigen | <code python> | ||
+ | | Zugriff auf einzelne Elemente | <code python> | ||
+ | | **einzelne Elemente** (hier Schlüssel 4 mit Wert " | ||
+ | | **einzelne Elemente** (hier Schlüssel 3) **löschen** | <code python> | ||
+ | | alle Elemente/ | ||
+ | | **Werte verändern** ((Anmerkung: | ||
+ | | **Schlüsselnamen verändern** | Geht nur über löschen/ | ||
+ | del exampledict[4] | ||
+ | exampledict[4] = " | ||
+ | | Iteration | <code python> | ||
+ | ^ Wörterbücher - nicht existierende Einträge abfangen ^^ | ||
+ | | -> **Methode 1: EAFP** (Easier to Ask Forgiveness than Permission) - Wert-Abfrage mit abfangen der Exception | <code python> | ||
+ | print exampledict[4] | ||
+ | except KeyError: | ||
+ | print "not found"</ | ||
+ | | -> **Methode 2: LBYL** (Look Before You Leap) - Schauen ob Schlüssel existiert und dann Wertabfrage oder Meldung ohne Wertabfrage | <code python> | ||
+ | print exampledict[4] | ||
+ | else: | ||
+ | print "not found"</ | ||
+ | | -> **Methode 3: get-Methode von dict mit oder ohne default-Wert** | <code python> | ||
+ | print ergebnis</ | ||
+ | | Alias zu einem dictionary erzeugen | <code python> | ||
+ | | Shallow-copy ((die Wörterbücher teilen sich evtl. gemeinsame Werte, Achtung Fehlerquelle!)) von einem dictionary erzeugen | <code python> | ||
+ | | **Eingenständige** (rekursive) **Kopie von einem dictionary erzeugen** | <code python> | ||
+ | | Ausgabesortierung | | | ||
+ | ^ **Tupel** | ||
+ | | FIXME | | | ||
+ | ^ **Dateien** | ||
+ | | FIXME | | | ||
+ | ^ **Mengen** | ||
+ | | FIXME | | | ||
+ | |||
+ | |||
+ | **explizite Typumwandlung**: | ||
+ | * als Zahl: int(23) | ||
+ | * als String: str(23) | ||
+ | * als float: float(" | ||
+ | * ... | ||
+ | |||
+ | |||
+ | ==== Operationen ==== | ||
+ | |||
+ | **Ausdrucksoperatoren**: | ||
+ | * einfache Arithmetik: + * / - | ||
+ | * Potenzierung: | ||
+ | * < | ||
+ | * Verkettung | <code python> | ||
+ | * ... | ||
+ | |||
+ | |||
+ | ==== if-Anweisung ==== | ||
+ | |||
+ | * **einfachster Fall**:< | ||
+ | print "x ist gleich 1."</ | ||
+ | * **komplexester Fall** mit allen optionalen Bestandteilen:< | ||
+ | if x == 1: | ||
+ | print "x ist gleich 1." | ||
+ | elif x == 0 | ||
+ | print "x ist gleich 0." | ||
+ | else: | ||
+ | print "x ist weder 1 noch 0."</ | ||
+ | * **Mehrfach-Verzweigung** (ähnlich switch/case in anderen Sprachen) sind mit " | ||
+ | auswahl = " | ||
+ | print {" | ||
+ | " | ||
+ | " | ||
+ | </ | ||
+ | * **Standardwert** setzen - mit '' | ||
+ | auswahl = {" | ||
+ | " | ||
+ | " | ||
+ | print auswahl.get(" | ||
+ | </ | ||
+ | |||
+ | ==== Schleifen ==== | ||
+ | |||
+ | Folgende zwei Schleifenkonstrukte sind die wichtigsten, | ||
+ | |||
+ | * **while-Schleife**: | ||
+ | * continue - springt zur Kopfzeile der innersten Schleife | ||
+ | * **Beispiel**:< | ||
+ | while a < 10: | ||
+ | a = a + 1 # Kurzschreibweise: | ||
+ | if a == 5: | ||
+ | print "die 5 gebe ich nicht aus!" | ||
+ | continue | ||
+ | print a | ||
+ | else: | ||
+ | print " | ||
+ | * break - springt aus der innersten Schleife heraus: Beispiel wo die Schleife nicht normal beendet wird, weil bei der 5 abgebrochen wird< | ||
+ | while a < 10: | ||
+ | a = a + 1 # Kurzschreibweise: | ||
+ | if a == 5: | ||
+ | print "die 5 gebe ich nicht aus!" | ||
+ | break | ||
+ | print a | ||
+ | else: | ||
+ | print " | ||
+ | * pass - tut nichts, dient als Platzhalter | ||
+ | * " | ||
+ | * **for-Schleife**: | ||
+ | * **Beispiel**:< | ||
+ | for a in [" | ||
+ | print a | ||
+ | </ | ||
+ | * mit range, xrange und zip können Indices für Zählschleifen generiert werden | ||
+ | * umgekehrte Iteration gehen mit reverse | ||
+ | |||
+ | ==== Funktionen ==== | ||
+ | |||
+ | **beim Aufruf**: | ||
+ | * **Normales Argument** kommen **mit** dieser **Positionierung** in der Funktion an:<code python> | ||
+ | * **Argumente mit Namensangabe** <code python> | ||
+ | |||
+ | **in der Funktionsdeklaration**: | ||
+ | * **normales Argument**, Vergleich nach Name oder Position: <code python> | ||
+ | * Parameter (name) hat **Vorgabewert** (wert) falls keiner übergeben wurde: <code python> | ||
+ | * **Verbleibende Argumente in ein Tupel** speichern: <code python> | ||
+ | * **Verbleibende Argumente in ein dictionary** speichern <code python> | ||
+ | |||
+ | Eine **Sonderform** ist der **lamba-Ausdruck**, | ||
+ | |||
+ | Anstatt (Ein- und Ausgabe der interaktiven Shell): | ||
+ | <code python> | ||
+ | >>> | ||
+ | ... | ||
+ | >>> | ||
+ | 6 | ||
+ | </ | ||
+ | geht genauso: | ||
+ | <code python> | ||
+ | >>> | ||
+ | >>> | ||
+ | < | ||
+ | >>> | ||
+ | 6 | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Module ==== | ||
+ | |||
+ | **Import von Modulen** | ||
+ | * Dateiendungen und Pfade müssen weggelassen werden | ||
+ | * jede .py-Datei kann als Modul importiert werden: <code python> | ||
+ | * ein import findet nur bei ersten mal statt, ein erneuter Import muss so erfolgen:< | ||
+ | |||
+ | |||
+ | |||
+ | Als Vorbereitung muss '' | ||
+ | < | ||
+ | |||
+ | === Installieren von Dritt-Anbietermodulen === | ||
+ | |||
+ | |||
+ | Siehe auch: [[https:// | ||
+ | |||
+ | == Fall 1: Distutils-Pakete (Standard) == | ||
+ | |||
+ | |||
+ | * Linux: python setup.py install | ||
+ | * Windows (cmd): setup.py install | ||
+ | |||
+ | |||
+ | == Fall 2: Einfache .py-Dateien == | ||
+ | |||
+ | Hier ist lediglich ein kopieren in das " | ||
+ | |||
+ | * Linux/ | ||
+ | * Linux/ | ||
+ | * Windows: [[http:// | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Integration in Webserver ===== | ||
+ | |||
+ | ==== Apache2 Konfiguration (mod_python) ==== | ||
+ | |||
+ | Siehe auch: [[http:// | ||
+ | |||
+ | Zuerst muss einmal '' | ||
+ | - installiert | ||
+ | - aktiviert sein (a2enmod mod_python) | ||
+ | - und für die Verarbeitung von .py-Dateien benutzt werden. Um für das Verzeichnis / | ||
+ | < | ||
+ | < | ||
+ | AddHandler mod_python .py | ||
+ | </ | ||
+ | </ | ||
+ | Natürlich kann man mod_python auch global aktivieren, dann lässt man die Einschränkung auf ein einziges Verzeichnis eben weg. | ||
+ | |||
+ | Andere Optionen (z.B. PythonHandler Dateiname (ohne .py); PythonDebug On usw.) sind auch möglich. | ||