programmiersprachen:python

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
programmiersprachen:python [2010/02/22 01:43] stprogrammiersprachen:python [2020/01/06 18:32] (aktuell) – [Umstellung auf Python version 3 als Standard] st
Zeile 1: Zeile 1:
 +====== Python ======
 +[[wpde>Python_(Programmiersprache)|Python]] ist ein plattformunabhängige Skriptsprache in der man schnell, einfach und leicht programmieren kann. Auch auf Webservern wird es benutzt.
 +
 +===== Links =====
 +
 +
 +  * [[http://docs.python.org/download.html|Python Doku]]
 +  * [[http://docs.python.org/reference/index.html#reference-index|The Python Language Reference]]
 +  * [[http://docs.python.org/library/|The Python Standard Library]]
 +  * [[http://www.addedbytes.com/cheat-sheets/python-cheat-sheet/|Python Cheat Sheet]]
 +  * [[http://www.heise.de/ix/artikel/Objektbeschwoerung-505184.html|Objektbeschwörung (iX 03/1996, Seite 144)]]
 +  * **[[http://www.python.org/dev/peps/pep-0008/|Style Guide for Python Code]]** 
 +
 +  * [[http://pypi.python.org/pypi|Python Package Index]]
 +  * [[http://staff.washington.edu/jon/pymodel/www/|Pymodel - a model-based testing framework in Python]]
 +  * [[http://www.vex.net/parnassus/|The Vaults of Parnassus: Python Resources]] (aktuell offline)
 +  * [[http://news.feed-reader.net/117332-python-3.html|What’s New In Python 3.0]]
 +  * [[http://www.artima.com/intv/aboutme.html|Python and the Programmer]]
 +  * [[http://www.linuxjournal.com/article/2605|The Python DB-API]]
 +  * [[http://www.heise.de/newsticker/meldung/Python-wird-vollwertige-Programmiersprache-fuer-Symbian-929487.html|Python wird vollwertige Programmiersprache für Symbian]]
 +  * [[http://www.heise.de/newsticker/meldung/Fabric-Engine-bringt-JavaScript-auf-C-Niveau-1495054.html|Fabric Engine als Geschwindigkeitsturbo]]
 +  * [[http://www.realpython.com/blog/python/python-web-applications-with-flask-part-i/|Python Web Applications With Flask - Part I]]
 +  * [[http://wyattbaldwin.com/2014/01/13/what-i-hate-about-python/|What I Hate About Python]]
 +
 +==== Python Beispiel-Code ====
 +
 +  * **[[http://pythonbook.hajji.name/de/toc.html|Support Website des Buches: Das Python Praxisbuch]]** 
 +  * [[http://www.amk.ca/python/simple/|Simple Sample Python Code]]
 +  * [[https://github.com/django/django/blob/master/django/utils/crypto.py|Django's standard crypto functions and utilities]]
 +
 +==== Integration in Openoffice ====
 +
 +  * [[http://www.ooowiki.de/Python|Python im ooowiki]]
 +  * [[http://de.openoffice.org/doc/entwicklung/python_bruecke.html|Die Python-UNO-Brücke von OpenOffice.org]]
 +  * [[http://wiki.services.openoffice.org/wiki/Python_as_a_macro_language|Python as a macro language]]
 +  * [[http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide|OpenOffice.org Developer's Guide]]
 +  * [[http://wiki.services.openoffice.org/wiki/Extensions_development_python|PyUNO]]
 +  * [[http://udk.openoffice.org/python/python-bridge.html|Python-UNO bridge - IMPORTANT: Workarounds for pyuno problems in OOo3.0.0]] 
 +
 +
 +
 +
 +==== Drittanbietermodule ====
 +
 +  * [[http://www.picloud.com/product/|picloud]] - einfache Anbindung an Amazins EC2, leider bisher nur Server in den USA
 +  * [[http://imdbpy.sourceforge.net/|imdbPy]] - IMDB per Python ansprechen
 +  * [[http://code.google.com/p/pywebdav/|pywebdav]] - eine [[netzwerke:webdav]] Implementierung in Python
 +  * [[https://code.google.com/p/pyftpdlib/|Python FTP server library (pyftpdlib)]] - eine [[netzwerke:ftp]] Implementierung in Python
 +
 +
 +
 +
 +===== Dokumentation finden =====
 +
 +  - Kommentare im Quellcode
 +  - Informationen über Attribute anzeigen mit der dir()-Funktion, z. B.  <code python>dir(str)</code>
 +  - Docstrings: <nowiki>__doc__</nowiki> z. B. <code python>import sys
 +print sys.__doc__</code>
 +  - PyDoc - bereitet docstrings auf:<code python>import sys
 +help(sys.modules)</code> :!: Es existiert mit dem skript pydocgui (bzw. auf [[windows:Windows]] der Eintrag "Module Docs" im Startmenu) auch eine Ausgabe in HTML
 +
 +
 +==== Anleitungen ====
 +
 +  * [[http://docs.python.org/inst/inst.html|Installing Python Modules]]
 +  * [[http://www.python.org/doc/current/tut/tut.html|Python Tutorial]]
 +  * [[http://www.programmingtutorials.com/python.aspx|Python Tutorials (Linkliste)]]
 +  * [[http://www.awaretek.com/tutorials.html|Python Tutorial (Links)]]
 +
 +
 +===== Entwicklungsumgebungen (IDE) =====
 +
 +  * IDLE: mitgeliefert, baut auf dem portablen Tkinter auf, sieht allerdings auch dementsprechend schlicht aus.
 +  * [[http://pydev.org/|PyDev]]: Python IDE für Eclipse
 +  * Komodo (kommerziell)
 +  * [[http://wingware.com|Wing IDE]], kostenlose Varianten für den privaten Gebrauch verfügbar ([[http://www.wingware.com/wingide-personal|Wing IDE Personal]] oder [[http://www.wingware.com/wingide-101|Wing IDE 101]])
 +  * [[http://www.python.org/download/windows/|PythonWin]]: kostenlos und und Windows-spezifischen Erweiterungen (Win32 API und COM-Supoort); auch [[http://sourceforge.net/projects/pywin32/|zusammen in einem Paket mit Python]]
 +  * [[http://dreampie.sourceforge.net/|DreamPie]]
 +  * [[http://www.bpython-interpreter.org/|bpython]] interaktiver Python-Interpreter mit Auto-Completion
 +
 +
 +===== 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 ''python <nowiki>--</nowiki>version'') sollte nun auf Version 3 landen.
 +
 +Ablauf bei Debian/Ubuntu ((python3 bei centos: https://developers.redhat.com/blog/2018/11/14/python-in-rhel-8/)):
 +<code bash>
 +sudo update-alternatives --remove python /usr/bin/python2.7
 +sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
 +
 +sudo apt install python3-pip
 +sudo apt remove python-pip #pip für version2
 +# ggf. sind lokal Versionen installiert, siehe whereis pip oder which -a pip
 +# "ln -s /usr/bin/pip /home/$USER/.local/bin/pip"
 +sudo ln -s /usr/bin/pip3 /usr/bin/pip
 +</code>
 +==== 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**, außer in Strings und bei Einrückungen
 +  - **Leerzeilenwerden in Dateien ignoriert**, nur in der interaktiven Eingabe nicht
 +  - **Kommentare**
 +    - einzeilig: (mit Raute "#" gekennzeichnet) Text wird bis zum Zeilenende ignoriert 
 +    - mehrzeilig: (mit drei Anführungzeichen """ gekennzeichnet) Text wird bis zu den nächsten drei Anführungszeichen ignoriert 
 +  - **Dokumentationsstring** (kurz docstrings) werden ignoriert aber von einigen Programmen angezeigt
 +    - docstrings sind der erste Text der in einem Objekt oder einer Funktion.<code python>import sys
 +print sys.__doc__</code>
 +    - PyDoc zeigt die docstrings noch einfacher an:<code python>import sys
 +help(sys)</code>Eine Ausgabe ist übrigens auch in html möglich.
 +
 +
 +==== Programme ausführen ====
 +
 +Vorraussetzung: Ein Python-Interpreter ist auf dem System und im Suchpfad erreichbar.
 +
 +  * **interaktiv**: python (Prompt wechselt zu "<nowiki>>>></nowiki>", bei mehrzeiligen Anweisungen, die mit einem einfachen Backslash "\" am Zeilenende (oder mit drei Anführungszeichen) markiert werden, in "...") hier gibt es ein paar **Besonderheiten**:
 +    * nur Python-Code eingeben, keine Systemkommandos
 +    * print anweisungen sind hier nicht explizit nötig, statt "print 'variable' " reicht "variable"
 +    * keine Einrückungen verwenden, führende Leerzeichen führen zu Fehlern
 +  * **Aufruf des Interpreters** für eine Datei.py: "python Datei.py" unter [[windows:Windows]] schließt sich die Eingabeaufforderung nachdem das Programm fertig ist, um das zu umgehen könnte man am Ende ein <code python>raw_input()</code> hinzufügen das auf einen Tastendruck wartet. Bricht allerdings das Programm vorher unerwartet mit einem Fehler ab, wird diese letzte Anweisung nicht mehr ausgeführt.
 +  * [[linux:Linux]]: ausführbare Textdatei mit entsprechendem Vorspann entsprechend formulieren (unicode):<file>#!/usr/bin/env python
 +# -*- coding: utf-8 -*</file> die erste Zeile kann auch spezifischer sein, ist dann allerdings nicht mehr so gut portabel! <file>#!/usr/bin/python2.6</file>
 +
 +==== Implementierungen ====
 +
 +  * **CPython**: Referenzimplementierung, in portablem ANSI C geschrieben, und standardmäßig eingesetzt
 +  * **Jpython**: in Java implementiert, Quellcode wird in Java-Bytecode übersetzt und dieser dann in der Java virtual machine (JVM) ausgeführt. Damit verhalten sie Programme wie in Java geschrieben und können dementsprechend als Web-Applets und -Servlets fungieren ebenso die GUI-Elemente nutzen. Langsamer und weniger robust als CPython.
 +  * **Ironpython**: Ermöglicht eine Integration in das .Net-Framework
 +  * **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:Windows]]: [[http://www.py2exe.org/|py2exe]] MacOS [[http://pypi.python.org/pypi/py2app/|py2app]] und [[http://wiki.python.org/moin/Freeze|freeze]] für Unix-artige Systeme.
 +
 +
 +
 +===== Sprachelemente =====
 +
 +Kommentare:
 +  * einzeilig: # Kommentar
 +  * mehrezeilig: """ Kommentar """
 +
 +**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:<code python> type(Variable)</code>
 +
 +
 +==== Kategorien von Typen (und Operationen) ====
 +
 +Es gibt 3 Kategorien von Typen (und Operationen):
 +
 +  - Abbildungen: Indizierung durch Schlüssel etc.
 +  - Sequenzen: unterstützt werden Indizierung, Verkettung, Teilbereiche etc.
 +  - 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://numpy.scipy.org/|NumPy]] bietet zusätzliche Werkzeuge und z. B. einen Matrix-Datentypen)) ^^
 +| Normale Ganzzahl ((in [[programmiersprachen:C]]: long; intern als [[programmiersprachen:C]]-longs implementiert, d.h. mindestens 32Bit)) | 1234, -48, 0 |
 +| Lange Ganzzahl ((unbegrenzt; L seit Python 2.2 nicht mehr nötig da Zahlen automatisch von normal in lange Zahlen konvertiert werden)) | 99999999999999999L |
 +| Fließkommazahl ((e oder E kennzeichnet den Exponenten mit oder ohne Vorzeichen; intern als [[programmiersprachen:C]]-double implementiert)) | 1.23, 3.14e-10, 5E123, 5.0e+234 |
 +| 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 = <nowiki>''</nowiki> |
 +| einfache und doppelte Anführungszeichen: kennzeichnen Text, beide Varianten sind gleichwertig ((können aber auch benutzt werden um das jeweils andere Zeichen als Teil des strings zu kennzeichnen <code python>print ' dieses Anführungszeichen " ist Teil des strings'</code>)) | "text" oder 'text'
 +| dreifache Anführungszeichen: beliebig lange Texte | <code python>print """ erste Zeile</code><code python>zweite Zeile """</code> |
 +| Escape-sequenzen | <code python>print "Anführungszeichen \" sind toll "</code> spezielle Zeichen wie \n für Zeilenumbruch oder \t für Tabulator gelten außerdem |
 +| rohe strings (python escaped automatisch) | pfad = r'C:\ordner\datei.txt' |
 +| Unicode strings ((ab python 3 sind alle strings unicode; auch wide-character strings genannt. Explizite Konvertierung von unicode zu normal mit <code python>str(u'unicodetext)</code> bzw. von normal nach unicode: <code python>unicode ('normal')</code> )) | u'deutsche Umlaute in unicode: öäü' |
 +^ **Listen** - eine Sammlung beliebiger Objektarten ^^
 +| Zugriff auf einzelne Elemente | <code python>print liste[0]</code> |
 +| Listen reagieren bei Operatoren ähnlich wie Strings |  |
 +| Länge bestimmen | <code python>len([1, 2, 3])</code> ergibt drei |
 +| Verkettung | <code python>[1, 2, 3] * [4, 5, 6]</code> ergibt [1, 2, 3, 4, 5, 6] |
 +| Enthalten? | <code python>3 in [1, 2, 3]</code> ergibt "True" |
 +| Iteration | <code python>for x in [1, 2, 3]: print x</code> |
 +^ **Dictionaries** (=Wörterbücher weil Schlüssel-Wert-paar) bzw. **assoziative Arrays** ^^
 +| Beschreibung/Hinweise | Wörterbücher sind Container, sie speichern nicht die Objekte an sich, sondern die Pointer auf die Werte. **Schlüssel** in einem dictionary können ein **beliebiges Objekt** sein, solange es immutable und hashbar ist ((also eine Methode ''<nowiki>__hash__</nowiki>'' definiert haben. Das kann mit <code python>hash(Variable)</code> überprüft werden. )). Somit sind beispielsweise Listen nicht als Schlüssel möglich. Schlüssel sind oft string, aber auch integer,tupel oder unicode werden benutzt. Außerdem müssen Schlüssel auch nicht homogen sein, hier können mehrere Datentypen vermischt werden!)) |
 +| Initialisieren | <code python>exampledict = {}</code> |
 +| Wertzuweisung (Schlüssel)| <code python>exampledict = {1: "eins", 2: "zwei", 3: "drei"}</code> |
 +| Anzahl Einträge bestimmen | FIXME <code python> </code> |
 +| Alle Werte anzeigen | <code python>exampledict</code> Ausgabe: <file>{1: 'eins', 2: 'zwei'}</file> |
 +| Zugriff auf einzelne Elemente | <code python>exampledict[1]</code>wenn der Schlüssel als string definiert worden wäre: <code python>exampledict["1"]</code> |
 +| **einzelne Elemente** (hier Schlüssel 4 mit Wert "vier") **hinzufügen** | <code python>exampledict[4] =  "vier"</code> |
 +| **einzelne Elemente** (hier Schlüssel 3) **löschen** | <code python>exampledict.del(3)</code> |
 +| alle Elemente/das **komplettes dictionary löschen** | <code python>exampledict.clear()</code> |
 +| **Werte verändern** ((Anmerkung: Mit der append-Methode können auch Daten angehängt werden)) | FIXME |
 +| **Schlüsselnamen verändern** | Geht nur über löschen/neu setzen weil die Schlüsselnamen selbst unveränderbar sind: <code python>oldval = exampledict[4]
 +del exampledict[4]
 +exampledict[4] = "Vier"</code> |
 +| Iteration | <code python>for exampledict in [1, 2]: print exampledict</code> |
 +^ 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>try:
 + print exampledict[4]
 +except KeyError:
 + print "not found"</code>  |
 +| -> **Methode 2: LBYL** (Look Before You Leap) - Schauen ob Schlüssel existiert und dann Wertabfrage oder Meldung ohne Wertabfrage | <code python>if 4 in exampledict:
 + print exampledict[4]
 +else:
 + print "not found"</code> Alternativ wäre die if-Zeile auch so möglich: <code python>exampledict.has_key(4)</code>hier wird dann False zurückgegeben folglich in in else verzweigt.  |
 +| -> **Methode 3: get-Methode von dict mit oder ohne default-Wert** | <code python>ergebnis = exampledict.get(4, "not found")
 +print ergebnis</code>  |
 +| Alias zu einem dictionary erzeugen | <code python>exampledict2 = exampledict</code> |
 +| Shallow-copy ((die Wörterbücher teilen sich evtl. gemeinsame Werte, Achtung Fehlerquelle!)) von einem dictionary erzeugen | <code python>exampledict2 = exampledict.copy()</code> |
 +| **Eingenständige** (rekursive) **Kopie von einem dictionary erzeugen** | <code python>exampledict2 = copy.deepcopy(exampledict)</code> |
 +| Ausgabesortierung |  |
 +^ **Tupel**  ^^
 +| FIXME |  |
 +^ **Dateien**  ^^
 +| FIXME |  |
 +^ **Mengen**  ^^
 +| FIXME |  |
 +
 +
 +**explizite Typumwandlung**:
 +  * als Zahl: int(23)
 +  * als String: str(23)
 +  * als float: float("1.234E-100")
 +  * ...
 +
 +
 +==== Operationen ====
 +
 +**Ausdrucksoperatoren**:
 +  * einfache Arithmetik: + * / - 
 +  * Potenzierung: (2 hoch 100) <code python>print 2 ** 100</code>
 +  * <nowiki>>></nowiki> FIXME
 +  * Verkettung | <code python>print 'hello ' + 'world'</code>
 +  * ...
 +
 +
 +==== if-Anweisung ====
 +
 +  * **einfachster Fall**:<code python>if x == 1:
 +  print "x ist gleich 1."</code>
 +  * **komplexester Fall** mit allen optionalen Bestandteilen:<code python>
 +if x == 1:
 +  print "x ist gleich 1."
 +elif x == 0
 +  print "x ist gleich 0."
 +else:
 +  print "x ist weder 1 noch 0."</code>
 +  * **Mehrfach-Verzweigung** (ähnlich switch/case in anderen Sprachen) sind mit "elif" Konstrukten (s. o.) abbildbar, zusätzlich kann das durch Indizierung in Dictionaries oder Suche in Listen evtl. flexibler gestaltet werden:<code python>
 +auswahl = "Hilfe"
 +print {"keineHilfe": 0,
 +"Hilfe": 1,
 +"Sonstiges": 9}[auswahl]
 +</code>
 +  * **Standardwert** setzen - mit ''has_key()'' oder ''get()'':<code python>
 +auswahl = {"keineHilfe": 0,
 +"Hilfe": 1,
 +"egal": 3}
 +print auswahl.get("Antwort nicht enthalten", "Sonstiges")
 +</code>
 +
 +==== Schleifen ====
 +
 +Folgende zwei Schleifenkonstrukte sind die wichtigsten, es gibt noch allerdings noch andere Funktionen wie map, reduce, filter, den Elementtest mit in, List Comprehensions usw.
 +
 +  * **while-Schleife**: führt immer wieder einen Block solange die Bedingung in Kopfzeile erfüllt ist (ein wahren Wert ergibt). Wenn er anfangs nicht erfüllt ist, wird nichts ausgeführt also spricht man von einer kopfgesteuerten Schleife.
 +    * continue - springt zur Kopfzeile der innersten Schleife
 +    * **Beispiel**:<code python>a = 0
 +while a < 10:
 +    a = a + 1   # Kurzschreibweise: a += 1    
 +    if a == 5:
 +        print "die 5 gebe ich nicht aus!"
 +        continue
 +    print a
 +else:
 +    print "Schleife normal beendet"</code>    
 +    * break - springt aus der innersten Schleife heraus: Beispiel wo die Schleife nicht normal beendet wird, weil bei der 5 abgebrochen wird<code python>a = 0
 +while a < 10:
 +    a = a + 1   # Kurzschreibweise: a += 1    
 +    if a == 5:
 +        print "die 5 gebe ich nicht aus!"
 +        break
 +    print a
 +else:
 +    print "Schleife normal beendet"</code> 
 +    * pass - tut nichts, dient als Platzhalter
 +    * "else:" Block nach Schleife: wird ausgeführt wenn Schleife normal beendet wird (ohne break)
 +  * **for-Schleife**: läuft über alle Elemente eines geordneten (Sequenz-) Objekts (z. B. Strings, Listen und Tupel)
 +    * **Beispiel**:<code python>
 +for a in ["erster " "zweiter " "dritter"]:
 +  print a
 +</code>
 +    * 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>funktionsname(wert1, wert2)</code>
 +  * **Argumente mit Namensangabe** <code python>funktionsname(argument1=wert1, argument2=wert2)</code> in diesem Fall gleichbedeutend:<code python>funktionsname(argument2=wert2, argument1=wert1)</code>
 +
 +**in der Funktionsdeklaration**:
 +  * **normales Argument**, Vergleich nach Name oder Position: <code python>def funktion(wert)</code> 
 +  * Parameter (name) hat **Vorgabewert** (wert) falls keiner übergeben wurde: <code python>def funktion(name=wert)</code> 
 +  * **Verbleibende Argumente in ein Tupel** speichern: <code python>def funktion(*tupel)</code> 
 +  * **Verbleibende Argumente in ein dictionary** speichern <code python>def funktion(**dict)</code>
 +
 +Eine **Sonderform** ist der **lamba-Ausdruck**, er wird oft als inline-Funktion benutzt. Damit können Funktionen an Stellen aufgerufen werden, wo sonst kein "def" erlaubt wäre.
 +
 +Anstatt (Ein- und Ausgabe der interaktiven Shell):
 +<code python>
 +>>> def function(a, b, c): return a + b + c
 +... 
 +>>> function(1, 2, 3)
 +6
 +</code>
 +geht genauso:
 +<code python>
 +>>> rechne = lambda a, b, c: a + b + c
 +>>> rechne
 +<function <lambda> at 0x87096f4>
 +>>> rechne(1, 2, 3)
 +6
 +</code>
 +
 +
 +==== Module ====
 +
 +**Import von Modulen**
 +  * Dateiendungen und Pfade müssen weggelassen werden
 +  * jede .py-Datei kann als Modul importiert werden: <code python>import modulename</code>
 +  * ein import findet nur bei ersten mal statt, ein erneuter Import muss so erfolgen:<code python>reload (modulename)</code>
 +
 +
 +
 +Als Vorbereitung muss ''python-dev'' bzw- ''python3-dev'' installiert werden, andernfalls kommt diese Fehlermeldung:
 +<file>fatal error: Python.h: Datei oder Verzeichnis nicht gefunden</file>
 +
 +=== Installieren von Dritt-Anbietermodulen ===
 +
 +
 +Siehe auch: [[https://docs.python.org/3/install/|Installing Python Modules (Legacy version)]]
 +
 +== 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 "site-packages" Unterverzeichnis nötig:
 +
 +  * Linux/Python 2.7: ''/usr/local/lib/python2.7/site-packages'' ((Byte-Code erzeugen damit die Module schneller geladen werden:<code python>python -c 'import compileall; compileall.compile_path()'</code>))
 +  * Linux/Python 3.4: ''/usr/local/lib/python3.4/site-packages'' ((Byte-Code erzeugen damit die Module schneller geladen werden:<code python>python -c 'import compileall; compileall.compile_path()'</code>))
 +  * Windows: [[http://pythonsimple.noucleus.net/python-install/python-site-packages-what-they-are-and-where-to-put-them|Python Site-Packages – What They Are And Where To Put Them]]
 +
 +
 +
 +
 +
 +
 +===== Integration in Webserver =====
 +
 +==== Apache2 Konfiguration (mod_python) ====
 +
 +Siehe auch: [[http://www.modpython.org/live/mod_python-3.3.1/doc-html/|Mod_python Manual]] und [[http://www.onlamp.com/pub/a/python/2003/10/02/mod_python.html|Introducing mod_python]].
 +
 +Zuerst muss einmal ''mod_python''
 +  - installiert
 +  - aktiviert sein (a2enmod mod_python)
 +  - und für die Verarbeitung von .py-Dateien benutzt werden. Um für das Verzeichnis /var/www/pythondir Python zu aktivieren, braucht es nur wenig Code:
 +<code>
 +<Directory /var/www/pythondir> 
 +  AddHandler mod_python .py
 +</Directory>
 +</code>
 +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.