Muster von Bindungsanweisungen in Python
In dieser Lektion zeigen wir einige Arten des Einsatzes von Bindungsanweisungen aus der Praxis. (Diese Auflistung ist nicht vollständig oder frei von Überlappungen ihrer einzelnen Abschnitte.)
Die absolute Bindungsanweisung
Bei einer absoluten Bindungsanweisung wird ein Name an einen Wert gebunden, der bereits durch diese Bindungsanweisung selber festgelegt ist. Die Bindungsanweisung »b = 5« bindet den Namen »b« beispielsweise an den Wert «5».
- Beispiel
b = 5
Die Benennung eines Ergebnisses
Bei der Benennung eines Ergebnisses wird ein Name an den Wert eines Operatorausdrucks oder eines Funktionsaufrufs gebunden, der so für eine spätere Verwendung aufbewahrt werden kann.
- Beispiel
from random import random
zufallszahl = random()
- Beispiel
summe = 1 + 2 + 7 + 102
Die relative Bindungsanweisung
Bei einer relativen Bindungsanweisung wird ein Name an einen Wert gebunden, der durch schon bestehende Bindungen von Namen mitbestimmt ist. Bei der folgenden relativen Bindungsanweisung wird der Name »a« an einen Wert gebunden, der durch die Bindungen der Namen »b« und »c« bestimmt wird.
- Beispiel
a = b + c + 1
Die selbstbezügliche Bindungsanweisung
Bei einer selbstbezüglichen Bindungsanweisung wird ein Name an einen Wert gebunden, der durch die bisherige Bindung desselben Namens mitbestimmt ist.
- Beispiel
a = a + b
- Beispiel
a += b
Selbstbezügliche Bindungsanweisungen sind eine Spezialfall relativer Bindungsanweisungen.
Rein selbstbezügliche Bindungsanweisung
Bei einer rein selbstbezüglichen Bindungsanweisung wird ein Name an einen Wert gebunden, der nur durch die Bindungsanweisung und die bisherige Bindung desselben Namens bestimmt ist.
- Beispiel
a = a * a + 5 * a - 2
Rein selbstbezügliche Bindungsanweisungen sind eine Spezialfall selbstbezüglicher Bindungsanweisungen.
Erhöhen
Beim Erhöhen wird der Wert eines Namens um einen bestimmten Wert erhöht.
- Beispiel
a += 5
Das Erhöhen ist eine Spezialfall einer rein selbstbezüglichen Bindungsanweisung.
Vermindern
Beim Vermindern wird der Wert eines Namens um einen bestimmten Wert vermindert.
- Beispiel
a -= 2
Das Vermindern ist eine Spezialfall einer rein selbstbezüglichen Bindungsanweisung.
Inkrementieren
Beim Inkrementieren wird der Wert eines Namens um Eins erhöht.
- Beispiel
a += 1
Das Inkrementieren ist eine Spezialfall des Erhöhens eines Namens.
Dekrementieren
Beim Dekrementieren wird der Wert eines Namens um Eins vermindert.
- Beispiel
a -= 1
Das Inkrementieren ist eine Spezialfall des Verminderns eines Namens.
Zählen
Beim Zählen mit einem Namen wird dieser zunächst an die ganze Zahl «0» gebunden. Dieser Schritt wird Initialisierung genannt. Danach wird immer, wenn etwas Bestimmtes passiert ist, der Name inkrementiert. Auf dieser Weise erreicht man es, daß der Name schließlich an diejenige Zahl gebunden ist, die angibt, wie oft der Name inkrementiert wurde (also, wie oft etwas Bestimmtes passiert ist).
- Initialisieren (durch eine absolute Bindungsanweisung)
zaehler = 0
- Inkrementieren
zaehler += 1
- Inkrementieren
zaehler += 1
- Inkrementieren
zaehler += 1
Der Name »zaehler« ist nun an die Zahl «3» gebunden, die nun angibt, wie oft der Name inkrementiert wurde (also wie oft etwas Bestimmtes passiert ist).
Der häufigste Fehler beim Zählen ist das Vergessen (Weglassen) der Initialisierung.
Saldieren (Aufsummieren)
Beim Saldieren (Aufsummieren) werden verschiedene Zahlen zum Wert eines Namens hinzuaddiert, so daß der Name schließlich an die Summe all jener Zahlen gebunden ist. Dies ist eine Möglichkeit, die Summe von Zahlen zu ermitteln.
- Initialisieren (durch eine absolute Bindungsanweisung)
saldo = 0
- Erhöhen
saldo += 2
- Erhöhen
saldo += 3
- Erhöhen
saldo += 2
Der Name »saldo« ist nun an die Zahl «7», die Summe der Werte «2», «3» und «2», gebunden.
Auch hier ist darauf zu achten, die Initialisierung mit Null nicht zu vergessen.
Zerlegen verschachtelter Ausdrücke in mehrere Schritte
Bei verschachtelten Ausdrücken stimmt die Reihenfolge der Ausführung nicht immer mit der Reihenfolge im Quelltext überein (»input« steht im folgenden Beispiel hinter »print«, wird aber vorher ausgeführt). Außerdem ist es manchmal schwierig zu erkennen, welche schließende Klammer zu welcher öffnenden Klammer gehört.
- Verschachtelte Ausdrücke
print( int( input() ) + int( input() ))
Durch Einführung von Namen für die Werte der verschiedenen Teilausdrücke (Operanden und Argumente), also durch die Benennung von Ergebnissen, können beide Probleme vermieden werden.
- Mehrere Schritte
eingabe_0 = input(); zahl_0 = int( eingabe_0 )
eingabe_1 = input(); zahl_1 = int( eingabe_1 )
summe = zahl_0 + zahl_1
print( summe )
Die Einführung vieler Namen und Vergrößerung der Länge des Quelltextes kann aber auch wieder als nachteilig angesehen werden, da auch sie die Lesbarkeit verschlechtern kann. Es ist nicht möglich, objektiv zu sagen, welche Variante besser ist. Dies muß jeder Autor selber entscheiden.
Ein Kompromiß kann darin bestehen, einige Verschachtelungen noch zu akzeptieren und nicht zu viele Namen einzuführen. Das folgende Beispiel führt gegenüber dem ursprünglichen Beispiel nur einen weiteren Namen ein und verteilt die zehn Klammern auf drei verschiedene Anweisungen, so daß jede Anweisung nur noch maximal vier Klammern enthält.
- Kompromiß
saldo = 0
saldo += int( input() )
saldo += int( input() )
print( saldo )
Retten und Wiederherstellen
Manchmal soll ein bestimmter Wert nur vorübergehend verändert werden. Beispielsweise soll der Name »v« vielleicht vorübergehend an den Wert «99» gebunden werden, obwohl er bereits einen Wert hat, den wir hier als den „alten Wert“ bezeichnen.
In diesem Fall kann der alte Wert von »v« an einen anderen Namen gebunden werden, der noch ungebunden ist, wie beispielsweise »old_v«. Dann kann der Wert von »v« verändert werden. Da der alte Wert aber noch an »old_v« gebunden ist, ist es möglich »v« schließlich wieder an seinen alten Wert zu binden.
- Beispiel
old_v = v
- Beispiel
v = 99
- Beispiel
v = old_v
Im folgenden Beispiel wird eine Einstellung mit Hilfe von ›setrecursionlimit‹ auf den Wert «2000» gesetzt. Zuvor wurde aber der bisherige Wert der Einstellung mit Hilfe von »getrecursionlimit()« ausgedrückt und an den Namen »old« gebunden. Dadurch ist es dann möglich, die Einstellung später wieder auf diesen ursprünglichen Wert zurückzusetzen. Dies ist beispielsweise dann passend, wenn der Wert zwar vorübergehend verändert werden muß, der ursprüngliche Wert aber normalerweise besser ist.
- Skript
from sys import getrecursionlimit, setrecursionlimit
old = getrecursionlimit() # Retten
setrecursionlimit( 2000 )
# ...
setrecursionlimit( old ) # Wiederherstellen