Verschachtelungen in Python
Das bisherige Syntaxdiagram, demzufolge beide Operanden einer Potenzierung stets Literale sein müssen, war vereinfacht.
Tatsächlich, darf der rechte Operand auch wieder eine Potenz sein.
- Syntaxdiagramm
Potenz
.---------. .--. .---------.
--->| Literal |--->( ** )--->| Literal |--->
'---------' '--' '---------''·. |
'·. |
'·. |
'·. |
'·. |
'·. |
'·. |
Potenz
.---------. .--. .---------.
--->| Literal |--->( ** )--->| Potenz |--->
'---------' '--' '---------'
Das Potenzieren ist rechtsassoziativ.
- Eingabe eines Ausdrucks und Ausgabe einer Textdarstellung seines Wertes
2 ** 2 ** 3
256
Ein Operand kann nun als der Teil eines Operatorausdrucks definiert werden, der einem Nichtterminalsymbol für einen Ausdruck im Syntaxdiagramm eines Operators entspricht.
Klammern
Tatsächlich ist es in einer Potenz auch erlaubt Primärausdruck an Stelle von Literalen zu verwenden.
Dadurch sind Ausdrücke wie »(2**3)**2« erlaubt.
Ein Literal als Operand kann immer durch einen Klammerausdruck ersetzt werden, der dann weiterhin ein Operand ist.
»8**2« → »(2**3)**2«
Wird in »8**2« die »8« aber durch »2**3« ohne Klammern ersetzt, so ist »2**3« in »2**3**2« kein Operand mehr.
»8**2« ↛ »2 ** 3**2« = »2 ** (3**2)«
- Syntaxdiagramm
Primaerausdruck
.---------.
--->| Literal |--->
'---------'.-. .----------. .-.
--->( ( )--->| Ausdruck |--->( ) )--->
'-' '----------' '-'Potenz
.-----------------. .--. .-----------------.
--->| Primaerausdruck |--->( ** )--->| Primaerausdruck |--->
'-----------------' '--' '-----------------'.-----------------. .--. .---------.
--->| Primaerausdruck |--->( ** )--->| Potenz |--->
'-----------------' '--' '---------'Ausdruck
.-----------------.
--->| Primaerausdruck |--->
'-----------------'.--------.
--->| Potenz |--->
'--------'
Vereinfachte Syntaxdiagramme
Das oben dargestellte Syntaxdiagramm gibt die Regelung der Assoziativitätsrichtung des Potenzierens an, indem eine weitere Potenz nur auf der rechten Seite des Operators »**« zulässig ist.
Solche detaillierten Syntaxdiagramme können aber eine Überforderung für Anfänger darstellen.
Deswegen werden wie im weiteren Verlauf des Kurses oft vereinfachte Syntaxdiagramme verwenden, die nicht zwischen verschiedenen Arten von Ausdrücken unterscheiden.
- Syntaxdiagramm (vereinfacht)
Ausdruck (Potenz)
.----------. .--. .----------.
--->| Ausdruck |--->( ** )--->| Ausdruck |--->
'----------' '--' '----------'
Bei Verwendung solcher vereinfachter Syntaxdiagramme müssen dann noch zusätzlich zum Syntaxdiagramm Regeln, wie die zur Assoziativitätsrichtung von Operatoren angegeben werden.
- Regel
- Der Potenzoperator »**« ist rechtsassoziativ.
Anmerkungen zum Potenzieren ⃗
Python ist in der Lage, auch große ganzzahlige Werte genau und schnell zu berechnen.
- Eingabe eines Ausdrucks und Ausgabe einer Textdarstellung seines Wertes
4 ** 4 ** 4
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
Wenn man jedoch eine Berechnung verlangt, deren Ergebnisse extrem groß sind, kann die Berechnung so lange dauern (oder so viel Speicherplatz verlangen), daß sie praktisch nicht mehr durchführbar ist. (Die Berechnung kann unter manchen Umgebungen mit Strg-C abgebrochen werden.)
- Protokoll
3 ** 3 ** 3 ** 3
Eine float-Potenzierung hat nur begrenzte Stellenzahl und Zahlengröße und kommt daher gegebenenfalls schnell entweder zu einem näherungsweisen Ergebnis oder einer Fehlermeldung.
- Eingabe eines Ausdrucks und Ausgabe einer Textdarstellung seines Wertes
4 ** 4 ** 4.
1.3407807929942597e+154
- Protokoll (gekürzt und übersetzt)
3 ** 3 ** 3 ** 3.
UeberlaufFehler: (34, 'Ergebnis zu gross')