info@a-coding-project.de

Python: Kontrollstrukturen

Python stellt eine ganze Reihe von Kontrollstrukturen zur Verfügung mit denen der Programmablauf kontrolliert und gesteuert werden kann.

Bedingungen

Die vielleicht bekannteste Anweisung ist die if-Anweisung, z.B.:

>>> if x < 0:
...      x = 0
...      print 'Negativ; auf null geaendert'
... elif x == 0:
...      print 'Zero'
... elif x == 1:
...      print 'Single'
... else:
...      print 'More'
...

Es kann keine oder mehrere elif-Teile geben, und der else-Teil ist optional. Das Schlüsselwort elif ist eine Kurzschreibweise für else if und ist nützlich, um exzessive Einrückungen zu vermeiden. Eine Sequenz der Art if...elif...elif... ist ein Ersatz für switch- oder case-Anweisungen in anderen Sprachen.

Schleifen

Schleifen ermöglichen es, beliebigen Programmcode mehrfach zu wiederholen ohne dass dieser jedes mal neu notiert werden muss.

while-Anweisung

Die Syntax der while-Schleife dürfte aus der einen oder anderen Programmiersprache bekannt sein; Python macht hier keine Ausnahme. Beispiel:

while not quit:
    print 'Hallo!'
    ...

Der Schleifenkörper wird solange ausgeführt, wie die Bedingung (not quit im obigen Beispiel) wahr ist. In Python gilt, ähnlich wie in C, jeder Wert außer 0 und None als wahr.

for-Anweisung

Die for-Schleife iteriert über die Elemente einer Sequenz:

for x in [1, 2, 3, 4]:
    print x

In Verbinding mit der for-Schleife ist die eingebaute Funktion range() sehr praktisch. Sie generiert eine Sequenz, die einer arithmetischen Aufzählung entspricht:

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(5, 10)
[5, 6, 7, 8, 9]
>>> range(0, 20, 5)
[0, 5, 10, 15]

Das obige for-Beispiel lässt sich also kürzer auch so schreiben:

for x in range(1, 5):
    print x

Die Sequenz, über die iteriert wird, darf in der Schleife nicht verändert werden, es muss eine Kopie der Sequenz angelegt werden:

a = ['A', 'silly', 'sentence']
for x in a[:]: # Slice-Kopie von a erzeugen
    if len(x) > 3:
        a.insert(0, x)

Funktionen

Funktionen werden durch das Schlüsselwort def eingeleitet, darauf folgt der Funktionsname und die Parameter in Klammern. Die Syntax erlaubt Vorgabewerte. Diese werden durch ein Gleichheitszeichen an den Parameternamen angehängt. Beispiel:

def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
    while 1:
        ok = raw_input(prompt)
        if ok in ('y', 'ye', 'yes'): return 1
        if ok in ('n', 'no', 'nop', 'nope'): return 0
        retries = retries - 1
        if retries < 0: raise IOError, 'refusenik user'

Das obige Beispiel verwendet einige noch nicht besprochene Features von Python , wie die Möglichkeit Statements ohne Einrückung direkt nach einen Doppelpunkt zu stellen (Zeilen 4, 5 und 7) oder raise (Zeile 7), das eine Exception auslöst. Die Argumente, die mit Vorgabewerten belegt sind, müssen beim Aufruf nicht angegeben werden, so sind alle Folgenden Aufrufe zulässig:

ask_ok('Do this [y/n]? ')
ask_ok('Do this [y/n]? ', 100)
ask_ok('Do this [y/n]? ', 100, 'y or n, please!')

Die aus anderen Programmiersprachen geläufige return-Anweisung beendet die Funktion, wobei das Argument von return der Rückgabewert der Funktion ist. Wird die Funktion ohne return beendet, so ist der Rückgabewert, wie bereits erwähnt implizit das spezielle Objekt None.
In Python können Funktionen nicht nur auf oberster Ebene definiert werden, sondern es sind auch lokale und anonyme Funktionen möglich. Lokale Funktionen sind zum Beispiel für Hilfsfunktionen praktisch, da sie Zugriff auf die Variablen (also auch Parameter) der äußeren Funktion haben:

def foo(x):
    def times_x(y):
        return x * y
    return times_x(5)

Funktionen sind in Python "First-Class Objects", d.h. sie werden wie jeder andere Datentyp behandelt und können in Variablen gespeichert, als Parameter übergeben, von Funktionen zurückgegeben werden, usw.

Exceptions

Python unterstützt Exceptions. Sie signalisieren einen zur Laufzeit auftretenden Fehler, der nicht fatal sein muss (er kann abgefangen werden). Die meisten Exceptions werden aber nicht abgefangen und resultieren in Meldungen wie diesen:

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero

>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined

>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects

Die letzte Zeile der Fehlermeldung gibt an was passiert ist. Es gibt verschiedene Typen von Exceptions, und der Typ wird am Anfang der letzten Zeile ausgegeben. Im obigen Beispiel sind ZeroDivisionError, ZeroDivisionError und TypeError die Exceptiontypen. Der Rest der Zeile gibt Details zur aufgetreten Exception an und hängt vom Typ der Exception ab.

Exceptions behandeln

Ein Beispiel zur Exception-Behandlung:

>>> numbers = [0.3333, 2.5, 0, 10]
>>> for x in numbers:
...     print x,
...     try:
...         print 1.0 / x
...     except ZeroDivisionError:
...         print '*** has no inverse ***'
...
0.3333 3.00030003
2.5 0.4
0 *** has no inverse ***
10 0.1

Der try:...except:-Block entspricht try...catch... in C++ und Java . Er wird wie folgt abgearbeitet:
Zuerst wird der try-Block abgearbeitet. Tritt keine Exception auf, so wird der except-Block übersprungen, und die Ausführung nach dem try...except fortgesetzt. Wenn während der Ausführung des try-Blocks eine Exception auftritt, so wird der Rest des Blocks übersprungen und mit dem except-Block fortgesetzt, sofern der Typ der Exception zu dem in der except-Anweisung passt, danach wird die Ausführung nach dem try...except fortgesetzt.
Wenn eine Exception auftritt, die nicht zur except-Anweisung passt, wird ein weiter außen liegender try...except-Block gesucht. Das gilt nicht nur "textuell", lokal in einer Funktion, sondern erstreckt sich auch auf aufrufende Funktionen - war während des Aufrufs ein try...except aktiv, so wird auch dieses überprüft. Wird kein passender try...except-Block gefunden, so resultiert die Exception in einer Fehlermedung wie oben angeführt.

Exceptions auslösen

Ausgelöst werden Exceptions mit raise. Beispiel:

if something_gone_wrong:
    raise RuntimeError, 'Something has gone wrong'

Die Argumente der raise-Anweisung sind im allgemeinen eine Klasse optional gefolgt von Argumenten.

Weiterlesen: ⯈ Objektorientierte Programmierung

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant