Kontrollstrukturen in Python

0 | 4 Kommentare | 3147 Aufrufe
Sie können diese Wikiseite nach der Anmeldung auf Webmasterpro bearbeiten. Helfen Sie mit und verbessern Sie "Kontrollstrukturen in Python" mit Ihrem Wissen!

Anzeige Hier werben

Kontrollstrukturen

Unter einer Kontrollstruktur versteht man ein Konstrukt, mit dessen Hilfe sich der Ablauf eines Programms steuern lässt. Dabei unterscheidet man in Python zwei Arten von Kontrollstrukturen: Schleifen und Fallunterscheidungen. Schleifen dienen dazu, einen Codeblock mehrmals auszuführen. Fallunterscheidungen hingegen knüpfen einen Codeblock an eine Bedingung, sodass er nur ausgeführt wird, wenn die Bedingung erfüllt ist. Wie und in welchem Umfang diese zwei Typen unterstützt werden, ist von Programmiersprache zu Programmiersprache verschieden. Python kennt jeweils zwei Unterarten, die wir hier behandeln werden.

Auch wenn das in den kommenden Beispielen noch nicht gezeigt wird, können Kontrollstrukturen beliebig ineinander verschachtelt werden. Die Einrückungstiefe wächst dabei kontinuierlich.

Fallunterscheidungen

In Python gibt es zwei Arten von Fallunterscheidungen: die klassische if-Anweisung und die sogenannte conditional expression als erweiterte Möglichkeit der bedingten Ausführung von Code. Wir werden im Folgenden beide Arten der Fallunterscheidung detailliert besprechen und mit Beispielen erläutern. Dabei werden wir mit der if-Anweisung beginnen.

If, elif, else

Die einfachste Möglichkeit der Fallunterscheidung ist die if-Anweisung. Eine if-Anweisung besteht aus einem Anweisungskopf, der eine Bedingung enthält, und aus einem Codeblock als Anweisungskörper. Der Codeblock wird nur ausgeführt, wenn sich die Bedingung als wahr herausstellt. Die Bedingung einer if-Anweisung muss dabei ein Ausdruck sein, der nach seiner Auswertung einen Wahrheitswert (True oder False) ergibt.

Struktur einer if-Anweisung  
HTML
1
2
3
4
if Bedingung:
    Anweisung
    ...
    Anweisung

Als Beispiel betrachten wir eine if-Anweisung, die einen entsprechenden Text nur dann ausgibt, wenn die Variable x den Wert 1 hat:

 
Python
1
2
if x == 1:
    print "x hat den Wert 1"

Beachten Sie, dass für dieses und die folgenden Beispiele eine Variable x bereits existieren muss. Sollte dies nicht der Fall sein, so bekommen Sie einen NameError. Selbstverständlich können auch andere vergleichende Operatoren oder ein komplexerer
logischer Ausdruck verwendet werden und mehr als eine Anweisung im Körper stehen:

 
Python
1
2
3
if (x <= 1) and (x * x > 20):
    print "x ist kleiner ..."
    print "...oder gleich 1"

In vielen Fällen ist es mit einer einzelnen if-Anweisung nicht getan, und man benötigt eine ganze Kette von Fallunterscheidungen. Wir möchten im nächsten Beispiel zwei unterschiedliche Strings ausgeben, je nachdem, ob x == 1 oder x == 2 gilt. Dazu wäre nach Ihrem bisherigen Kenntnisstand folgender Code notwendig:

 
Python
1
2
3
4
if x == 1:
    print "x hat den Wert 1"
if x == 2:
    print "x hat den Wert 2"

Dies ist aus Sicht des Interpreters eine ineffiziente Art, das Ziel zu erreichen, denn beide Bedingungen werden in jedem Fall ausgewertet und überprüft. Jedoch bräuchte die zweite Fallunterscheidung nicht mehr in Betracht gezogen zu werden, wenn die Bedingung der ersten bereits True ergeben hat. Die Variable x kann unter keinen Umständen sowohl den Wert 1 als auch 2 haben. Um solche Fälle aus Sicht des Interpreters performanter und aus Sicht des Programmierers übersichtlicher zu machen, kann eine if-Anweisung um einen oder mehrere sogenannte elif-Zweige (»elif« ist ein Kürzel für »else if«) erweitert werden.

Die Bedingung eines solchen Zweiges wird nur evaluiert, wenn alle vorherigen if- bzw. elif-Bedingungen False ergaben. Das obige Beispiel kann mithilfe von elif folgendermaßen verfasst werden:

 
Python
1
2
3
4
if x == 1:
    print "x hat den Wert 1"
elif x == 2:
    print "x hat den Wert 2"

