03.06.2014 Aufrufe

Programmieren mit Python

Programmieren mit Python

Programmieren mit Python

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!