Home / LinuxUser / 2006 / 10 / Funktionen, Module und Pakete in Python

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Mandriva gibt Distribution in die Hände der Community
(268 Punkte bei 24 Stimmen)
Neues vom Systemd
(179 Punkte bei 5 Stimmen)
Mandriva in Nöten
(161 Punkte bei 4 Stimmen)
Mageia 2 ist fertig
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

Gut verschnürt

Funktionen, Module und Pakete in Python

Module

Wie Sie Funktionen in Python schreiben, wissen Sie nun. Wächst die Zahl der Funktionen mehr und mehr, bietet es sich an, diese in Modulen zu gruppieren. Ein Modul ist einerseits eine Datei, andererseits – nachdem ein Skript die Datei mit der import-Anweisung lädt – ein Modulobjekt. Die bisher vorgestellten Dateien mit der Endung .py funktionieren auch problemlos als Module, ebenso die Datei fakultaet.py aus Listing 2.

Listing 2

01 #! /usr/bin/python
02 # encoding: iso-8859-1
03
04 def fakultaet(n):
05     """
06     Gib die Fakultät "n!" von n>=0 zurück.
07
08     n! = 1 * 2 * … * (n-1) * n (Beispiel: 4! = 1*2*3*4 = 24)
09     Definitionsgemäß ist 0! = 1.
10     """
11     assert n >= 0, "n darf nicht negativ sein, ist aber %s" % n
12     produkt = 1
13     for i in range(2, n+1):
14         produkt = produkt * i
15     return produkt
16
17 def _test(n, erwartet):
18     """
19     Teste, ob fakultaet(n) gleich dem erwarteten Ergebnis ist.
20     """
21     ergebnis = fakultaet(n)
22     print "fakultaet(%d) berechnet als %d …" % (n, ergebnis),
23     if ergebnis == erwartet:
24         print "ok"
25     else:
26         print "FEHLER!"
27
28 if __name__ == '__main__':
29     _test(0, 1)
30     _test(1, 1)
31     _test(2, 2)
32     _test(9, 362880)

Dieses Modul enthält in den Zeilen 4 bis 15 eine Funktion fakultaet zum Berechnen der so genannten Fakultät einer ganzen Zahl n, dass heißt, dem Produkt aller ganzen Zahlen von 1 bis n. Die assert-Anweisung stellt hier sicher, dass das Argument n nicht negativ ist. (Sie lernen später flexiblere Möglichkeiten zum Abfangen von Fehlern kennen.) Vor dem Eintritt in die for-Schleife (Zeilen 12 und 14) setzt die Funktion den spätere Rückgabewert auf "1".

Der Aufruf der range-Funktion in Zeile 13 bedarf einer Erläuterung: So wie der Slice "Hallo"[3:2] (erster Index größer oder gleich dem zweiten) einen leeren String liefert, ergibt range eine leere Liste, falls das erste Argument größer oder gleich dem zweiten ist. In diesem Fall springt der Interpreter gleich zu Zeile 15.

Nach der Funktion zum Berechnen der Fakultät steht in den Zeilen 17 bis 26 eine Testfunktion. Üblicherweise bedeutet ein führender Unterstrich in einem Bezeichner, das dieser nur intern (hier in dem Modul) zum Einsatz kommt.

In den Zeilen 28 bis 32 steht etwas Testcode. Dieser ruft die vorher definierte Testfunktion auf – aber nur, wenn Sie das Modul auf der Kommandozeile als Script ausführen. Sonst ignoriert der Interpreter der Code nach Zeile 28. In der if-Bedingung ist __name__ der Name des Moduls, der bei Ausführung von der Kommandozeile der String '__main__' ist, sonst der Name des Moduls. Dieses Idiom finden Sie in Python-Modulen sehr häufig.

Das Modul fakultaet verwenden Sie in eigenem Code so:

import fakultaet
# gibt 720 aus
print fakultaet.fakultaet(6)

Mit der import-Anweisung laden Sie das Modul. Danach stehen über den Modulnamen alle Bezeichner im importierten Modul zur Verfügung; in fakultaet.fakultaet(6) steht der erste Bezeichner für das Modul, der zweite für die Funktion darin. Der Punkt dazwischen heißt Attributzugriffs-Operator, weil Sie damit auf das rechts davon stehende Attribut (hier die Funktion) des links davon stehenden Objekts (hier das Modul) zugreifen.

Das links vom Punkt stehende Objekt heißt auch Namensraum, weil Sie von dort aus auf die darin definierten Namen zugreifen. Wahrscheinlich haben Sie sich gefragt, ob Sie nicht die Funktion verwenden können, ohne das Modul davor zu schreiben. Das geht mit der Form from modul import name, also im Beispiel

from fakultaet import fakultaet
print fakultaet(6)