Eine if-Anweisung kann um beliebig viele elif-Zweige erweitert werden:

 
Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
if Bedingung:
    Anweisung
    ...
    Anweisung
    
elif Bedingung:
    Anweisung
    ...
    Anweisung

elif Bedingung:
    Anweisung
    ...
    Anweisung

Im Quelltext könnte dies folgendermaßen aussehen:

 
Python
1
2
3
4
5
6
if x == 1:
    print "x hat den Wert 1"
elif x == 2:
    print "x hat den Wert 2"
elif x == 3:
    print "x hat den Wert 3"

Als letzte Erweiterung der if-Anweisung ist es möglich, alle bisher unbehandelten Fälle auf einmal abzufangen. So möchten wir beispielsweise nicht nur einen entsprechenden String ausgeben, wenn x == 1 bzw. x == 2 gilt, sondern zusätzlich in allen anderen Fällen, also zum Beispiel x == 35, eine Fehlermeldung. Dazu kann eine if-Anweisung um einen sogenannten else-Zweig erweitert werden. Ist dieser vorhanden, so muss er an das Ende der if-Anweisung geschrieben werden.

Konkret im Quelltext kann dies so aussehen:

 
Python
1
2
3
4
5
6
if x == 1:
    print "x hat den Wert 1"
elif x == 2:
    print "x hat den Wert 2"
else:
    print "Fehler: Der Wert von x ist weder 1 noch 2"

Der dem else-Zweig untergeordnete Codeblock wird nur dann ausgeführt, wenn alle vorherigen Bedingungen nicht erfüllt waren. Zu einer if-Anweisung darf maximal ein else-Zweig gehören. Im Beispiel wurde else in Kombination mit elif verwendet, was möglich, aber nicht zwingend ist.

Hinweis

Sollten Sie bereits eine Programmiersprache wie C oder Java beherrschen, so wird Sie interessieren, dass in Python kein Pendant zur switch/case-Kontrollstruktur dieser Sprachen existiert. Das Verhalten dieser Kontrollstruktur kann trotzdem durch eine Kaskade von if/elif/else Zweigen nachgebildet werden.

Conditional expressions

Betrachten Sie, in Anlehnung an den vorherigen Abschnitt, einmal folgenden Code:

 
Python
1
2
3
4
if x == 1:
    var = 20
else:
    var = 30

Es ist festzustellen, dass wir für einen geringfügigen Unterschied in der Zuweisung satte vier Zeilen Code benötigt haben, und es drängt sich die Frage auf, ob wir hier nicht mit Kanonen auf Spatzen schießen. Wir werden Ihnen jetzt zeigen, dass dieser Code mithilfe einer sogenannten conditional expression (dt. bedingter Ausdruck) in eine Zeile passt. Ein solcher bedingter Ausdruck kann abhängig von einer Bedingung zwei verschiedene Werte annehmen. So ist es zum Beispiel möglich, var in derselben Zuweisung je nach Wert von x entweder auf 20 oder auf 30 zu setzen:

var = (20 if x == 1 else 30)

Die Klammern umschließen in diesem Fall den bedingten Ausdruck. Sie sind nicht notwendig, erhöhen aber die Übersicht. Der Aufbau einer conditional expression orientiert sich an der englischen Sprache und lautet folgendermaßen:

A if Bedingung else B

Sie nimmt dabei entweder den Wert A an, wenn die Bedingung erfüllt ist, oder andernfalls den Wert B. Sie könnten sich also vorstellen, dass die conditional expression nach dem Gleichheitszeichen entweder durch A oder B, also durch 20 oder 30 ersetzt wird. Nach der Auswertung des bedingten Ausdrucks ergibt sich also wieder eine gültige Zuweisung.

Diese Form, eine Anweisung an eine Bedingung zu knüpfen, kann selbstverständlich nicht nur auf Zuweisungen angewandt werden. Im folgenden Beispiel wird mit derselben print-Anweisung je nach Wert von x ein anderer String ausgegeben:

 
Python
1
print ("x hat den Wert 1" if x == 1 else "x ist ungleich 1")

Beachten Sie, dass es sich bei Bedingung um einen logischen sowie bei A und B um einen beliebigen arithmetischen Ausdruck handeln kann. Eine conditional expression kann folglich auch so aussehen:

xyz = (a ** 2 if (a > 10 and b < 5) else b ** 2)

Dabei ist zu beachten, dass sich die Auswertungsreihenfolge der bedingten Ausdrückevon den normalen Auswertungsregeln von Python-Code unterscheidet. Es wird immer zunächst die Bedingung ausgewertet und erst dann, je nach Ergebnis, entweder der linke oder der rechte Teil des Ausdrucks. Eine solche springende Auswertungsreihenfolge wird lazy evaluation genannt.

