Die Subtraktion »…-…« in Python
Einführendes Beispiel
In Python kann auch eine Differenz in der gewohnten Schreibweise als Ausdruck verwendet werden.
- Eingabe eines Ausdrucks und Ausgabe einer Textdarstellung seines Wertes
1 - 1
0
- auf deutsch:
- ● „Eins minus Eins“
Syntax
Das folgende vereinfachte Syntaxdiagramm zeigt die bisher vorgestellten Operatoren mit Produktionsregeln, die in Reihenfolge abnehmender Priorität angeordnet sind.
- Syntaxdiagramm (vereinfacht)
Ausdruck
.---------.
--->| Literal |--->
'---------'Ausdruck
.-. .----------. .-.
--->( ( )--->| Ausdruck |--->( ) )--->
'-' '----------' '-'Ausdruck
.----------. .--. .----------.
--->| Ausdruck |--->( ** )--->| Ausdruck |--->
'----------' '--' '----------'Ausdruck
.-. .----------.
---.--->( + )---.--->| Ausdruck |--->
| '-' | '----------'
| .-. |
'--->( - )---'
'-'Ausdruck
.----------. .-. .----------.
--->| Ausdruck |---.--->( * )---.--->| Ausdruck |--->
'----------' | '-' | '----------'
| .-. |
'--->( / )---'
'-'Ausdruck
.----------. .-. .----------.
--->| Ausdruck |---.--->( + )---.--->| Ausdruck |--->
'----------' | '-' | '----------'
| .-. |
'--->( - )---'
'-'
Syntax, Typanforderungen, Typsemantik, Assoziativität und Priorität sind bei diesem binären Operator wie bei der Addition, nur daß hier keine Zeichenketten erlaubt sind und man den linken Operanden als Minuenden und den rechten als Subtrahenden bezeichnet. Die Semantik (der Wert) ist hingegen die der Subtraktion (Differenz).
Man beachte, daß wir jetzt zwischen einem unären und einem binären Minus-Operator unterscheiden müssen.
Assoziativitätsrichtung
Wir haben die Assoziativitätsrichung von Operatoren bisher immer den Syntaxdiagrammen entnommen (bei der Beantwortung von Übungsfragen). Diese Vorgehensweise liefert in Zweifelsfällen auch die genauesten Antworten.
Man kann die Assoziativitätsrichung aber auch als extra Information festhalten: Bis auf den rechtsassoziativen Potenzoperator »**« sind alle bisher vorgestellten binären Operatoren linksassoziativ. Das heißt:
- Eine Folge von Potenzoperatoren und ihren Operanden wird von rechts zusammengefaßt.
- Eine Folge multiplikativer Operatoren (multiplikative Operatoren sind »*« oder »/«) und ihrer Operand wird von links zusammengefaßt.
- Eine Folge additiver Operatoren (additive Operatoren sind »+« oder »-«) und ihrer Operand wird von links zusammengefaßt.
Die Assoziativität kann man bei der Subtraktion deutlicher erkennen als bei der Addition, weil das Ergebnis einer Abfolge zweier Subtraktionen von der Art der Zusammenfassung von Operanden abhängt.
- Auswertung
8 - 2 - 3
3
Addition und Subtraktionen haben die gleiche Priorität. Daher wird bei einer Kombination beider Operatoren, in der sie einen Operanden teilen, ebenfalls gemäß der Assoziativität dieser beiden Operatoren von links nach rechts zusammengefaßt.
- Eingabe eines Ausdrucks und Ausgabe einer Textdarstellung seines Wertes
8 - 4 + 4
8
Priorität
Wir haben die Priorität von Operatoren bisher immer den Syntaxdiagrammen entnommen (bei der Beantwortung von Übungsfragen). Diese Vorgehensweise liefert in Zweifelsfällen auch die genauesten Antworten.
Man kann die Prioriät von Operatoren aber auch als extra Information festhalten. Die bisher vorgestellten Operatoren haben Prioritäten gemäß der folgenden Tabelle: Ein weiter oben stehender Operator hat eine höhere Priorität.
- Eigenschaften
S P A (S = Stelligkeit ("Aritaet"), P = Position, A = Assoziativitaet)
() 1 Z Eingeklammerter Ausdruck
** 2 I R Potenzieren
+ - 1 P Unaere vorangestellte Operatoren (Vorzeichen)
* / 2 I L "Punktrechnung": Multiplikation, Division
+ - 2 I L "Strichrechnung": Addition, Subtraktion
Steht ein Operand zwischen Operatoren unterschiedlicher Priorität, so gehört er zu dem Operator mit der höheren Priorität.
Steht ein Operand zwischen Operatoren gleicher Priorität, so haben beiden Operatoren die gleiche Assoziativitätsrichtung, welche dann die Interpretation des Ausdrucks festlegt (siehe oben).
Man sagt ja auch: „Punktrechnung geht vor Strichrechnung.“ – „Punktrechnung“ umfaßt die Operatoren mit Punkten (die Multiplikation ‹ · › und die Division ‹ : ›) und „Strichrechnung“ die Operatoren mit Strichen (die Addition ‹ + › und die Subtraktion ‹ − ›).
In »3 + 8./2« ist die »8.« also ein Operand der Division und nicht der Addition, da die Division höhere Priorität als die Addition hat.
- Eingabe eines Ausdrucks und Ausgabe einer Textdarstellung seines Wertes
3 + 8/2
7.0
Um eine spezielle gewünschte Zusammenfassung zu erreichen, können Ausdruckklammern verwendet werden.
- Eingabe eines Ausdrucks und Ausgabe einer Textdarstellung seines Wertes
( 2 + 4 )/2
3.0
Vorzeichen haben eine höhere Priorität als die Addition:
- Eingabe eines Ausdrucks und Ausgabe einer Textdarstellung seines Wertes
-3 + 9
6
Soll sich ein Vorzeichen auf eine ganze Summe beziehen, so kann die Summe eingeklammert werden.
- Eingabe eines Ausdrucks und Ausgabe einer Textdarstellung seines Wertes
-( 3 + 9 )
-12
In der folgenden Tabelle haben die Operatoren eine höhere Priorität, die weiter oben stehen.
Formatierung
Leerzeichen können verwendet werden, um Ausdrücke übersichtlich zu schreiben.
- Beispiele
2+4/2
2 + 4/2
2 + 4 / 2
- Beispiele
(2+4)/2
( 2 + 4 )/ 2
( 2 + 4 ) / 2
Häufig wird Leerraum um binäre Operatoren herum eingesetzt, aber nicht zwischen unären Operatoren und ihren Operanden.
Zur Verdeutlichung der Priorität kann auch ein Quotient mit Numeralia als Operanden ohne Leerzeichen geschrieben werden, wenn er in einem Ausdruck als Operand einer Addition vorkommt.
- Auszug aus PEP 8 (Stand 2018) (gekürzt)
- If operators with different priorities are used, consider adding whitespace around the operators with the lowest priority(ies). Use your own judgment; however, never use more than one space, and always have the same amount of whitespace on both sides of a binary operator.
- Yes:
i + 1
x*2 - 1
x*x + y*y
(a+b) * (a-b)
- No:
i+1
x * 2 - 1
x * x + y * y
(a + b) * (a - b)
Auswertung des Operatorausdrucks »3 + 8/2« (Semantik) ⃗
Wir behandeln nun noch die Auswertung des Ausdrucks »3 + 8/2«.
- Eingabe eines Ausdrucks und Ausgabe einer Textdarstellung seines Wertes
3 + 8/2
Bei der Auswertung dieses Ausdrucks werden zunächst die beiden Operanden »3« und »8/2« ausgewertet. Die Auswertung von »3« ergibt «3» . Die Auswertung von »8/2« ist selber wieder eine Auswertung eines Operatorausdrucks!
Auswertung des Operatorausdrucks »8/2«
Zunächst werden die Operanden und der Operator zum internen Ausdruck „«8» ‹/› «2»“ internalisiert.
Solch eine Kombination einer Operation mit internen Werten für alle Operandenstellen der Operation wird auch als Inkarnation bezeichnet.
Nur Inkarnationen von Operatoren können sofort ausgewertet werden.
- Erste Inkarnation
- «8» ‹/› «2»
Die Auswertung dieser Inkarnation ergibt den internen Wert «4.0».
Ausführung der zweiten Inkarnation
Nachdem nun die Operandenwerte «3» und «4.0» für die Addition ermittelt wurden, kann die Addition [+] als „«3» ‹/› «4.0»“ inkarniert werden.
- Zweite Inkarnation
- «3» ‹/› «4.0»
Die Ausführung der zweiten und letzten Inkarnation ergibt dann das Endergebnis «7.0».
Man beachte: Die Division wurde zuerst berechnet, obwohl sie im Quelltext auf die Addition folgt.
Die Informationsabhängigkeit legt fest, daß die Division zuerst ausgeführt werden muß, denn das Ergebnis der Division wird zur Ausführung der Addition benötigt.
Übungsaufgaben *
/ Rechnungen *
Berechnen Sie mit Python, wieviel Millimeter 20 Zentimeter sind (mathematisches Ergebnis: ‹ 200 ›).
Berechnen Sie mit Python, wieviel Euro 25 Cent sind (mathematisches Ergebnis: ‹ 0,25 ›).
Berechnen Sie mit Python, den Rechnungsbetrag mit Mehrwertsteuer bei einem Warenwert von 20 Euro.
/ Rechnungen (1) *
Ein Läufer benötigt 50 Minuten und 20 Sekunden für eine Strecke von 12 Kilometern. Berechnen Sie seine durchschnittliche Geschwindigkeit in km/h und m/s.
Zusatzaufgaben *
/ Zusatzaufgabe *
Die Kreiszahl ‹ π › ist gleich ‹ 4 ·( 1 − 1/3 + 1/5 − 1/7 + 1/9 − 1/11 + 1/13 − 1/15 + … ) ›.
Schreiben Sie ein Programm, welches unter Verwendung dieser Gleichheit eine Näherung für ‹ π › ausgibt. Dabei dürfen nur die bisher im Kurs vorgestellten Sprachmittel verwendet werden.