583
21.4
Selbstdokumentation
Nach dem Schlüsselwort raise wird der Name einer passenden Exception-Klasse aufge-
führt und dahinter in Klammern ein »assoziierter Wert«. Das ist ein String, der den Fehler
näher erläutert und in der Fehlermeldung hinter dem Namen der Ausnahme auftaucht. Die
folgende Funktion
fak(n) berechnet die Fakultät einer nichtnegativen Zahl n. Es gilt
fak(n) == 1*2*...*n. In den if-Anweisungen wird die Vorbedingung getestet, dass die
übergebene Zahl
n eine nichtnegative ganze Zahl ist.
21.4 Selbstdokumentation
Um die Funktionsweise eines schwer durchschaubaren Algorithmus transparent zu
machen, kann man ein Programm so gestalten, dass es seine Arbeitsweise selbst dokumen-
tiert. Dazu streut man
print()-Aufrufe ein, in denen die Inhalte wichtiger Variablen aus-
gegeben und erläutert werden. Anhand der Ausgabe des Programms kann man prüfen, ob
es so läuft, wie man es geplant hat, und etwaige logische Fehler finden.
>>> def fak(zahl):
# Prüfe Vorbedingung
if zahl < 0:
raise ValueError("zahl muss >= 0 sein")
if type(zahl) != int:
raise TypeError("zahl muss vom Typ int sein")
produkt = 1
for i in range(1, zahl):
produkt *= i
return produkt
>>> fak(10)
362880
>>> fak(-1)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
fak(-1)
File "<pyshell#1>", line 4, in fak
raise ValueError("zahl muss >= 0 sein")
ValueError: zahl muss >= 0 sein
>>> fak(10.1)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
fak(10.1)
File "<pyshell#0>", line 6, in fak
raise TypeError("zahl muss vom Typ int sein")
TypeError: zahl muss vom Typ int sein
Kapitel 21
Fehler finden und vermeiden
584
Das folgende Beispiel zeigt eine Variante der Quicksort-Funktion, die eine Liste von Zahlen
aufsteigend sortiert (siehe Abschnitt 7.4.6).
Skript:
Erläuterung:
Das Skript wird als Modul in einer eigenen Datei namens
qsort1.py abgespeichert. Nur
dann, wenn das Skript (zu Testzwecken) als eigenständiges Programm ausgeführt wird, hat
die Variable
__name__ den Wert __main__. Nur in diesem Fall wird am Ende (#2) eine Liste
mit Zufallszahlen erzeugt und die Funktion
quicksort() aufgerufen. Und auch nur in die-
sem Fall werden hinter Zeile
#1 die print-Anweisungen zur Selbstdokumentation ausge-
führt.
Wird das Modul von einem anderen Skript aus importiert, dann ist der Name nicht
__main__, sondern qsort1 und es werden die Test-Anweisungen übersprungen.
Programmlauf (Start als eigenständiges Skript):
# qsort1.py
import random
def quicksort(s):
if __name__ == '__main__': #1
if len(s) > 0:
print("Ich sortiere: ", s)
print("Element zum Spalten der Liste: ",s[0])
if len(s) <= 1: return s
else:
return quicksort( [ x for x in s[1:] if x < s[0]])\
+ [s[0] ] \
+ quicksort( [ y for y in s[1:] if y >= s[0]])
if __name__== '__main__': #2
s = [random.randint(0, 100) for i in range(8)]
print(quicksort(s))
Ich sortiere: [7, 61, 24, 9, 20, 34, 68, 10]
Element zum Spalten der Liste: 7
Ich sortiere: [61, 24, 9, 20, 34, 68, 10]
Element zum Spalten der Liste: 61
Ich sortiere: [24, 9, 20, 34, 10]
Element zum Spalten der Liste: 24
Ich sortiere: [9, 20, 10]
Element zum Spalten der Liste: 9
Ich sortiere: [20, 10]
Element zum Spalten der Liste: 20

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.