Die hier vorgestellten conditional expressions können in der Praxis dazu verwendet werden, umständlichen und langen Code sehr elegant zu verkürzen. Allerdings geht all das stark auf Kosten der Lesbarkeit und Übersichtlichkeit. Wir werden deshalb in diesem Buch nur in Ausnahmefällen davon Gebrauch machen. Es steht Ihnen allerdings frei, conditional expressions in Ihren eigenen Projekten nach Herzenslust zu verwenden.

While-Schleife

Die while-Schleife haben wir bereits in unserem Spiel »Zahlenraten« verwendet. Sie dient dazu, einen Codeblock so lange auszuführen, wie eine bestimmte Bedingung erfüllt ist. In unserem ersten Programm aus Abschnitt 5.2 wurde mithilfe einer while-Schleife so lange eine neue Zahl vom Spieler eingelesen, bis die eingegebene Zahl mit der gesuchten Zahl übereinstimmte.

Grundsätzlich besteht eine while-Schleife aus einem Schleifenkopf, in dem die Bedingung steht, sowie einem Schleifenkörper, der dem auszuführenden Codeblock entspricht. Beachten Sie, dass die Schleife läuft, solange die Bedingung
erfüllt ist, und nicht, bis sie erfüllt ist.

 
Python
1
2
3
4
while Bedingung:
    Anweisung
    ...
    Anweisung

Buchhinweis

Bild zu Kontrollstrukturen in Python

Dieser Artikel stammt aus dem Buch "Python – Das umfassende Handbuch" von Peter Kaiser und Johannes Ernesti und wurde uns von Galileo Design zur Verfügung gestellt hat. Das Buch kann über die Webseite des Galileo Verlag bestellt werden.


Wikiseite bearbeiten

Diese Seite kann von jedem registrierten Benutzer bearbeitet werden. Bisher haben 2 Personen an der Seite "Kontrollstrukturen in Python" mitgewirkt.

Sie haben einen Fehler entdeckt oder möchten etwas ergänzen? Dann können Sie nach der Anmeldung "Kontrollstrukturen in Python" hier bearbeiten.

Mitarbeiter

Kommentare: Kontrollstrukturen in Python

Neuen Kommentar schreiben
Anregung
Beantworten

Wo ihr grad mächtig bei Python bei seid: Könntet ihr mal einen Artikel kreieren, in dem klar wird, wie ich das als Websprache nutzen könnte? Vermutlich läuft die Ausgabe ja über print("<html>...") '. Aber das wäre ja auch nur die halbe Miete, denn wie kann man HTTP-Parameter (Get, Post) oder Cookies verarbeiten? Ein gutes Tutorial darüber fänd ich sehr nützlich, zumal ich im Netz noch kein passendes gefunden hab (oder zu doof zum suchen bin).

Holger V am 05.07.2008 um 09:29
Re: Python als Websprache
Beantworten

Wo ihr grad mächtig bei Python bei seid: Könntet ihr mal einen Artikel kreieren, in dem klar wird, wie ich das als Websprache nutzen könnte?

Da Python nicht wie PHP als eine Template-Sprache für HTML gedacht ist geht das hier natürlich etwas komplizierter. Ich denke hier sollte man gleich von beginn an ein Framework verwenden. Kenne mich selbst aber nur in Django aus.

Thomas H am 15.07.2008 um 17:14
Re: Anregung
Beantworten

Grundsätzlich muss die Webentwicklung durch Python (logischerweise) vom Server unterstützt werden. So verhält es sich auch mit PHP.

Bei vielen Servern ist eine Schnittstelle (CGI, FastCGI, mod_python,...) die man für die Low-Level-Programmierung in Python verwenden kann vorinstalliert, jedoch muss Python selbst auch installiert sein.

Nun wurde aus diversen Gründen (unter anderem der Einfachheit, Wartbarkeit, Weiterentwicklung usw.) ein Gateway/Wrapper entwickelt der alle (oder zumindest alle gängigen) Schnittstellen anspricht, dieser Wrapper nennt sich WSGI.

Zusätzlich gibt es mittlerweile schon einige, sehr bekannte, Frameworks für die Webentwicklung in Python. Um einige zu nennen: Django, Zope, TurboGears,...

Patrick Freitag am 15.07.2008 um 14:45
Re: Anregung
Beantworten

Hmm sicherlich wäre das interessant. Ich kann selbst aber wenig Python und bin dafür wohl eher nicht geeignet. Hab auch noch nie was fürs Web mit Python gemacht.

Fabian Ziegler am 07.07.2008 um 08:30