Routineaufgaben mit Python automatisieren. Al Sweigart
Чтение книги онлайн.

Читать онлайн книгу Routineaufgaben mit Python automatisieren - Al Sweigart страница 44

Название: Routineaufgaben mit Python automatisieren

Автор: Al Sweigart

Издательство: Bookwire

Жанр: Математика

Серия:

isbn: 9783960889571

isbn:

СКАЧАТЬ "C:/sameNameError.py", line 2, in spam

      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 (image) und daher davon ausgeht, dass eggs eine lokale Variable ist. Allerdings wird print(eggs) ausgeführt, bevor eggs irgendein Wert zugewiesen wurde, also zu einem Zeitpunkt, an dem die lokale Variable eggs noch gar nicht existiert. In einem solchen Fall greift Python nicht auf die globale Variable eggs zurück (image).

       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

СКАЧАТЬ