Название: Routineaufgaben mit Python automatisieren
Автор: Al Sweigart
Издательство: Bookwire
Жанр: Математика
isbn: 9783960889571
isbn:
print(eggs) # FEHLER!
UnboundLocalError: local variable 'eggs' referenced before assignment
Die Ausführung dieses Programms können Sie sich auf https://autbor.com/sameNameError/ ansehen. Der Grund für diesen Fehler ist, dass Python die Zuweisungsanweisung für eggs in der Funktion spam() sieht (
Funktionen als »Blackbox«
Meistens müssen Sie von einer Funktion nur die Eingaben (Parameter) und die Ausgabewerte kennen. Es ist oft gar nicht nötig, sich mit der Frage zu belasten, was der Code der Funktion im Einzelnen macht. Wenn Sie Funktionen von dieser hohen Warte aus betrachten, behandeln Sie sie wie eine Blackbox.
Das ist ein grundlegendes Prinzip in der modernen Programmierung. Weiter hinten in diesem Buch werden Sie einige Module mit Funktionen kennenlernen, die von anderen Personen geschrieben wurden. Wenn Sie neugierig sind, können Sie sich zwar auch den Quellcode ansehen, doch um diese Funktionen nutzen zu können, müssen Sie deren interne Mechanismen nicht kennen. Da empfohlen wird, Funktionen ohne globale Variablen zu schreiben, müssen Sie sich gewöhnlich auch keine Sorgen darüber machen, dass sich der Code der Funktion auf den Rest Ihres Programms auswirkt.
Ausnahmebehandlung
Bis jetzt hat das Auftreten einer Fehlermeldung oder einer Ausnahme (Exception) in Ihren Python-Programmen bedeutet, dass das gesamte Programm abstürzt. In Produktionsprogrammen wollen Sie das natürlich nicht. Stattdessen sollte das Programm in der Lage sein, Fehler zu erkennen, damit umzugehen und dann weiterzulaufen.
Betrachten Sie beispielsweise das folgende Programm, bei dem eine Division durch null vorkommen kann. Geben Sie den folgenden Code im Dateieditor ein und speichern Sie ihn als zeroDivide.py:
def spam(divideBy):
return 42 / divideBy
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
Hier definieren wir die Funktion spam mit einem Parameter und geben dann die Werte dieser Funktion für verschiedene Parameter aus, um zu sehen, was geschieht. Wenn Sie den vorstehenden Code ausführen, erhalten Sie folgende Ausgabe:
21.0
3.5
Traceback (most recent call last):
File "C:/zeroDivide.py", line 6, in <module>
print(spam(0))
File "C:/zeroDivide.py", line 2, in spam
return 42 / divideBy
ZeroDivisionError: division by zero
Die Ausführung dieses Programms können Sie sich auf https://autbor.com/zerodivide/ ansehen. Der Fehler ZeroDivisionError tritt auf, wenn Sie versuchen, eine Zahl durch null zu teilen. An der Zeilennummer in der Fehlermeldung können Sie ablesen, dass die return-Anweisung in spam() den Fehler verursacht hat.
Fehler lassen sich mit den Anweisungen try und except handhaben. Stellen Sie Code, der einen Fehler verursachen kann, in eine try-Klausel. Wenn tatsächlich ein Fehler auftritt, rückt die Programmausführung zum Beginn der anschließenden except-Klausel vor.
In unserem Beispiel können Sie also den Code für die Division in eine try-Klausel stellen und in einer except-Klausel Code für den Fall angeben, dass eine Division durch null auftritt:
def spam(divideBy):
try:
return 42 / divideBy
except ZeroDivisionError:
print('Error: Invalid argument.')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
Wenn Code in einer try-Klausel einen Fehler hervorruft, fährt die Programmausführung unmittelbar mit dem Code in der except-Klausel fort und läuft anschließend ganz normal weiter. Der vorstehende Code führt zu folgender Ausgabe:
21.0
3.5
Error: Invalid argument.
None
42.0
Die Ausführung dieses Programms können Sie sich auf https://autbor.com/tryexceptzerodivide/ ansehen. Wenn in einem try-Block Funktionsaufrufe stehen, werden auch jegliche Fehler abgefangen, die dabei auftreten. Betrachten Sie das folgende Programm, bei dem die Aufrufe von spam() in einem try-Block stehen:
def spam(divideBy):
return 42 / divideBy
try:
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
except ZeroDivisionError:
print('Error: Invalid argument.')
Dieses Programm führt zu folgender Ausgabe:
21.0
3.5
Error: Invalid argument.
Die Ausführung dieses Programms können Sie sich auf https://autbor.com/spamintry/ ansehen. In diesem Fall wird print(spam(1)) niemals ausgeführt, da die Ausführung nach dem Code in der except-Klausel nicht wieder in den try-Block zurückspringt, sondern ganz normal im Programm fortgesetzt wird.
Ein kurzes Programm: Zickzackmuster
СКАЧАТЬ