Benötigen Sie nur wenige Namen, ist der gesparte Schreibaufwand unwichtig; benötigt man viele Namen aus Modulen, ist die ursprünglich vorgestellte Variante beim Lesen des Codes verständlicher. Kurzum: Verwenden Sie lieber nur die Form import Modul (oder from Paket import Modul , siehe unten).

Die Standard-Distribution

Ein Motto im Zusammenhang mit Python lautet "Batteries included" und meint die Auswahl hunderter nützlicher Module, die mit der Standard-Distribution mitkommen. Tabelle 2 listet einige gebräuchliche Module auf. Unter [5] finden Sie alle Module der Distribution auf einen Blick; die Python Library Reference [6] gliedert die Module nach Themen.

Einige Module der Standard-Distribution

Modul

Beschreibung

cgi CGI-Support (es gibt außerdem zahlreiche Web-Frameworks [7])
cgitb ausführliche Fehlermeldungen für die CGI-Entwicklung
ConfigParser Parser für Konfigurationsdateien
csv Unterstützung kommaseparierter (CSV) Dateien
datetime Datentypen und Arithmetik für Datum und Uhrzeit
distutils Werkzeuge zum Erstellen und Installieren von Python-Paketen
doctest automatisierte Tests in Docstrings, tolles Konzept!
email Parsen und Erstellen von E-Mails, auch mit Anhängen
ftplib FTP-Client-Bibliothek (einfacher geht's mit ftputil [8])
gettext Schnittstelle zu GNU gettext
glob plattformübergreifende Wildcard-Unterstützung
gzip Lesen und Schreiben von gzip-Dateien
hotshot Profiler (Geschwindigkeitsanalysator) für Python-Code
imaplib IMAP-Client-Bibliothek
inspect zahlreiche Informationen über Python-Objekte während der Programmlaufzeit ermitteln
logging Logdateien schreiben
mailbox Parsen von Mailbox-Dateien
math mathematische Funktionen
nntplib NNTP (Usenet)-Client-Bibliothek
optparse vielseitige Unterstützung für Kommandozeilen-Schnittstellen
os verschiedene Betriebssystem-Schnittstellen (Dateien und Verzeichnisse und Prozesse)
os.path Bearbeiten von Pfadnamen, Dateieigenschaften ermitteln; wird durch import os automatisch mit importiert
pdb Python-Debugger
pickle Python-Objekte in Strings wandeln und umgekehrt
poplib POP3-Client-Bibliothek
pprint übersichtliche Darstellung von Datenstrukturen
pydoc Dokumentation zu Python-Objekten extrahieren
re reguläre Ausdrücke
shutil Dateioperationen (kopieren, verschieben usw.)
smtplib SMTP-Client-Bibliothek
StringIO Datei-Schnittstelle für Strings
sys Schnittstellen zum Python-Interpreter
tarfile tar-Dateien lesen und schreiben
threading Multithreading-Unterstützung
time Datums-/Zeit-Operationen (vgl. datetime)
urllib, urllib2 verallgemeinerter Zugriff auf URLs
xml.dom DOM-API für XML
xml.sax SAX-API für XML
zipfile Lesen und Schreiben von Zip-Dateien
zlib Komprimieren und Entpacken mit dem zlib-Algorithmus (vgl. gzip)
Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 0 Punkte (0 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 06/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Adobe AIR
Adobe-AIR-Programme installieren und (manuell) starten
Tim Schürmann, 14.05.2012 13:09, 0 Kommentare

Es gibt sie noch: neue Anwendungen, die Adobes Integrated Runtime voraussetzen. Aktuellstes und vermutlich auch größtes Beispiel ist das Adventure Botanicula

Aktuelle Fragen

gibt es ein Kommandozeilen Tool, um ein X11-Fenster in ein Anderes einzubetten?
GoaSkin , 21.05.2012 16:44, 0 Antworten
Das XEmbed-Protokoll ist u.A. dazu gedacht, dass man eine X11-Anwendung in eine andere wie ein Wi...
Apache2, Options -Indexes geht nicht
no no, 12.05.2012 19:01, 8 Antworten
Habe in apache2.conf folgendes stehen: Options -Indexes ...
LInux auf Dell LS H500
Andreas Endresl, 09.05.2012 08:54, 2 Antworten
Habe einen alten Dell Latitude LS H500 nur mit ext. Floppy und CD es geht nur immer eines von den...
Datenwiederherstellung unter Ubuntu 12.04 mit "Simple Backup" nach Umzug von Linux Mint
Christian Lottmann, 07.05.2012 13:33, 0 Antworten
Vor dem Umzug auf Ubuntu 12.04 habe ich unter Linux MInt mit "Simple Backup" voll (15.4.2012) und...
DKMS für den propritären NVIDIA-Treiber
Commander Data, 26.04.2012 22:02, 2 Antworten
Hallo an die Gemeinde. Ich habe hier ein interessantes Stück openSuSE gefunden. http://forums.op...