Programmieren mit Python
Programmieren mit Python
Programmieren mit Python
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Programmieren</strong><br />
<strong>mit</strong> <strong>Python</strong><br />
© 2003 by Thomas Bruhin, media sonics, 4148 Pfeffingen, Switzerland. All Rights Reserved.
<strong>Programmieren</strong> <strong>mit</strong> <strong>Python</strong>.............................................................................................3<br />
<strong>Python</strong>: kurz und bündig.................................................................................................5<br />
<strong>Python</strong>: Werte und Variablen..........................................................................................7<br />
<strong>Python</strong>: Kommentare, Ein- und Ausgabe ........................................................................8<br />
<strong>Python</strong>: Datentypen ......................................................................................................10<br />
<strong>Python</strong>: Ausdrücke und Operatoren ..............................................................................15<br />
<strong>Python</strong>: Programmfluss ................................................................................................19<br />
<strong>Python</strong>: Fehlerbehandlung ............................................................................................25<br />
<strong>Python</strong>: Funktionen und Module...................................................................................28<br />
<strong>Python</strong>: Datum und Uhrzeit ..........................................................................................31<br />
<strong>Python</strong>: Filesystemfunktionen.......................................................................................34<br />
<strong>Python</strong>: Anhang............................................................................................................37<br />
<strong>Python</strong>: reservierte Wörter............................................................................................38<br />
<strong>Python</strong>: Vollständige Rangfolge der Operatoren ...........................................................39<br />
<strong>Python</strong>: Funktionen des Moduls math...........................................................................40<br />
<strong>Python</strong>: Funktionen des Moduls cmath .........................................................................41<br />
2
<strong>Programmieren</strong> <strong>mit</strong> <strong>Python</strong><br />
Autor und Dozent: Thomas Bruhin<br />
Dies ist die Begleitwebsite zum Workshop Einstieg in die Programmierung <strong>mit</strong> Hilfe der<br />
Skriptingsprache <strong>Python</strong>. Dieser Einstiegworkshop ist für Programmierneulinge gedacht und<br />
setzt keine Programmierkenntnisse voraus. Konzipiert wurde dieser Workshop von Thomas<br />
Bruhin für das Hyperwerk der FHBB.<br />
Warum gerade <strong>Python</strong>? (und nicht Javascript, PHP,...)<br />
<strong>Python</strong> ist eine sehr einfach zu erlernende Programmiersprache (korrekt: Skriptingsprache)<br />
und ideal als Einstieg in die Welt der Programmierung geeignet. Trotz ihrer Einfachheit bietet<br />
diese Sprache auch die Möglichkeit, komplexe Programme für vielfältige Anwendungsgebiete<br />
zu schreiben.<br />
Javascript und PHP wurden hingegen für den Einsatz in Webprojekten und speziell der<br />
Webprogrammierung entwickelt und eignen sich weniger für die generelle<br />
Applikationsentwicklung.<br />
Schnelle Anwendungs-Entwicklung<br />
(Auszug aus dem Buch Einstieg in <strong>Python</strong> von Thomas Theis, Galileo Computing ISBN 3-<br />
89842-227-5)<br />
<strong>Python</strong> bietet besonders gute Möglichkeiten zur schnellen Entwicklung umfangreicher<br />
Anwendungen, des sogenannten RAD. <strong>Python</strong> vereint zu diesem Zweck folgende Vorteile:<br />
• Einfache, eindeutige Syntax: <strong>Python</strong> ist eine ideale Programmiersprache für<br />
Einsteiger. Sie beschränkt sich auf einfache, klare Anweisungen. In anderen<br />
Programmiersprachen werden vielfältige Lösungswege für das gleiche Problem<br />
angeboten (Paradebeispiel: PERL), so dass der Entwickler und speziell der<br />
Programmieranfänger verunsichert wird.<br />
• Klare Strukturen: Ein Entwickler wird in <strong>Python</strong> gezwungen, in einer gut lesbaren<br />
Struktur zu schreiben. Die Anordnung der Programmzeilen ergibt die logische<br />
Struktur des Programms.<br />
• Wiederverwendung von Code: Die Modularisierung, d.h. die Zerlegung eines<br />
Problems in Teilprobleme und die anschliessende Zusammenführung der Teillösungen<br />
zu einer Gesamtlösung (die Applikation oder das Programm), wird in <strong>Python</strong> sehr<br />
leicht gemacht. Die vorhandenen Teillösungen können sehr unkompliziert für weitere<br />
Aufgabenstellungen genutzt werden, so dass der Entwickler nach einiger Zeit über<br />
einen umfangreichen Pool an Modulen verfügt.<br />
• Objekt-Bearbeitung: In <strong>Python</strong> werden alle Daten als Objekte gespeichert. Dies führt<br />
zu einer einheitlichen Daten-Behandlung für Objekte unterschiedlichen Typs.<br />
Andrerseits wird die physikalische Speicherung der Objekte von <strong>Python</strong> automatisch,<br />
ohne Eingriff des Entwicklers vorgenommen. Er muss sich nicht um die Reservierung<br />
bzw. Freigabe geeigneter Speicherbereiche kümmern.<br />
• Interpreter / Compiler: <strong>Python</strong>-Programme werden un<strong>mit</strong>telbar interpretiert, d.h.<br />
ausgeführt (eine Eigenschaft praktisch aller Skriptingsprachen!). Sie müssen nicht erst<br />
kompiliert und gebunden werden, wie dies Code in traditionellen<br />
3
Programmiersprachen wie C, C++ oder Pascal verlangt. Dies ermöglicht einen nicht<br />
zu unterschätzenden häufigen, schnellen Wechsel zwischen Codierungs- und<br />
Testphase.<br />
• Betriebsystem-Unabhängigkeit: Sowohl Programme die von der Kommandozeile<br />
aus bedient werden, als auch Programme <strong>mit</strong> grafischen Benutzeroberfl&aum;chen<br />
können auf unterschiedlichen Betriebsystemen (Windows, Unix, Mac OS) ohne Neu-<br />
Entwicklung und Anpassung eingesetzt werden.<br />
4
<strong>Python</strong>: kurz und bündig<br />
<strong>Python</strong> ist eine Skriptingsprache die immer mehr an Popularität gewinnt. Entwickelt wurde<br />
<strong>Python</strong> (benannt nach Monty <strong>Python</strong>) Anfang der 90er Jahre vom Niederländer Guido van<br />
Rossum und wird von ihm und seiner Gefolgschaft gerne als das bessere Perl angesehen. Die<br />
Wahrheit ist, dass das was <strong>mit</strong> <strong>Python</strong> gelöst werden kann aber auch genauso gut <strong>mit</strong> Perl<br />
gelöst werden kann und umgekehrt.<br />
Grosser Unterschied ist jedoch, dass <strong>Python</strong> neben seinen Skriptingqualitäten vollkommen<br />
objektorientiert konzipiert wurde, d.h. <strong>Python</strong> ist eine objektorientierte Skriptingsprache.<br />
Diese Objektorientiertheit verhalf der Sprache auch zum Erfolg und sie wird z.B. eingesetzt<br />
um Applikationserver wie Zope oder Groupwaresysteme wie BSCW zu entwickeln.<br />
<strong>Python</strong> ist Open Source und Freeware und läuft auf sehr vielen Computerplattformen -> der<br />
Sourcecode ist portabel. <strong>Python</strong> hat sehr viel von der freien Perlform (ist ebenfalls<br />
interpretiert) übernommen, ist handkehrum aber strukturiert wie eine traditionelle<br />
Programmiersprache. Tatsache ist, dass <strong>Python</strong> den Programmierer zu strukturiertem<br />
<strong>Programmieren</strong> anleitet.<br />
Sprachdesign (für Programmierer und Geeks):<br />
<strong>Python</strong> ist eine minimalistische Sprache. Das Referenz Manual gleicht von seinem Umfang<br />
her eher dem von Pascal. Guido van Rossum akkumulierte keine Features, sondern<br />
konzentrierte sich auf wenige Prinzipien:<br />
• Sparsamkeit durch Orthogonalität: Es gibt nur eine begrenzte Zahl von -<br />
leistungsfähigen und kombinierbaren - Konstrukten, Grunddatentypen und<br />
Standardfunktionen.<br />
• Abgestufte Strukturierungs<strong>mit</strong>tel: auf mehreren Ebenen strukturierbar durch Module,<br />
Klassen, Funktionen und Codeblocks.<br />
• Programmkomponenten: dynamische Datenobjekte. Die strukturellen Einheiten von<br />
Programmen sind selbst solche Objekte. Sie lassen sich inspizieren, manipulieren, zur<br />
Laufzeit erzeugen und generell wie andere Daten handhaben.<br />
• Konsistente Erweiterbarkeit: Werkzeuge für spezielle Anwendungsgebiete sind nicht<br />
fest in die Sprache integriert, sondern Erweiterungsmodule realisieren sie; wobei die<br />
vorhandenen Konstrukte und Standardfunktionen auf neue Objektklassen übertragbar<br />
sind.<br />
Die Sparsamkeit der Ausstattung und die abgestufte Struktur machen <strong>Python</strong> zu einem<br />
akzeptablen Werkzeug des Software-Engineering. Nichts an <strong>Python</strong> ist grundsätzlich neu. Das<br />
Geniale liegt in einer gelungenen Auswahl von Ideen, die aus zum Teil weit ausserhalb des<br />
Mainstream verlaufenden Entwicklungen stammen. In gewisser Weise bietet <strong>Python</strong> Lisp<br />
ohne Klammern und Smalltalk ohne die komplexe Objektorientiertheit. Auch die regulären<br />
Ausdrücke, die die Perl-Anhänger so schätzen, stehen (in Form des re-Moduls) zur<br />
Verfügung. Weitere Module bieten Zugang zu wichtigen Internet-Diensten beziehungsweise -<br />
Protokollen der Transport- und Anwendungsebene.<br />
5
Einrückungen:<br />
Eine Besonderheit von <strong>Python</strong> ist - und dies unterscheidet die Sprache auch von allen anderen<br />
-, dass Blöcke durch Einrückung gekennzeichnet werden. Ein Block ist eine Folge von<br />
zusammengehörenden Anweisungen (Befehle). Die meisten anderen Programmiersprachen<br />
benützen Klammern in irgendeiner Form (meistens geschweifte Klammern), um Blöcke zu<br />
kennzeichnen.<br />
Für <strong>Python</strong> heisst das nun, dass zusammengehörige Anweisungen auf der gleichen<br />
Einrückungsebene stehen müssen, zum Beispiel:<br />
n = 9<br />
r = 1<br />
while n > 0:<br />
r = r * n<br />
n = n - 1<br />
print "Das war's"<br />
Einsatzbereich:<br />
Neben Internetprogrammierung eignet sich <strong>Python</strong> auch hervorragend zur Anbindung von<br />
Datenbanken - Module zur Anbindung an die bekanntesten Datenbanken werden <strong>mit</strong>geliefert<br />
- für GUI Entwicklungen sowie für Rapid Prototyping.<br />
Aufgrund der sehr guten XML Unterstützung, wird <strong>Python</strong> auch oft als Bindeglied für die<br />
XML-Datenverarbeitung und Visualisierung genommen.<br />
<strong>Python</strong> Scripts werden in eigenen Dateien gespeichert (<strong>mit</strong> Endung .py), im Falle von CGIs<br />
müssen diese ausführbaren Sripts auch noch in einem speziellen Verzeichnis auf dem Server<br />
gespeichert werden -> meist das cgi-bin Verzeichnis. Ebenfalls muss auf dem Server der<br />
<strong>Python</strong>interpreter installiert sein, denn <strong>Python</strong>skripts werden erst beim Aufruf<br />
abgearbeitet/übersetzt.<br />
Merkmale:<br />
1. <strong>Python</strong> ist Open Source, gut getestet und wird durch eine aktive Entwicklergemeinde<br />
weiterentwicklet.<br />
2. Basics sind relativ einfach und schnell erlernbar.<br />
3. Sprachkonstruktion zwingt zur strukturierten Programmierung!<br />
4. Objektorientierung: Da Skriptingsprache hervorragend als Einstiegssprache in die<br />
objektorientierte Programmierung geeignet.<br />
5. XML Unterstützung: Hervorragende XML Unterstützung, darum auch gute Wahl<br />
wenn es um die Bearbeitung von XML Datenstrukturen geht.<br />
6. Datenbankanbindung: Datenbankadapter für praktisch alle Datenbanken verfügbar.<br />
7. Webeinsatz: Browserunabhängig, <strong>Python</strong> kann von jedem Webbrowser dargestellt<br />
werden, solange es der Server unterstützt.<br />
6
<strong>Python</strong>: Werte und Variablen<br />
Wie jede halbwegs vernünftige Programmiersprache so besitzt auch <strong>Python</strong> die Möglichkeit<br />
<strong>mit</strong> Variablen und Zuweisungen zu arbeiten. Der wohl häufigst gebrauchte Befehl in <strong>Python</strong><br />
ist die Zuweisung, d.h. wir weisen einer Variablen einen Wert zu.<br />
Variablen sind Platzhalter denen irgendein Wert zugewiesen werden kann, der im Laufe des<br />
Programms auch manipuliert werden kann und auf dessen Inhalt (Wert) wir <strong>mit</strong> dem<br />
Variablennamen zugreifen können.<br />
Einfacher gesagt: Variablen sind Gefässe in die wir beliebigen Inhalt füllen können. Diesen<br />
Inhalt können wir manipulieren (hinzufügen, wegnehmen etc.).<br />
Variablennamen:<br />
Der Name einer Variablen kann (fast) frei gewählt werden. Es gelten die folgenden Regeln:<br />
• Variablen beginnn <strong>mit</strong> einem Buchstaben oder dem Unterstrich (_) Zeichen. Darauf<br />
kann eine beliebige Kombination aus Buchstaben, Zahlen oder Unterstrichen folgen.<br />
• Der Name darf nicht <strong>mit</strong> einer Zahl beginnen!<br />
• Variablennamen dürfen nicht einem reservierten Wort der Programmiersprache<br />
entsprechen.<br />
• <strong>Python</strong> ist «case sensitive», das heisst es wird zwischen Gross- und Kleinschreibung<br />
unterschieden. Variablennamen, Anweisungen etc. sollten immer genau so<br />
geschrieben werden wie vordefiniert.<br />
Zuweisungen (Assignment):<br />
Eine Variable ist ein Name der einen Wert repräsentiert. Durch die Zuweisung (assigment<br />
statement) wird eine Variable angelegt und ihr ein Wert zugewiesen.<br />
message = "wie geht es dir?"<br />
zahl = 17<br />
pi = 3.14159<br />
Hier haben wir drei Variablen denen jeweils ein anderer Wert (<strong>mit</strong> anderem Datentyp)<br />
zugewiesen wird. Im ersten Beispiel weisen wir der Variablen message den Wert wie geht<br />
es dir in Form einer Zeichenkette zu. Im zweiten Fall der Variable zahl den (Ganz-)<br />
Zahlwert 17 und im dritten Beispiel der Variablen pi den Fliesskommawert 3.14159<br />
Werte und Typen:<br />
Werte sind der eigentlich Inhalt der in einer Variablen gespeichert wird und sind<br />
logischerwiese Fundamental. Werte können auch vereinfacht als die eigentlichen Daten<br />
angesehen werden die wir verarbeiten wollen, d.h. ohne Werte keine Datenverarbeitung. Und<br />
wo keine Daten sind braucht es auch kein Programm.<br />
Werte können Zahlen, Fliesskommazahlen, Zeichenketten, Objekte etc. sein.<br />
Eine <strong>Python</strong>variable hat keinen festgelegten Typ und es muss ihr auch kein solcher explizit<br />
zugewiesen werden, es können ihr alle verschiedenen Datentypen zugewiesen werden. Und<br />
im Verlaufe des Programms kann auch der Datentyp des Inhalts gewechselt werden durch<br />
simple Zuweisung eines anderen Werts.<br />
7
<strong>Python</strong>: Kommentare, Ein- und Ausgabe<br />
Kommentare:<br />
Kommentare sind ein wichtiges Hilfs<strong>mit</strong>tel um Programmcode zu dokumentieren. In <strong>Python</strong><br />
werden Kommentare <strong>mit</strong> dem Hashzeichen # gekennzeichnet, d.h. alles von diesem Zeichen<br />
an bis zum Ende der Zeile gilt als Kommentar und wird nicht ausgeführt.<br />
Als Ausnahme gilt der Fall, wenn das Kommentarzeichen innerhalb einer Zeichenkette steht.<br />
Dann ist es ein Zeichen der Zeichenkette und wird nicht als Kommentar gewertet.<br />
#Zahl 5 der Variablen x zuweisen<br />
x = 5<br />
y = 3 # Zahl 3 der Variablen y zuweisen<br />
blah = "# Das ist kein Kommentar"<br />
Ein- und Ausgabe:<br />
Praktisch jedes Program gibt irgendetwas, z.Bsp. das Resultat einer Berechnung, auf dem<br />
Bildschirm aus. In <strong>Python</strong> steht uns hierfür die Anweisung print() zur Verfügung, die Text<br />
oder Werte von Variablen auf dem Bildschirm ausgibt.<br />
Um Daten vom Benutzer anzufordern gibt es in <strong>Python</strong> die zwei Anweisungen:<br />
1. input()<br />
2. raw_input()<br />
Die Funktion input() nimmt nur Zahlenwerte entgegen, die Funktion raw_input() nur<br />
Zeichenketten. Es ist also wichtig, dies bei der Programmentwicklung zu berücksichtigen,<br />
sonst kann es zu unangenehmen Fehlern kommen.<br />
#Umrechnung Euro in CHF<br />
kurs = 1.4865<br />
print "Bitte geben Sie einen Betrag in Euro ein:"<br />
eurobetrag = input()<br />
chfbetrag = kurs * eurobetrag<br />
print "Dies sind in CHF:"<br />
print chfbetrag<br />
Verkettung von Ausgaben:<br />
Die Anweisung print() erlaubt uns auch mehrerer Ausgaben in einer Zeile zu machen. Die<br />
einzelnen Teile der Ausgabe werden durch Kommata voneinander getrennt. Unser<br />
obenstehendes Programm lässt sich also folgendermassen ändern:<br />
#Umrechnung Euro in CHF<br />
kurs = 1.4865<br />
print "Bitte geben Sie einen Betrag in Euro ein:"<br />
eurobetrag = input()<br />
chfbetrag = kurs * eurobetrag<br />
print "Dies sind in CHF:", chfbetrag<br />
Kommentierte Eingabe:<br />
8
Die Funktionen input() und raw_input() können auch noch einen optionalen Parameter<br />
entgegen nehmen. Dabei handelt es sich um eine Zeichenkette, die einen Kommentar zur<br />
Eingabe beinhalten sollte. Dies erspart eine print-Anweisung.<br />
#Umrechnung Euro in CHF<br />
kurs = 1.4865<br />
eurobetrag = input("Bitte geben Sie einen Betrag in Euro ein:")<br />
chfbetrag = kurs * eurobetrag<br />
print "Dies sind in CHF:", chfbetrag<br />
9
<strong>Python</strong>: Datentypen<br />
Wie wir gesehen haben können Werte/Daten einen Typ haben, z.B. Ganzzahl,<br />
Fliesskommazahl, Zeichenkette etc. Diese Typen nennt man Datentypen.<br />
Die folgenden Datentypen können in <strong>Python</strong> verwendet werden:<br />
• numerische Konstanten<br />
• sequentielle Datentypen<br />
• None<br />
Numerische Konstanten:<br />
Fünf numerische Typen werden von <strong>Python</strong> unterstützt:<br />
1. Integer-Werte (Ganzzahlwerte)<br />
2. Long-Integer-Werte<br />
3. Fliesskommazahlen bzw. Dezimalzahlen<br />
4. Oktal- und Hexadezimalzahlen<br />
5. Komplexe Zahlen<br />
Integer Werte:<br />
Bei den Integer-Werten handelt es sich um alle ganzen Zahlen, die im Bereich von -<br />
2147483647 und 2147483647 liegen. Wenn wir Werte verwenden, die diesen Bereich unteroder<br />
überschreiten, oder wenn wir Ausdrücke verwenden, deren Resultat den Bereich verlässt,<br />
dann erhalten wir eine (<strong>Python</strong>-)Fehlermeldung<br />
Integer-Zahlen dürfen nicht <strong>mit</strong> der Zahl Null beginnen, da sie sonst als Oktalzahl interpretiert<br />
werden.<br />
Beispiel<br />
123 123<br />
-3456 -3456<br />
2147483647 2147483647<br />
Ergebnis der Auswertung<br />
Long-Integer Werte:<br />
Bei den Long-Integer-Werten handelt es sich ebenfalls um ganzen Zahlen, die jedoch den<br />
Bereich der Integer-Werte verlassen und beliebig gross werden können; nur der verfügbare<br />
Arbeits-Speicher des Rechners bildet eine Grenze. Ein Long-Integer-Wert wird durch<br />
Anfügen des Buchstabens "L" (Klein- oder Grossschreibung erlaubt) an die Zahl erzeugt.<br />
99999999999L<br />
2147483648L<br />
Beispiel<br />
99999999999L<br />
2147483648L<br />
9 * 999999999l 8999999991l<br />
Ergebnis der Auswertung<br />
Fliesskommazahlen:<br />
10
Fliesskommazahlen (auch Gleitkomma- oder Dezimalzahlen genannt) sind positive und<br />
negative reelle Zahlen, deren Kommastelle durch einen Dezimalpunkt zu kennzeichnen ist.<br />
Bei grösseren Werten kann auch der Übersichtlichkeit halber die wissenschaftliche Notation<br />
verwendet werden, d.h. wir können den Buchstaben "e" oder "E" einfügen.<br />
Beispiel<br />
-3.14 -3.14<br />
3.14e-1 0.314<br />
3.14e+10 31400000000.0<br />
4E5 400000.0<br />
4.0e+210 4e+210<br />
Ergebnis der Auswertung<br />
Oktal- und Hexadezimalzahlen:<br />
Oktal- und Hexadezimalzahlen können nicht nur Dezimalzahlen sondern auch Oktal- und<br />
Hexadezimalzahlen in Ausdrücken verwenden, d.h. Zahlen zur Basis 8 oder zur Basis 16.<br />
Oktalzahlen beginnen <strong>mit</strong> einer Null ("0"), Hexadezimalzahlen beginnen <strong>mit</strong> "0X" oder "0x".<br />
Beispiel<br />
010 8<br />
05 5<br />
0x10 16<br />
0X15 21<br />
0X2F 47<br />
Ergebnis der Auswertung<br />
Komplexe Zahlen:<br />
Komplexe Zahlen wurden <strong>mit</strong> <strong>Python</strong> 1.4 eingeführt und bestehen aus einem Real- und einem<br />
Imaginärteil. In <strong>Python</strong> sieht eine komplexe Zahl so aus: Realteil+Imaginärteil. Die Zahl wird<br />
von einem "J" oder "j" abgeschlossen. Vor diesem Buchstaben muss auf jeden Fall eine Wert<br />
stehen, sonst wird "j" oder "J" als Variable interpretiert.<br />
Um Berechnung <strong>mit</strong> komplexen Zahlen durchführen zu könen müssen wir das spezielle<br />
Modul cMath importieren und die Methoden aus diesem Modul anwenden.<br />
Beispiel<br />
6+6j (6+6j)<br />
6.9+0j<br />
1j<br />
(6.9+0j)<br />
1j<br />
Ergebnis der Auswertung<br />
Sequentielle Datentypen:<br />
<strong>Python</strong> unterstützt vier sogenannte sequentielle Datentypen:<br />
1. Zeichenketten / Strings<br />
11
2. Listen<br />
3. Dictionaries<br />
4. Tupel<br />
Dabei handelt es sich um verschiedenartige Sammlungen von Objekten. Die einzelnen<br />
Elemente dieser Datentypen sind indiziert, das heisst, jedes Element besitzt eine<br />
Positionsnummer. In <strong>Python</strong> beginnt deren Nummerierung bei Null, wie in den meisten<br />
anderen Programmiersprachen auch. Das erste Element einer Sequenz hat also immer den<br />
Index 0.<br />
Zeichenketten / Strings:<br />
Strings sind Zusammenfassungen von Zeichen zu einer Zeichenkette. Eine Zeichenkette kann<br />
aus mehreren Zeichen, aus nur einem Zeichen aber auch aus keinem Zeichen bestehen. In<br />
einer Zeichenkette kann im Prinzip alles enthalten sein, das sich in irgendeiner Weise in Text<br />
umwandeln lässt.<br />
Zeichenketten sind nicht veränderbare Folge von Zeichen (eigentlich: von Bytes). Einfache<br />
Zeichenkettenkonstanten (short strings) werden durch einfache (') oder doppelte (")<br />
Anführungszeichen eingefasst - das jeweils andere Zeichen kann dann innerhalb des Strings<br />
verwendet werden. Eine leere Zeichenkette wird durch zwei nebeneinanderstehende einfache<br />
(oder doppelte) Anführungszeichen erzeugt. Zeichenketten müssen auf der gleichen Zeile<br />
enden, auf der sie begonnen haben (die Ausnahmenregelung lernen wir noch kennen).<br />
Will man Steuerzeichen oder andere Sonderzeichen in einem String haben, muss man sie <strong>mit</strong><br />
einem Backslash (\) maskieren. Diese Escapesequenzen unterliegen folgender Regel:<br />
Maximal 3 Oktalziffern und genau zwei Hexadezimalziffern. Weiterhin können eine Reihe<br />
von Kürzeln für Escapesequenzen verwendet werden (siehe untenstehende Tabelle). In<br />
Unicode-Objekten ist zusätzlich noch die \u-Sequenz und \N-Sequenz erlaubt.<br />
Escapezeichen<br />
\\ Backslash<br />
\'<br />
einfaches Anführungszeichen<br />
\" doppeltes Anführungszeichen<br />
\n Zeilenvorschub<br />
\b Rückschritt<br />
\f Seitenvorschub<br />
\r Wagenrücklauf<br />
\v Vertikaler Tabulator<br />
\a Klingel<br />
12<br />
Bedeutung<br />
\0 ... \7 Oktalwert des Zeichens (maximal drei Ziffern)<br />
\x Hexadezimalwert des Zeichens (zwei Ziffern Hexadezimal)<br />
\u<br />
Unicodewert des Zeichens (4 Hexadezimalzeichen, nur in<br />
Unicodeobjekten erlaubt)<br />
\U Unicodewert des Zeichens (8 Hexadezimalzeichen)<br />
\N{Zeichenname}<br />
Zeichen <strong>mit</strong> dem angegebenen universal character name, beispielsweise<br />
\N{WHITE SMILING FACE}
Listen:<br />
Eine Liste ist eine veränderbare Sammlung von Objekten verschiedener Datentypen zu einem<br />
Objekt (vergleichbar <strong>mit</strong> einem Array in anderen Programmiersprachen). Im Gegensatz zu<br />
Zeichenketten können also nicht nur Zeichen in einer Liste vorhanden sein, sondern auch<br />
andere Objekte, wie z.B. Fliesskommazahlen oder auch andere Listen.<br />
Eine Liste wird durch eckige Klammern eingeschlossen ([]); die einzelnen Elemente sind<br />
durch Kommas voneinander getrennt. Listen können geschachtelt werden, d.h. eine Liste<br />
kann eine andere Liste als Element enthalten.<br />
Beispiel<br />
13<br />
Erklärung<br />
[] Leere Liste, die keine Elemente enthält<br />
[1, 3.5, "Zeichenkette",<br />
10]<br />
[1, 3.5, ["Internet",<br />
"Intranet"]]<br />
Dictionaries:<br />
Liste <strong>mit</strong> 4 Elementen: Integer, Fliesskommazahl, String,<br />
Integer<br />
Liste <strong>mit</strong> 3 Elementen wobei das dritte Elemente eine weitere<br />
Liste <strong>mit</strong> Zeichenketten als Elemente ist.<br />
Dictionaries stellen eine Sammlung von Schlüssel- und Wertepaaren dar. Ein Dictionary ist<br />
also eine Liste aus Schlüssen (keys), denen jeweils ein Wert (value) zugewiesen ist. Schlüssel<br />
können numerische Konstanten, Zeichenketten, Tupel, und einige konstante Objekte sein. Als<br />
Wert sind alle in <strong>Python</strong> gültigen Datentypen zulässig.<br />
Ein Dictionary ist in geschweifte Klammern eingeschlossen; Elemente sind durch Komams<br />
voneinander getrennt:<br />
{ Schlüssel1: Wert1, Schlüssel2:Wert2, Schlüssel3:Wert3 }<br />
Man kann sich Dictionaires wie ein einfaches Wörterbuch vorstellen, in dem ein Element aus<br />
einem Fremdwort (= der Schlüssel) sowie dem zugehörigen Begriff (= der Wert) besteht:<br />
{ house: Hause, coffee:Kaffee, beer:Bier }<br />
Dictionaries können geschachtelt werden, also andere Dictionaries enthalten.<br />
Beispiel<br />
{} Leerer Dictionary<br />
{ 1:'Goethe',<br />
2:'Schiller', 3:5.67}<br />
{ 1:'wow',<br />
2:{'inter':'net'}}<br />
Tupel:<br />
Erklärung<br />
Dictionary <strong>mit</strong> 3 Elementpaaren<br />
Dictionary <strong>mit</strong> 2 Elementpaaren wobei das zweite Elemente<br />
einen weitere Dictionary <strong>mit</strong> einem Elementpaar ist.<br />
Ein Tupel ist eine Sammlung von Objekten verschiedener Datentypen zu einem Objekt. Im<br />
Gegensatz zu einer Liste ist die Folge der Elemente dabei nicht veränderbar. Die Elemente<br />
werden durch Kommas voneinander getrennt, das gesamte Tupel ist in runde Klammern<br />
einzuschliessen.<br />
Beispiel<br />
Erklärung<br />
() Leeres Tupel, das keine Elemente enthält
(1,)<br />
Beispiel<br />
('Oster',<br />
'hase')<br />
Erklärung<br />
Tupel <strong>mit</strong> einem Element. beachte das zwingend notwendige Komma als<br />
Trennzeichen. Ohne dieses würde der Ausdruck als Zahl gewertet.<br />
Tupel <strong>mit</strong> 2 (Zeichenketten-) Elementen<br />
(1, 2, 3) Tupel <strong>mit</strong> drei (Integer-) Elementen<br />
None:<br />
Der Datentyp None hat in <strong>Python</strong> nur einen einzigen Wert: None. Er dient als Platzhalter für<br />
Variablen, die eigentlich keinen Wert haben sollen. Funktionen, die keinen Wert<br />
zurückgeben, haben implizit None als Rückgabewert. Wenn der interaktive Interpreter einen<br />
Ausdruck auswertet, gibt er ihn nur aus, wenn der Rückgabewert nicht None ist.<br />
14
<strong>Python</strong>: Ausdrücke und Operatoren<br />
Ein Ausdruck wird duch folgendes Kennzeichen definiert: Er besitzt einen Wert. Im<br />
einfachsten Fall besteht ein Ausdruck lediglich aus einem Literal oder einer Variablen. Dann<br />
entspricht der Wert des Ausdrucks dem Wert des Literals bzw. der Variablen.<br />
Literale und Variablen können aber auch durch Literale und Variablen verknüpft werden.<br />
Dadurch entstehen zusammengesetzte Ausdrücke. Der Wert eines zusammengesetzten<br />
Ausdrucks kann entweder ein Zahlen-, ein Zeichenketten- oder ein Wahrheitswert sein.<br />
Ausdruck Art Wert Typ<br />
7 einfach 7 Zahl<br />
true einfach true Wahrheitswert<br />
-7 zusammengesetzt -7 Zahl<br />
7 + 5 zusammengesetzt 12 Zahl<br />
7 > 5 zusammengesetzt true Wahrheitswert<br />
x = (9 + 12) / 7 zusammengesetzt 3 Zahl<br />
Operatoren:<br />
Operatoren verknüpfen Literale, Variablen oder Teilausdrücke zu grösseren Ausdrücken.<br />
Operatoren unterscheiden sich in der Anzahl der Operatoren<br />
1. Unäre Operatoren: ein Operand<br />
2. Binäre Operatoren: zwei Operanden<br />
3. Ternäre Operatoren: drei Operanden<br />
Arithmetische Operatoren<br />
haben als Operanden Zahlenwerte und liefern ebenfalls einen Zahlenwert als Ergebnis. Bei<br />
Verwendung mehrer arithemtischer Operatoren gilt die Regel: Punkt- vor Strichrechnung,<br />
d.h. Multiplikation und Division werden vor Addition und Subtraktion ausgeführt, bei<br />
gleicher Hierarchiestufe gilt Abarbeitung von links nach rechts.<br />
Operator Syntax Beispiel Wert<br />
Grundrechenarten<br />
+ summand1 + summand2 7 + 4 11<br />
- minuend1 - minuend2 7 - 4 3<br />
* faktor1 * faktor2 7 * 4 28<br />
Division: hier gibt es ein paar Besonderheiten<br />
/ dividend / divisor 7 / 4 1 (!!!!!)<br />
/ dividend / divisor 7 / 4.0 1.75<br />
// dividend // divisor (Restlose Division) 7 // 4 1<br />
ab <strong>Python</strong> 3.0 wird / zur echten Division umgewandelt d.h. auch bei Ganzzahlendivision wird<br />
ein Rest ausgegeben<br />
15
Operator Syntax Beispiel Wert<br />
/ dividend / divisor 7 / 4 1.75<br />
Modulo: liefert den Rest einer Ganzzahldivision<br />
% dividend % divisor 7 % 4 3<br />
Negation: unärer Operator, der das Vorzeichen eines Zahlenwertes invertiert.<br />
- -operand -(2 + 5) -7<br />
16<br />
-(2 - 5) 3<br />
Identität: unärer Operator, liefert immer den positiven Wert einer Zahl sofern diese positiv ist<br />
ansonsten den negativen Wert.<br />
+ +operand x = 12 -> +x 12<br />
Potenz:<br />
x = -12 -> +x -12<br />
** basis ** faktor 12 ** 6 2985984<br />
Funktionen für Zahlenwerte:<br />
Operator Funktion Beispiel Wert<br />
abs(x) Betrag von x abs(-12) 12<br />
int(x) Umwandlung von x in einen Integerwert int(12.6) 12<br />
long(x) Umwandlung von x in einen Longintegerwert long(12.6) 12L<br />
float(x) Umwandlung von x in eine Fliesskommazahl float(12) 12.0<br />
complex(re,<br />
im)<br />
divmod(x,y)<br />
Umwandlung in eine komplexe Zahl<br />
liefert den ganzzahligen Teil und den ganzzahligen<br />
Rest als Tupel<br />
complex(4,<br />
3)<br />
(4+3j)<br />
divmod(12,5) (2, 2)<br />
pow(x,y) Potenz y zur Basis x pow(12,6) 2985984<br />
Logische Operatoren<br />
Logische Operatoren haben als Operanden Wahrheitswerte und liefern ebenfalls<br />
Wahrheitswerte als Ergebnis. Mit Hilfe der logischen Operatoren UND (AND), ODER (OR)<br />
und NICHT (NOT) können mehrere Bedingungen <strong>mit</strong>einander verknüpft werden.<br />
Operator Syntax Beispiel Wert<br />
Logisches UND: verknüpft 2 Wahrheitswerte <strong>mit</strong>einander<br />
and operand1 and operand2 true and true true<br />
Logisches ODER: verknüpft 2 Wahrheitswerte <strong>mit</strong>einander<br />
true and false<br />
false and true<br />
false and false<br />
or operand1 or operand2 true or true true<br />
false<br />
false<br />
false
Operator Syntax Beispiel Wert<br />
true or false<br />
false or true<br />
false or false<br />
Logisches NICHT: unärer Operator. Invertierung des Wahrheitswertes<br />
true<br />
true<br />
false<br />
not not operand1 not true false<br />
Bitweise Operatoren<br />
Bitweise Operatoren sind vorallem für Low-Level Programmierer interessant, lassen sich<br />
hierdurch doch Zahlenwerte direkt im Speicherberich manipulieren. <strong>Python</strong> stellt hierzu die<br />
bitweisen Operatoren: AND (&), OR (|), sowie XOR (^) zur Verfügung. Ebenfalls die<br />
Verschieboperatoren >> und operand1 > operand2 "Zehn" > "10" true<br />
= 7 false<br />
true<br />
17
Achtung: Die Verwechslung des Zuweisungsoperatoren = <strong>mit</strong> dem Vergleichsoperator == ist<br />
die Ursache vieler, schwer zu entdeckender Programmfehler. Vergewissere dich darum<br />
jedesmal, dass du den richtigen Operator ausgewählt hast.<br />
Zeichenketten, Listen und Tupel Operatoren<br />
Operator Funktion Beispiel Wert<br />
= Zuweisung x = 12<br />
+ Konkatenation "Ein" + " Beispiel"<br />
"Ein<br />
Beispiel"<br />
* Wiederholung 2 * "Du" Du Du<br />
in enthalten in 1 in [1,2] 1<br />
not in nicht enthalten in 3 not in [1,2] 1<br />
for ... in<br />
...:<br />
Zählschleife<br />
X[i]<br />
X[i:j]<br />
Indizierung, liefert Element aus X an<br />
der Stelle i (Zählung beginnt bei 0)<br />
Slicing, liefert aus X Unterelement von i<br />
bis j-1 zurück (Zählung beginnt bei 0)<br />
for x in [1,2]:<br />
print "hallo"<br />
x = "hallo"<br />
x[1]<br />
x = "hallo"<br />
x[0:3]<br />
len(s) Länge len("hallo") 5<br />
min(s) kleinstes Element min("hallo") a<br />
max(s) grösstes Element max("hallo") o<br />
abkürzende Schreibweisen bei Zuweisungen:<br />
+=<br />
-=<br />
*=<br />
/=<br />
%=<br />
Arithmetische Zuweisungen<br />
variable += ausdruck<br />
variable -= ausdruck<br />
variable *= ausdruck<br />
variable /= ausdruck<br />
variable %= ausdruck<br />
hallo<br />
hallo<br />
a<br />
hal<br />
v = v + a<br />
v = v - a<br />
v = v * a<br />
v = v / a<br />
v = v % a<br />
+= Zeichenketten-Zuweisung variable += ausdruck v = v + a<br />
18
<strong>Python</strong>: Programmfluss<br />
In <strong>Python</strong> werden alle Anweisungen normalerweise in der Reihenfolge, in der sie<br />
aufgeschrieben wurden, bearbeitet. In sehr vielen Situationen ist eine solche lineare<br />
Vorgehensweise aber nicht erwünscht. Dies ist zum Beispiel der Fall, wenn ein bestimmter<br />
Teil des Skripts nur dann ausgeführt werden soll, wenn eine gewisse Bedingung erfüllt ist.<br />
Auch falls ein Teil eines Skripts mehrfach ausgeführt werden soll, muss vom linearen<br />
Programmablauf abgewichen werden.<br />
<strong>Python</strong> stellt für die bedingte Ausführung das Konstrukt if-else sowie in erweiterter Form<br />
if-elif-else zur Verfügung. Und für die wiederholte Ausführung die Schleifen-Konstrukte<br />
for und while.<br />
Vielfach wird im Zusammenhang <strong>mit</strong> der Ausgabe von wiederholten Anweisungen - print<br />
Statements innerhalb einer Schleife - auch noch auf die formatierte Ausgabe<br />
zurückgegriffen, welche ich am Ende dieses Abschnitts gerne vorstellen möchte.<br />
Verzweigungen (Bedingte Ausführung)<br />
Zur Steuerung eines Programmablaufs werden häufig Verzweigungen benötigt. Innerhalb des<br />
Programms wird dann aufgrund einer Bedingung entschieden, welcher Zweig des Programms<br />
ausgeführt werden soll.<br />
Bedingungen werden <strong>mit</strong> Hilfe von Vergleichsoperatoren formuliert.<br />
Einfache Verzweigung:<br />
Sollen bestimmte Abschnitte eines Programms nur unter gewissen Bedingungen (etwa einer<br />
bestimmten Eingabe des Benutzers) ausgeführt werden, stellt uns <strong>Python</strong> das if-else Konstrukt<br />
zur Verfügung. Im folgenden Beispiel wird untersucht, ob eine Variable grösser als 0 ist.<br />
Wenn dies der Fall ist, so wird ausgegeben: Diese Zahl ist grösser als 0, ansonsten wird<br />
ausgebeben: Dies Zahl ist kleiner als 0<br />
x = 12<br />
if x > 0:<br />
print "Diese Zahl ist grösser als 0"<br />
else:<br />
print "Diese Zahl ist kleiner als 0"<br />
Mehrfache Verzweigung:<br />
In vielen Anwendungsfällen gibt es mehr als zwei Möglichkeiten, zwischen denen<br />
entschieden wird. Dazu wird eine mehrfache Verzweigung benötigt.<br />
Im folgenden Beispiel wird untersucht, ob eine Variable grösser als 0, kleiner als 0 oder<br />
gleich 0 ist und entsprechend kommentiert.<br />
x = 12<br />
if x > 0:<br />
print "Diese Zahl ist grösser als 0"<br />
19
elif x < 0:<br />
print "Diese Zahl ist kleiner als 0"<br />
else:<br />
print "Bingo, diese Zahl ist auf's Loch 0"<br />
Logische Operatoren:<br />
Mit Hilfe der logischen Operatoren können mehrere Bedingungen <strong>mit</strong>einander verknüpft<br />
werden.<br />
• Eine Bedingung, die aus einer oder mehreren Einzelbedingungen besteht, die <strong>mit</strong> dem<br />
Operator and verknüpft sind, ergibt wahr, wenn jede der Einzelbedingungen wahr<br />
ergibt.<br />
• Eine Bedingung, die aus einer oder mehreren Einzelbedingungen besteht, die <strong>mit</strong> dem<br />
Operator or verknüpft sind, ergibt wahr, wenn eine der Einzelbedingungen wahr<br />
ergibt.<br />
• Der Operator not kehrt den Wahrheitswert einer Bedingung um, d.h., eine falsche<br />
Bedingung wird wahr, eine wahre Bedingung wird falsch.<br />
Ein Beispiel:<br />
x = 12<br />
y = 15<br />
z = 18<br />
#Bedingung 1<br />
if xz:<br />
print "y ist nicht die kleinste Zahl"<br />
#Bedingung 3<br />
if not z>y:<br />
print "z ist nicht grösser als y"<br />
else:<br />
print "z ist grösser als y"<br />
Geschachtelte Verzweigung:<br />
Verzweigungen können auch geschachtelt werden. Dies bedeutet, dass eine Verzweigung eine<br />
weitere Unterverzweigung beinhaltet. Ein Beispiel:<br />
x = -6<br />
if x > 0:<br />
print "Diese Zahl ist grösser als 0"<br />
else:<br />
if x < 0:<br />
print "Diese Zahl ist kleiner als 0"<br />
else:<br />
print "Bingo, diese Zahl ist auf's Loch 0"<br />
20
Schleifen<br />
Neben der Verzweigung gibt es noch eine weitere wichtige Struktur zur Steuerung des<br />
Programmablaufs: die Schleife. Mit Hilfe einer Schleife kann man die wiederholte<br />
Ausführung eines Programmschritts ermöglichen. <strong>Python</strong> stellt uns wie oben erwähnt für die<br />
wiederholte Ausführung die Schleifen-Konstrukte for und while zur Verfügung.<br />
• Man verwendet eine for-Schleife, falls ein Programmschritt für eine regelmässige, zu<br />
diesem Zeitpunkt bekannt Folge von Werten wiederholt ausgeführt werden soll.<br />
• Man verwendet eine while-Schleife, falls sich erst durch Eingaben des Anwenders<br />
ergibt, ob ein Programmschritt wiederholt ausgeführt werden soll.<br />
for-Schleife - Aufbau:<br />
for i in 2, -6, 7.5, 22:<br />
print "Zahl:", i<br />
print "Quadrat:", i*i<br />
Die erste Zeile muss wie folgt gelesen werden: Führe die nachfolgenden eingerückten<br />
Anweisungen für jede Zahl aus der Liste 2, -6, 7.5, 22 aus. Nenne diese Zahl in diesen<br />
Anweisungen i. Natürlich kann auch eine andere Schleifenvariable anstelle i genommen<br />
werden.<br />
Die genannten Zahlen werden zusammen <strong>mit</strong> einem kurzen Informationstext ausgegeben und<br />
anschliessend quadriert und ebenfalls ausgegeben.<br />
Im dargestellten Fall handelt es sich um eine unregelmässige Liste von Zahlen. Meist werden<br />
Schleifen allerdings für regelmässige Listen von Zahlen genutzt. Dabei erweist sich die<br />
Funktion range() als sehr nützlich:<br />
for i in range(3,11,2):<br />
print "Zahl:", i<br />
print "Quadrat:", i*i<br />
Range heisst übersetzt Bereich. Innerhalb der Klammern von range können bis zu drei<br />
Zahlen stehen (jeweils durch Komma getrennt):<br />
1. erste Zahl: gibt den Beginn des Bereichs an<br />
2. zweite Zahl: gibt das Ende des Bereichs an, d.h die erste Zahl für den die Anweisung<br />
nicht mehr ausgeführt wird.<br />
3. dritte Zahl: gibt den Abstand, die Schrittweite der Schleife an. Die Zahlen, für die die<br />
Anweisungen in unserem Beispiel ausgeführt werden, haben einen Abstand von +2<br />
zueinander.<br />
Kurz und bündig: Die Funktion erzeugt eine regelmässige Liste von ganzen Zahlen.<br />
range() kann <strong>mit</strong> einem, zwei oder wie bisher gesehen <strong>mit</strong> drei Parametern aufgerufen<br />
werden. Falls durch die Parameter keine sinnvolle Liste erzeugt werden kann, so wird die<br />
Schleife nicht durchlaufen. Endlosschleifen wie in anderen Programmiersprachen können<br />
nicht erzeugt werden.<br />
Varianten von range():<br />
21
1. Angabe von drei Parametern: Die Liste beginnt beim ersten und endet vor dem<br />
zweiten Parameter, die Schrittweite wird <strong>mit</strong> dem dritten Parameter angegeben.<br />
2. Angabe von zwei Parametern: Die Liste beginnt beim ersten und endet vor dem<br />
zweiten Parameter, als Schrittweite wird 1 angenommen.<br />
3. Angabe von einem Parameter: Die Liste beginnt bei 0 und endet vor dem angegebenen<br />
Parameter, als Schrittweite wird 1 angenommen.<br />
while-Schleife - Aufbau:<br />
summe = 0<br />
while summe < 50:<br />
eingabe = input("Bitte Zahl eingeben ")<br />
summe += eingabe<br />
print "Zwischensumme: ", summe<br />
Zuerst wird die Variable für die Summe der Zahlen auf 0 gesetzt. Die while-Anweisung leitet<br />
die Schleife ein und beudeutet bei uns: Führe die Anweisungen solange aus als die Eingabe<br />
des Anwenders kleiner als 50 ist. D.h die Schleife wird solange wiederholt bis der Anwender<br />
eine Zahl grösser/gleich 50 eingibt.<br />
Merke: Bei einer while-Schleife wird immer angegeben, unter welchen Bedingungen<br />
wiederholt werden soll und nicht, unter welchen Bedingung beendet werden soll.<br />
gezielte Steuerung der Verarbeitung:<br />
<strong>Python</strong> bietet uns ein paar Funktionen, um die Iterationen einer Schleife oder die Ausführung<br />
einer Kondition zu beeinflussen.<br />
Die pass-Anweisung:<br />
Die Anweisung pass bewirkt, dass nichts ausgeführt wird. Dies braucht man zum Beispiel<br />
beim Sketching eines Programms das eine Funktion aufruft. Dann definiert man in einer<br />
ersten Phase zuerst den Funktionsnamen, aber noch die nicht die eigentlichen Arbeitsschritte<br />
die diese Funktion ausführen soll. Der Funktionsaufruf kann bereits an der richtigen Stelle<br />
platziert werden, soll aber noch nicht ausgeführt werden. Die Funktionsdefinition beinhaltet<br />
in dem Fall nur die Anweisung pass.<br />
Oder aber wenn das Programm eine einfache oder mehrfache Verzweigung enthält, bei der in<br />
einem bestimmten Zeig nichts ausgeführt werden soll.<br />
# Funktionsdefinition<br />
def QuadraturDesKreises():<br />
pass<br />
QuadraturDesKreises()<br />
# nur ein Zweig interessant<br />
a, b = -12, 6<br />
if a > 0 and b > 0:<br />
pass<br />
22
else:<br />
print "Eine Zahl ist negativ oder 0"<br />
Schleifensteuerung <strong>mit</strong> break und continue:<br />
Die Anweisungen break und continue bieten weitere Möglichkeiten zur Steuerung von<br />
Schleifen. Die Anweisung break führt zu einem un<strong>mit</strong>telbaren Abbruch der Schleife. Die<br />
Anweisung continue führt un<strong>mit</strong>telbar zum nächsten Durchlauf der Schleife, ohne die<br />
restlichen Anweisungen innerhalb einer Schleife zu beachten. Beide werden sinnvollerweise<br />
<strong>mit</strong> einer Bedingung verbunden und meist bei Sonderfällen eingesetzt.<br />
Im folgenden Beispiel soll der Preis von maximal zehn Tankfüllungen berechnet werden. Der<br />
Benutzer gibt die getankte Literzahl an, das Programm berechnet den Preis und gibt ihn aus.<br />
Falls der Benutzer einen negativen Wert eingibt, wird statt dem Preis eine Fehlermeldung<br />
ausgegeben und bei Eingabe des Werts 0 wird die Schleife vorzeitig beendet.<br />
for i in range(1,11,1):<br />
liter = input(str(i) + ": Wieviele Liter wurden getankt? ")<br />
if liter == 0:<br />
break # Abbruch der Schleife<br />
if liter < 0:<br />
print "Nur positive Werte eingeben"<br />
continue # Zum naechsten Durchlauf<br />
preis = liter * 1.32<br />
print "Die Tankfüllung kostet ", preis<br />
formatierte Ausgabe<br />
Mit Hilfe des Operators % können formatierte Ausgabe-Ausdrücke erzeugt werden. Das<br />
Ergebnis ist eine Zeichenkette, die ganze Zahlen, Zahlen <strong>mit</strong> Nachkommastellen und andere<br />
Zeichenketten in einer vorbestimmten Form <strong>mit</strong> der gewünschten Mindestbreite beinhaltet.<br />
Dies wird meist im Zusammenhang <strong>mit</strong> der Anweisung print benötigt, kann aber auch zur<br />
Ausgabe von Datensätzen fester Länge in einer Datei verwendet werden.<br />
Eine Übersicht:<br />
Formatierung<br />
%i, %o, %x,<br />
%X<br />
%f, %e<br />
Verwendung<br />
Ausgabe von ganzen Zahlen in dezimaler (Integer), oktaler oder<br />
hexadezimaler Form<br />
Ausgabe von Zahlen <strong>mit</strong> Nachkommastellen, und in Exponentialform<br />
%s Ausgabe von Zeichenketten<br />
%% Ausgabe des Prozentzeichens<br />
- Minuszeichen für linksbündige Ausrichtung anstelle rechtsbündig<br />
Beispiele:<br />
print "ganze Zahlen"<br />
for i in range(2,12,2):<br />
quadrat = zahl * zahl<br />
print "%4i %4i" % (zahl, quadrat)<br />
23
# linksbuendig<br />
print "ganze Zahlen"<br />
for i in range(2,12,2):<br />
quadrat = zahl * zahl<br />
print "%-4i %-4i" % (zahl, quadrat)<br />
# als Fliesskommazahlen<br />
print "als Fliesskommazahlen ausgegeben"<br />
for i in range(2,12,2):<br />
quadrat = zahl * zahl<br />
print "%10.2i %10.2i" % (zahl, quadrat)<br />
24
<strong>Python</strong>: Fehlerbehandlung<br />
Ein mächtiges Feature das uns <strong>Python</strong> für die Entwicklung eigener Applikationen zur<br />
Verfügung stellt, ist ein ausgeklügeltes Fehlerbehandlungssystem. Fehler in einem Programm<br />
können immer auftreten, sei diese aufgrund falscher oder fehlerhafter Benutzereingaben,<br />
Systemfehlern, Laufzeitfehler etc. Umso bedenklicher ist es eigentlich dass<br />
Fehlerbehandlungssysteme nur in sehr wenigen Programmiersprachen direkt zur Verfügung<br />
gestellt werden: Java, C++, <strong>Python</strong> - also die objektorientierten Sprachen - besitzen ein<br />
solches, aber zum Beispiel Perl, C und auch die auf dem WWW meistgenutzte Sprache PHP<br />
besitzen (noch) keines -> PHP wird <strong>mit</strong> PHP5 ein solches aufweisen.<br />
Im Computerchargon spricht man bei Fehlern von Bugs, wenn ein Fehler während der<br />
Auführung eines Programms auftritt, spricht man von einer Exception (Ausnahme).<br />
Definition von Exceptions:<br />
Eine wunderschöne Definition fand ich im englischen Buch The quick <strong>Python</strong> Book:<br />
Generating an exception is called raising or throwing an exception.<br />
Detecting a thrown exception, and calling code to act on it, is called catching an exception.<br />
The called code (the code which actually handles the exception) is the exception-handling<br />
code or just exception handler.<br />
In <strong>Python</strong> steht uns für die Ausnahmenbehandlung die try-except-Klausel zur Verfügung.<br />
Im try-Block listen wir die normalen Programmbefehle auf, im except-Block dann was<br />
gemacht werden muss wenn ein Fehler (eine Ausnahme) passiert.<br />
D.h wir geben <strong>Python</strong> an, versuche (engl. try) zuerst den normalen Programmteil<br />
durchzuführen, und wenn ein Fehler auftritt führe den Ausnahmenbereich (engl. except) aus.<br />
Programmabbruch verhindern:<br />
Fangen wir zuerst einfach an. Im folgenden Beispiel wollen wir eine<br />
Fehlerbehandlungsroutine einbauen, die uns erlaubt bei fehlerhaften Benutzereingaben das<br />
Programm sanft und <strong>mit</strong> einem Hinweis zu beenden.<br />
Erinnern wir uns, dass die input-Funktion nur Zahlen entgegennehmen kann, wenn also der<br />
Benutzer Zeichen eingibt, müssen wir dies abfangen und dem Benutzer <strong>mit</strong>teilen.<br />
try:<br />
eingabe = input("Bitte eine Zahl eingeben: ")<br />
print "Du hast die Zahl", eingabe, "richtig eingegeben"<br />
except:<br />
print "falsche Eingabe"<br />
Zuerst wird versucht der normale Programmteil innerhalb des try-Blocks auszuführen. Ist<br />
dies erfolgreich so wird der except-Block übersprungen. Falls allerdings ein Fehler auftritt,<br />
so wird dieser <strong>mit</strong> der except-Anweisung abgefangen und alle Befehle die in diesem Block<br />
stehen ausgeführt. Anschliessend läuft das Programm ohne Abbruch zu Ende, da der Fehler<br />
zwar auftrat aber abgefangen wurde.<br />
Beachte: nur die kritische Stelle wird in die Ausnahmebehandlung eingebettet. Man hat die<br />
25
Möglichkeit, unterschiedliche Fehlerarten in spezifischen except-Blöcken abzufangen. Dies<br />
hat den Vorteil, dass die Fehlermeldung präzisiert werden kann.<br />
Fehler abfangen:<br />
Das oben aufgeführte Beispiel ist zwar schon ein wichtiger Schritt zur erfolgreichen<br />
Fehlerbehandlung, aber aus Sicht des Benutzers sicher noch nicht optimal: Nach einer<br />
falschen Eingabe wird er zwar informiert, hat aber keine Möglichkeit seine Eingabe zu<br />
wiederholen. Wir wollen unser Beispiel also erweitern und den Fehler abfangen aber zugleich<br />
dem Benutzer die Möglichkeit zu einer erneuten Eingabe bieten.<br />
fehler = 1<br />
while fehler == 1:<br />
try:<br />
eingabe = input("Bitte eine Zahl eingeben: ")<br />
print "Du hast die Zahl", eingabe, "richtig eingegeben"<br />
fehler = 0<br />
except:<br />
print "falsche Eingabe"<br />
Wir betten unser Programm in eine Schleife, die solange wiederholt wird, bis der Benutzer<br />
eine richtige Eingabe macht. Wir brauchen ein kleines Hilfs<strong>mit</strong>tel in Form einer<br />
Schleifenvariable deren Wert wir ändern sobald die Eingabe richtig war, die<br />
Schleifenbedingung also nicht mehr zutrifft und wir aus dieser ausbrechen können.<br />
Fehler erzeugen:<br />
Wir haben nicht nur die Möglichkeit auf fest eingebaute Fehler zu reagieren, sondern können<br />
auch eigene Fehler erzeugen um in eine Ausnahmenbehandlung zu gelangen. Folgendes<br />
Beispiel erläutert dies, indem wir bei Eingabe einer zu grossen oder zu kleinen Zahl einen<br />
Fehler erzeugen und die Eingabe wiederholen lassen.<br />
fehler = 1<br />
while fehler == 1:<br />
try:<br />
eingabe = input("Bitte eine Zahl zwischen 0 und 1000 eingeben: ")<br />
# Eingabe zu gross oder zu klein<br />
if eingabe > 1000 or eingabe < 0:<br />
raise<br />
fehler = 0<br />
except:<br />
print "falsche Eingabe, bitte wiederholen"<br />
print "Du hast die Zahl", eingabe, "richtig eingegeben"<br />
print "Ende gut alles gut"<br />
Unterscheidung von Ausnahmen:<br />
Bisher wurde geschildert wie ein Programm durch das Abfangen von Fehlern gegen Abstürze<br />
gesichert werden kann. Die Fehler wurden dabei allgemein, d.h. ohne Angabe der Fehlerart<br />
abgefangen.<br />
26
Im folgenden Programm sollen verschiedene Arten von Fehlern spezifisch abgefangen<br />
werden. Da<strong>mit</strong> kann ein Benutzer wesentlich genauer über Fehlerursachen informiert werden.<br />
Wir wollen den Kehrwert einer Zahl er<strong>mit</strong>teln und auf mehrere mögliche Fehler reagieren:<br />
fehler = 0<br />
while not fehler:<br />
try:<br />
zahl = input("Bitte eine Zahl 0 eingeben: ")<br />
if zahl < 0:<br />
raise StandardError, "Zahl zu klein"<br />
kw = 1.0 / zahl<br />
fehler = 1<br />
except NameError:<br />
print "Fehler: Zeichen zu beginn eingegeben"<br />
except ZeroDivisionError:<br />
print "Fehler: Zahl 0 eingegeben"<br />
except StandardError, e:<br />
print "Fehler: ", e<br />
print "Der Kehrwert von", zahl, "ist", kw<br />
27
<strong>Python</strong>: Funktionen und Module<br />
Theoretisch könnte ein Programmierer auf die Modularisierung, d.h. die Zerlegung eines<br />
Programms in selbst geschriebene Funktionen, verzichten. Besonders bei der Entwicklung<br />
von grösseren Programmen bieten Funktionen allerdings einige gewichtige Vorteile:<br />
• Umfangreiche Programme können in übersichtliche Teile zerlegt werden.<br />
• Pflege und Wartung von Programmen wird erleichtert.<br />
• Der eigene Programmcode wird verständlicher gegliedert, was vorallem der<br />
Weiterentwicklung zugute kommt.<br />
• Programmteile die nur einmal benötigt werden, müssen nur einmal definiert werden.<br />
• Nützliche Programmteile können in mehreren Programmen verwendet werden.<br />
Vordefinierte Funktionen:<br />
Neben den selbst geschriebenen Funktionen gibt es in <strong>Python</strong>, wie bei jeder anderen<br />
Programmiersprache auch, eine grosse Menge an nützlichen, vordefinierten Funktionen, die<br />
dem Entwickler bereits viel Arbeit abnehmen können, wie z.B die input()-Funktion. Diese<br />
Funktionen sind entweder fest eingebaut oder über die Einbindung spezifischer Module<br />
verfügbar.<br />
• Jede Funktion hat eine spezielle Aufgabe. Im Fall der Funktion input() ist dies: das<br />
Programm anhalten und eine Eingabe entgegennehmen.<br />
• Wie viele, aber lange nicht alle Funktionen, hat input() einen sogenannten<br />
Rückgabewert, d.h. die Funktion liefert ein Ergebnis an die Stelle des Programms<br />
zurück, von der sie aufgerufen wurden.<br />
Wichtig: Funktionen werden immer am Anfang eines Programms definiert, da<strong>mit</strong> man sie zu<br />
einem späteren Zeitpunkt vom Hauptprogramm aufrufen kann. Ist eine Funktion noch nicht<br />
bekannt wenn sie aufgerufen wird - was meistens der Fall ist wenn man Funktionen nicht am<br />
Anfang definiert - dann kommt es zu unangenehmen Programmfehlern.<br />
Einfache Funktionen:<br />
Einfache Funktionen führen bei ihrem Aufruf immer genau das Gleiche aus.<br />
# Funktionsdefinition<br />
def stern():<br />
for i in range(1,21,1):<br />
print "*",<br />
print<br />
# Hauptprogramm<br />
x = 12<br />
stern() # 1. Aufruf<br />
y = 5<br />
stern() # 2. Aufruf<br />
Eine Funktion wird zuerst einmal <strong>mit</strong> dem Schlüsselwort def und einem Namen (siehe<br />
Nameskonvention) definiert. Dann folgen die eigentlichen Anweisungen die die Funktion<br />
ausführen soll im eingerückten Codeblock.<br />
28
Eine Funktion schliesslich wird aufgerufen (ausgeführt), indem ihr Name gefolgt von den<br />
runden Klammern notiert wird. Falls Informationen an die Funktion geliefert werden sollen,<br />
so werden diese innerhalb der runden Klammern angegeben.<br />
Funktionen <strong>mit</strong> einem Parameter:<br />
Bei einem Aufruf können auch Informationen an Funktionen über<strong>mit</strong>telt werden, so genannte<br />
Parameter. Dies führt im Allgemeinen dazu, dass diese Informationen innerhalb der Funktion<br />
ausgewertet werden und bei jedem Aufruf zu unterschiedlichen Ergebnissen führen.<br />
# Funktionsdefinition<br />
def umrechnung(eurobetrag):<br />
kurs = 1.4865<br />
chfbetrag = kurs * eurobetrag<br />
print "%.2f Euro ergeben %.2f CHF" % (eurobetrag, chfbetrag)<br />
# Hauptprogramm<br />
eingabe = input("Bitte einen Betrag in Euro eingeben: ")<br />
umrechnung(eingabe) # Funktions-Aufruf<br />
Funktionen <strong>mit</strong> mehreren Parametern:<br />
Eine Funktion kann noch vielseitiger werden, falls man mehrere Parameter definiert und<br />
über<strong>mit</strong>telt. Dabei ist auf eine übereinstimmende Anzahl und Reihenfolge der Parameter zu<br />
achten. Falls mehrere Parameter verwendet werden, so werden diese sowohl bei Definition als<br />
auch Aufruf durch Kommata voneinander getrennt (Reihenfolge beachten!).<br />
# Funktionsdefinition<br />
def Benutzer(name, alter):<br />
print "Hallo, " + name + ". Lustig, dass wir beide " + str(alter) + "<br />
Jahre alt sind"<br />
# Hauptprogramm<br />
Benutzer("Hans", 40)<br />
Benutzer("Irma", 35)<br />
Funktionen <strong>mit</strong> Rückgabewert:<br />
Funktionen werden häufig nur zur Berechnung, aber nicht zur Ausgabe der berechneten<br />
Ergebnisse eingesetzt. Die Ausgabe bzw. weitere Verarbeitung soll dem Hauptprogramm oder<br />
der aufrufenden Funktion überlassen werden. Zu diesem Zweck können Funktionen ihre<br />
Ergebnisse als sogenannte Rückgabewerte zurückliefern.<br />
Im Unterschied zu vielen anderen Programmiersprachen können Funktionen in <strong>Python</strong> mehr<br />
als einen Rückgabewert liefern. Beschränken wir zuerst auf nur einen Rückgabewert.<br />
# Funktionsdefinition<br />
def umrechnung(eurobetrag):<br />
kurs = 1.4865<br />
chfbetrag = kurs * eurobetrag<br />
return chfbetrag<br />
# Hauptprogramm<br />
eingabe = input("Bitte einen Betrag in Euro eingeben: ")<br />
29
swissfraenkli = umrechnung(eingabe) # Funktions-Aufruf<br />
print "%.2f Euro ergeben %.2f CHF" % (eingabe, swissfraenkli)<br />
# zweiter Aufruf<br />
print eingabe, " Euro ergeben ", umrechnung(eingabe), " CHF"<br />
Funktionen <strong>mit</strong> mehreren Rückgabewerten:<br />
Im Unterschied zu vielen anderen Programmiersprachen können Funktionen in <strong>Python</strong> mehr<br />
als einen Rückgabewert liefern. Es wird dabei ein Ergebnistupel übergeben.<br />
# Funktionsdefinition<br />
def geom(breite, laenge):<br />
flaeche = breite * laenge<br />
umfang = 2 * (breite * laenge)<br />
return flaeche, umfang<br />
# Hauptprogramm<br />
f, u = geom(3, 7)<br />
print "Fläche:", f<br />
print "Umfang:", u<br />
x = geom(2,5)<br />
print "Fläche:", x[0]<br />
print "Umfang:", x[1]<br />
Lambda (Funktionen):<br />
Lamba bietet eine Möglichkeit für eine verkürzte Funktionsdefinition. Einer solchen Funktion<br />
können Parameter übergeben werden. Sie liefert ihr Ergebnis als einen Ausdruck zurück, der<br />
in der gleichen Zeile stehen muss. In diesem Ausdruck dürfen keine Mehrfachanweisungen,<br />
Ausgaben oder Schleifen vorkommen.<br />
# Funktionsdefinitionen<br />
mal = lambda x,y: x*y<br />
plus = lambda x,y: x+y<br />
# Funktions-Aufrufe<br />
print mal(3,5)<br />
print plus(4,7)<br />
30
<strong>Python</strong>: Datum und Uhrzeit<br />
Um <strong>mit</strong> Datum und Uhrzeit innerhalb <strong>Python</strong> zu arbeiten, benötigen wir das Modul time<br />
Nullpunkt: Auf vielen Betriebssystemen und in vielen Skripting- und Programmiersprachen<br />
gilt der 1. Januar 1970 00:00:00 Uhr als Nullpunkt für die Verarbeitung von Datums- und<br />
Zeitangaben. Die Zeit wird in Sekunden ab diesem Zeitpunkt gerechnet.<br />
aktuelle Zeit er<strong>mit</strong>teln und ausgeben:<br />
from time import *<br />
# Zeit in Sekunden<br />
print "Zeit in Sekunden: ", time()<br />
# aktuelle, lokale Zeit als Tupel<br />
lt = localtime()<br />
# Entpacken des Tupels, Datum<br />
jahr, monat, tag = lt[0:3]<br />
print "Es ist der %02i.%02i.%04i" % (tag,monat,jahr)<br />
Die Funktion time() liefert die aktuelle Zeit in Sekunden seit dem 1.1.1970.<br />
Die Funktion localtime() ohne Parameter liefert die aktuelle Zeit als Tupel von<br />
Einzelinformationen. Nachfolgend werden diese ausgewertet:<br />
1. die ersten drei Elemente (0 bis 2) liefern Jahr, Monat und Tag<br />
2. die nächsten drei Elemente (3 bis 5) liefern Stunde, Minute und Sekunde<br />
3. das nächste Element (6) stellt den Wochentag von 0 bis 6 bereit. Montag entspricht<br />
dabei der 0, Sonntag der 6.<br />
4. die laufende Nummer des Tages innerhalb eines Jahres wird von Element 7 geliefert.<br />
5. Informationen über den Status der Sommerzeit liefert das letzte Element 8.<br />
strftime():<br />
Noch genauere Informationen liefert die Funktion strftime(). Sie benötigt zwei Parameter:<br />
1. Einen Formatierungsstring für die gewünschte Ausgabe<br />
2. Ein Zeit-Tupel wie dies z.B. von der Funktion localtime() geliefert wird.<br />
Es werden neben allen Angaben der Funktion localtime() folgende zusätzlichen<br />
Informationen bereitsgestellt:<br />
1. Zeit im 12-Stunden-Format, <strong>mit</strong> Angabe von AM bzw. PM<br />
2. Jahresangabe nur <strong>mit</strong> 2 Ziffern<br />
3. Name des Wochentags, abgekürzt bzw. ausgeschrieben. Im Unterschied zu<br />
localtime() entspricht aber Sonntag der Zahl 0 (!!!)<br />
4. Name des Monats, abgekürzt bzw. ausgeschrieben.<br />
5. Kalenderwoche des Jahres, bezogen auf zwei verschiedene Systeme (Sonntag oder<br />
Montag als erster Tag der Woche).<br />
6. Angabe der Zeitzone<br />
31
from time import *<br />
lt = localtime()<br />
print strftime("Tag.Monat.Jahr: %d.%m.%Y", lt)<br />
print strftime("Stunde:Minute:Sekunde: %H:%M:%S", lt)<br />
print strftime("im 12h-Format: %I:%M:%S Uhr %p", lt)<br />
print strftime("Datum und Zeit: %c", lt)<br />
print strftime("nur Datum: %x, nur Zeit: %X", lt)<br />
print strftime("Wochentag abgekürzt: %a, ganz: %A, Nr. (Sonntag=0): %w",<br />
lt)<br />
print strftime("Monat abgekürzt: %b, ganz: %B", lt)<br />
print strftime("Tag des jahres: %j", lt)<br />
print strftime("Woche des Jahres, Start bei Sonntag: %U", lt)<br />
print strftime("Woche des Jahres, Start bei Montag: %W", lt)<br />
print strftime("Zeitzone: %Z", lt)<br />
Beliebige Zeitangabe erzeugen:<br />
Zur Erzeugung einer beliebigen Zeitangabe wird die Funktion mktime() genutzt. Sie benötigt<br />
als Parameter ein Tupel <strong>mit</strong> allen neun Angaben, wie sie auch von localtime() geliefert<br />
werden.<br />
Die Angabe für Wochentag, Tag des Jahres und Sommerzeit kennt man natürlich in den<br />
wenigsten Fällen. Sie können einfach <strong>mit</strong> 0 besetzt werden, sie werden dennoch automatisch<br />
korrekt er<strong>mit</strong>telt, wie das folgende Beispiel zeigt:<br />
from time import *<br />
# Zeitangabe erzeugen<br />
millenium = 2000, 1, 1, 0, 0, 0, 0, 0, 0<br />
damals = mktime(millenium)<br />
# Ausgabe<br />
lt = localtime(damals)<br />
print lt<br />
Mit Zeitangaben rechnen:<br />
Zur Berechnung eines Zeitraums, also der Differenz zwischen zwei Zeitangaben, müssen<br />
beide Zeitangaben einzeln erzeugt werden. Anschliessend kann die Differenz in Sekunden<br />
berechnet werden. Daraus kann dann die Differenz in Minuten, Stunden, Tagen etc. berechnet<br />
werden.<br />
from time import *<br />
# Zwei Zeitangaben erzeugen<br />
millenium = 2000, 1, 1, 0, 0, 0, 0, 0, 0<br />
damals = mktime(millenium)<br />
print "Zeit 1:", localtime(damals)<br />
jetzt = 2003, 2, 4, 0, 0, 0, 0, 0, 0<br />
heute = mktime(jetzt)<br />
print "Zeit 2:", localtime(heute)<br />
# Differenz berechnen<br />
print "Differenz:"<br />
32
print<br />
diff_sek = heute - damals<br />
print diff_sek, "Sekunden"<br />
diff_min = diff_sek/60<br />
print diff_min, "Minuten"<br />
diff_std = diff_min/60<br />
print diff_std, "Stunden"<br />
diff_tag = diff_std/24<br />
print diff_tag, "Tage"<br />
Programm anhalten:<br />
Die Funktion sleep() aus dem Modul time ermöglicht das Anhalten eines Programms für<br />
einen bestimmten Zeitraum. Auf einigen Betriebssystemen können dabei nur ganzzahlige<br />
Abstände angegeben werden.<br />
from time import *<br />
# 11 Zeitangaben jeweils <strong>mit</strong> Pause<br />
for i in range(11):<br />
wert = time()<br />
if i == 0:<br />
startwert = wert<br />
elif i == 10:<br />
endwert = wert<br />
print i, wert<br />
sleep(1.5)<br />
# Durchschnittlicher Abstand<br />
diff = (endwert - startwert) / 10<br />
print "Abstand: ", diff<br />
33
<strong>Python</strong>: Filesystemfunktionen<br />
Um <strong>mit</strong> Files und dem Filesystem innerhalb <strong>Python</strong> zu arbeiten, benötigen wir das Modul os<br />
Filesystemfunktionen:<br />
getcwd()<br />
listdir(curdir)<br />
Funktionsname<br />
path.join('c:','Eigene<br />
Dateien','test')<br />
chdir('foldername')<br />
mkdir('name')<br />
mkdirs('name/subname/subsubname')<br />
rmdir('name')<br />
Konstanten<br />
name<br />
curdir<br />
pardir<br />
Check-Funktionen<br />
path.isdir('pfadangabe')<br />
path.isfile('filename')<br />
path.exists('pfadangabe')<br />
Beschreibung<br />
Aktuelles Verzeichnis anzeigen<br />
Inhalt des aktuellen Verzeichnis auflisten<br />
Pfad aus den angegebenen werten<br />
zusammenstellen<br />
In Verzeichnis 'foldername' wechseln<br />
erstellt Unter-Verzeichnis 'name' im aktuellen<br />
Verzeichnis<br />
erstellt Unter-Verzeichnis 'name' <strong>mit</strong> 2 (oder<br />
auch mehreren) Unterverzeichnisssen im<br />
aktuellen Verzeichnis<br />
löscht Verzeichnis 'name' aber nur wenn dieses<br />
LEER ist, sonst wird eine Exception ausgelöst<br />
Gibt Name des Betriebssystems aus<br />
aktuelles Verzeichnis in Unix-Notation '.'<br />
übergeordnetes Verzeichnis in Unix-Notation '..'<br />
Gibt true aus wenn 'pfadangabe' ein Pfad ist<br />
sonst false<br />
Gibt true aus wenn 'filename' ein File ist<br />
sonst false<br />
Gibt true aus wenn 'pfadangabe' existiert<br />
sonst false<br />
File-Funktionen:<br />
Beachte: beim Arbeiten <strong>mit</strong> Files wird nie das File "Direkt" angesprochen sondern immer<br />
über seine zugewiesene Variable, die in diesem speziellen Fall File-Handle(r) heisst.<br />
Funktionsname<br />
open('path/filename',<br />
'mode')<br />
file('path/filename',<br />
'mode')<br />
Beschreibung<br />
File 'filename' im Verzeichnis 'path' im Modus 'mode'<br />
öffnen.<br />
Ab <strong>Python</strong> 2.2: File 'filename' im Verzeichnis 'path' im<br />
Modus 'mode' öffnen.<br />
simple Modus:<br />
r<br />
34
Funktionsname<br />
filehandle.read()<br />
filehandle.readline()<br />
filehandle.readlines()<br />
Beschreibung<br />
read = nur im Lese-Modus<br />
w<br />
write = nur im Schreib-Modus. Löscht File<br />
komplett bevor geschrieben wird, falls File nicht<br />
vorhanden wird dieses angelegt.<br />
a<br />
append = nur im Schreib-Modus. Schreibt am<br />
Ende des Files weiter, d.h. bestehender Inhalt wird<br />
nicht gelöscht.<br />
Bei diesen Modi muss der Linebreak jeweils explizit<br />
selber geschrieben werden!!<br />
kombinierter Modus:<br />
r+<br />
read and write = im Lese- und Schreib-Modus<br />
w+<br />
write and read = Schreib- und Lese-Modus. Löscht<br />
File komplett bevor geschrieben wird, falls File<br />
nicht vorhanden wird dieses angelegt.<br />
a+<br />
append and read = im Schreib- und Lese-Modus.<br />
Schreibt am Ende des Files weiter, d.h.<br />
bestehender Inhalt wird nicht gelöscht.<br />
Binary Modus (für Files die nicht im Textformat sind):<br />
rb<br />
read = im Lese-Modus<br />
wb<br />
write = im Schreib-Modus. Löscht File komplett<br />
bevor geschrieben wird, falls File nicht vorhanden<br />
wird dieses angelegt.<br />
ab<br />
append = im Schreib-Modus. Schreibt am Ende<br />
des Files weiter, d.h. bestehender Inhalt wird nicht<br />
gelöscht.<br />
Universal newline support:<br />
rU<br />
read = im Lese-Modus. Alle Linebreaks werden<br />
als \n interpretiert.<br />
aU<br />
append = im Schreib-Modus. Schreibt am Ende<br />
des Files weiter, d.h. bestehender Inhalt wird nicht<br />
gelöscht.<br />
Dieser Modus kann nicht für 'w' und '+' verwendet<br />
werden.<br />
Alles aus Filehandle einlesen<br />
eine Zeile einlesen<br />
alles Zeilenweise einlesen<br />
35
Funktionsname<br />
filehandle.close()<br />
filehandle.write()<br />
filehandle.writelines()<br />
löschen und umbenennen:<br />
remove('filename')<br />
rename('filename_orig',<br />
'filename_new')<br />
Check-Funktionen<br />
filehandle.mode<br />
filehandle.closed<br />
Utility-Funktionen<br />
seek(int)<br />
tell()<br />
File(-handle) schliessen<br />
Beschreibung<br />
eine einzelne Zeichenkette in Filehandle schreiben<br />
schreibt eine Liste <strong>mit</strong> Zeichenketten sequentiell ins File.<br />
Beachte, dass beiden Methoden write() und<br />
writelines() kein Zeilenumbruch am Ende einer Zeile<br />
schreiben -> muss selber hinzugefügt werden!<br />
löscht File 'filename' im aktuellen Verzeichnis<br />
benennt File 'filename_orig' im aktuellen Verzeichnis<br />
in 'filename_new' um<br />
gibt Modus aus, wie das im Filehandle 'filehandle'<br />
referenzierte File geöffnet wurde.<br />
gibt aus, ob das im Filehandle 'filehandle' referenzierte<br />
File geschlossen ist.<br />
filepointer auf beliebige Position innerhalb eines<br />
File(handle) setzen<br />
Gibt Position aus, in der wir uns im File(handle) gerade<br />
befinden.<br />
Beispiel: Ordner erstellen und dann darin File erstellen<br />
from os import *<br />
# Pfad zusammenstellen<br />
mypath = path.join('/', 'Users', 'tbruhin')<br />
chdir(mypath) # in Pfad wechseln<br />
# Verzeichnis erstellen<br />
mkdir('test')<br />
chdir('test') # in Verzeichnis wechseln<br />
# Neues Dokument erstellen<br />
myfile = file('test.txt', 'w') # File-Handle auf File 'test.txt'<br />
erstellen<br />
mystring = "Hello World\n" # Zeichenkette erstellen<br />
myfile.write(mystring) # Zeichenkette in File schreiben<br />
myfile.close() # File schliessen<br />
36
<strong>Python</strong>: Anhang<br />
• Liste der reservierten Wörter<br />
• Vollständige Rangfolge der Operatoren<br />
• Funktionen des Moduls Math<br />
• Funktionen des Moduls cMath<br />
37
<strong>Python</strong>: reservierte Wörter<br />
Die hier aufgeführten reservierten Worte der Programmiersprache <strong>Python</strong> dürfen nicht als<br />
Namen für Variablen, Funktionen, Objekte, Klassen usw. verwendet werden.<br />
and<br />
Wort<br />
assert<br />
break<br />
class<br />
Logisches UND<br />
Zum Testen von Ausdrücken<br />
kurze Erläuterung<br />
Un<strong>mit</strong>telbares Verlassen einer Schleife<br />
Beginn der Definition einer Klasse<br />
continue Un<strong>mit</strong>telbares Fortsetzen einer Schleife beim nächsten Durchlauf<br />
def<br />
del<br />
elif<br />
else<br />
except<br />
exec<br />
Beginn der Definition einer Funktion<br />
Löschen eines Objekts<br />
Teilzweig einer (mehrfachen) Verzweigung<br />
Endzweig einer (mehrfachen) Verzweigung<br />
Teil einer Ausnahmebehandlung<br />
Ausführung von Programmcode<br />
finally Teilzweig einer Ausnahmebehandlung<br />
for<br />
from<br />
global<br />
if<br />
import<br />
in<br />
is<br />
lambda<br />
not<br />
or<br />
pass<br />
print<br />
raise<br />
return<br />
try<br />
while<br />
Beginn einer for-Schleife<br />
Teil einer import-Anweisung<br />
Verlegung einer Variablen in den globalen Namensraum<br />
Beginn einer Verzweigung<br />
Import eines Moduls <strong>mit</strong> seinen Funktionen<br />
Prüfung auf Mitgliedschaft in einer Sequenz<br />
test auf Identität<br />
Anonyme Funktion<br />
Logisches NICHT<br />
Logisches ODER<br />
Platzhalter, führt nichts aus<br />
Ausgabe<br />
Auslösen einer Ausnahmebeandlung<br />
Verlassen einer Funktion, Rückgabe von Werten<br />
Beginn einer Ausnahmebeandlung<br />
Beginn einer while-Schleife<br />
38
<strong>Python</strong>: Vollständige Rangfolge der Operatoren<br />
Nachfolgende Tabelle listed alle Operatoren in <strong>Python</strong> in der Reihenfolge der Auswertung.<br />
Operatoren <strong>mit</strong> der höchsten Priorität stehen am Anfang der Tabelle. Opertoren <strong>mit</strong> gleicher<br />
Priorität werden innerhalb eines Ausdrucks von links nach rechts ausgewertet<br />
Operator<br />
( ), [ ], { }, ' '<br />
seq[i], seq[i:j], obj.attr,<br />
fct()<br />
+x, -x, ~x<br />
x**y<br />
x*x, x/y, x%y<br />
x+y, x-y<br />
xy<br />
x&y<br />
x^y<br />
x|y<br />
x=y, x is y, x is not y,<br />
x in seq, x not in seq<br />
not x<br />
x and y<br />
x or y<br />
Erläuterung<br />
Erzeugung eines Tupels, einer Liste, eines<br />
Dictionaries, einer Zeichenkette<br />
Indexierung einer Sequenz, Teilbereich einer Sequenz,<br />
Objekt-Eigenschaft, Funktions- oder Methodenaufruf<br />
Unäre Operatoren für positives Vorzeichen, negatives<br />
Vorzeichen, Einer-Komplement<br />
Exponentialrechnung<br />
Multiplikation von Zahlen und Wiederholung von<br />
Zeichenkette, Division, Modulo-Division von Zahlen<br />
und Formatierung von Ausgaben<br />
Addition von zahlen und Verkettung von<br />
Zeichenketten, Subtraktion<br />
Bitweises Verschieben (nach links und rechts)<br />
Bitweises UND<br />
Bitweises exklusives ODER<br />
Bitweises ODER<br />
Vergleichsoperatoren, Test auf Identität, Test auf<br />
Mitgliedschaft in einer Sequenz<br />
Logisches NICHT<br />
Logisches UND<br />
Logisches ODER<br />
39
<strong>Python</strong>: Funktionen des Moduls math<br />
Tabelle der Trigonometrischen Funktionen:<br />
Funktionsname<br />
acos(z)<br />
asin(z)<br />
atan(z)<br />
atan2(z,n)<br />
cos(z)<br />
cosh(z)<br />
sin(z)<br />
sinh(z)<br />
tan(z)<br />
tanh(z)<br />
ceil(z)<br />
exp(z)<br />
fabs(z)<br />
floor(z)<br />
fmod(a,b)<br />
frexp(z)<br />
Arcus Cosinus von z<br />
Arcus Sinus von z<br />
Arcus Tangens von z<br />
Arcus Tangens von z/n<br />
Cosinus von z<br />
Cosinus Hyperbolicus von z<br />
Sinus von z<br />
Sinus Hyperbolicus von z<br />
Tangens von z<br />
Tangens Hyperbolicus von z<br />
Ergebnis<br />
Aufrundung nächst höhere Zahl von z aus<br />
(Euler'sche Zahl) e hoch z<br />
Betrag von z<br />
Abrundung nächst kleinere Zahl von z aus<br />
a%b, d.h. a modulo b<br />
Ein Tupel, das die positive Mantisse und den Exponenten von z enthält<br />
hypot(a,b) Wurzel (a 2 + b 2 ), Satz des Pythagoras<br />
ldexp(z,i)<br />
log(z)<br />
log10(z)<br />
modf(z)<br />
pow(a,b)<br />
round(z, i)<br />
sqrt(z)<br />
z * 2 hoch i<br />
natürlicher Logarithmus von z<br />
Logarithmus zur Basis 10 von z<br />
Ein Tupe das den gebrochenen und den ganzzahligen Anteil von z enthält<br />
a hoch b<br />
Rundung der Zahl z auf Anzahl i Kommastellen. Wird die Anzahl<br />
Kommastellen weggelassen, dann wird auf die nächst höhere ganze Zahl<br />
gerundet.<br />
Wurzel aus z<br />
Tabelle der Konstanten:<br />
Name<br />
pi<br />
e<br />
Kreiszahl<br />
Euler'sche Zahl e<br />
Bedeutung<br />
40
<strong>Python</strong>: Funktionen des Moduls cmath<br />
Die Funktionen des Moduls cmath können nur für komplexe Zahlen, nicht für reelle Zahlen<br />
eingesetzt werden. Für relle Zahlen dient das Modul math.<br />
Tabelle der Trigonometrischen Funktionen:<br />
acos(z)<br />
acosh(z)<br />
asin(z)<br />
asinh(z)<br />
atan(z)<br />
atan2(z,n)<br />
cos(z)<br />
cosh(z)<br />
sin(z)<br />
sinh(z)<br />
tan(z)<br />
tanh(z)<br />
Funktionsname<br />
Arcus Cosinus von z<br />
Ergebnis<br />
Arcus Cosinus Hyperbolicus von z<br />
Arcus Sinus von z<br />
Arcus Sinus Hyperbolicus von z<br />
Arcus Tangens von z<br />
Arcus Tangens von z/n<br />
Cosinus von z<br />
Cosinus Hyperbolicus von z<br />
Sinus von z<br />
Sinus Hyperbolicus von z<br />
Tangens von z<br />
Tabelle der restlichen Funktionen:<br />
exp(z)<br />
log(z)<br />
log10(z)<br />
Funktionsname<br />
Tabelle der Konstanten:<br />
pi<br />
e<br />
Name<br />
Tangens Hyperbolicus von z<br />
Kreiszahl p, als komplexe Zahl<br />
(Euler'sche Zahl) e hoch z<br />
natürlicher Logarithmus von z<br />
Ergebnis<br />
Logarithmus zur Basis 10 von z<br />
Euler'sche Zahl e, als komplexe Zahl<br />
Bedeutung<br />
41