Argumente in Python
Einführendes Beispiel
Wir hatten schon den Vorzeichenoperator »-« behandelt.
- Auswertung
-9
-9
Wie wir wissen, kann der Operand auch eingeklammert werden.
- Auswertung
-( 9 )
-9
An Stelle des Vorzeichenoperators »-« kann auch das Wort »neg« geschrieben werden.
- Protokoll
from operator import neg
neg( 9 )
-9
Auch auf diese Weise wird ein Vorzeichenwechsel vollzogen. Dabei steht an der Stelle des Operators »-« nun das Wort »neg«. Während »-9« eine Anwendung des Operators »-« auf den Operanden »9« ist, wird »neg( 9 )« als Aufruf der Funktion »neg« mit dem Argumentausdruck »9« bezeichnet.
Die Information über den Wert des Argumentausdrucks wird an die aufgerufene Funktion weitergegeben, damit sie diese verwenden kann, um eine Aufgabe zu erledigen.
Der Aufruf entspricht dem Genitiv »neg( 9 )« = „das Negative der Zahl 9“ oder einer „von“-Konstruktion „das Negative von 9“.
Argumente
Beim Aufruf mancher Objekte kann oder muß in den für den Aufruf verwendeten Klammern ein Ausdruck geschrieben werden, der Argumentausdruck genannt wird. Im Aufruf »neg( 9 )« ist »9« der Argumentausdruck.
Der Wert des Argumentausdrucks wird Argumentwert genannt (oben: »9«).
Wenn wir von einem Argument sprechen, meinen wir damit den Argumentausdruck.
- Aufruf mit Argument
neg( 9 )
- Aussprache
- ausführlich: Aufruf der Funktion „neg“ mit dem Argument „Neun“
- kurz: „neg“ von Neun
- hier auch möglich (aber weniger eindeutig): das Negative von Neun
Man beachte den Gebrauch des Wortes „von“ zur Kennzeichnung des Arguments eines Aufrufs bei der mündlichen Aussprache: »neg( 9 )« wird oft als „‚neg‘ von Neun“ gesprochen.
Sprechweisen
- Aufruf mit Argument
neg( 9 )
- Sprechweisen
- (die Funktion) »neg« wird mit Neun aufgerufen
- (die Funktion) »neg« wird auf Neun angewendet
- (die Funktion) »neg« wird auf Neun aufgerufen
- (der Funktion) »neg« wird das Argument Neun übergeben
- (die Funktion) »neg« akzeptiert Neun (als Argument)
- »neg« (von) Neun
- (hier) „das Negative von Neun“
- (hier) „der Wert der Funktion »neg« an der Stelle Neun“
Parameter
Man stellt sich vor, daß es innerhalb der Funktion »neg« eine Speicherstelle gibt, in die bei einem Aufruf der Wert des Arguments geschrieben wird. Diese Speicherstelle wird als Parameter bezeichnet.
- Die Funktion »neg« mit Parameter (Sinnbild)
.---------.
| neg |
| .-----. |
| | | |
| '-----' |
'---------'
Inkarnationen
Ein aufrufbares Objekt, in deren Parameter ein Argumentwert geschrieben wurde, wird als eine Inkarnation (des aufrufbaren Objektes) bezeichnet.
- Eine Inkarnation der Funktion »neg« (Sinnbild)
.---------.
| neg |
| .-----. |
| | 9 | |
| '-----' |
'---------'
Eine Inkarnation kann wie ein Programm gestartet werden.
Bei der Auswertung des Aufrufs »neg( 9 )« wird die Funktion ›neg‹ mit dem Argumentwert «9» inkarniert und die erhaltene Inkarnation wird dann gestartet.
Da manchmal mehrere Inkarnationen desselben aufrufbaren Objektes gleichzeitig benötigt werden, wird bei der Herstellung einer Inkarnation praktisch jedesmal ein neues Objekt angelegt, das aus einem Verweis auf das aufrufbare Objekt und dem Objekt, das die Auswertung des Argumentausdrucks ergab, besteht.
Kurz gesagt Eine Inkarnation ist eine Verbindung eines aufrufbaren Objekts mit einem Argumentobjekt.
Syntax
In der Syntax erscheint das Argument als ein Ausdruck, der in den Klammern vorkommen darf.
- Syntax
Aufruf
.-----------------. .-. .----------. .-.
--->| Primaerausdruck |--->( ( )---.--->| Ausdruck |---.--->( ) )--->
'-----------------' '-' | '----------' ^ '-'
'-------------------'
Praelat Argumentausdruck
Anforderungen
Der Wert des Primärausdrucks muß ein aufrufbares Objekt sein, das einen Aufruf mit einem Argumentausdruck gestatten muß, falls ein Argumentausdruck angegeben wurde, oder einen Aufruf ohne ein Argument gestatten muß, falls kein Argumentausdruck angegeben wurde.
(Ob ein aufrufbares Objekt einen Aufruf mit einem Argumentausdruck oder ohne ein Argumentausdruck gestattet, kann man in der Dokumentation nachlesen.)
Semantik
Die Semantik eines Aufrufs ohne Argumentausdruck wurde schon behandelt.
Bei der Auswertung eines Aufrufs mit einem Argumentausdruck wird zuerst der Primärausdruck und dann der Ausdruck ausgewertet (die Reihenfolge, in der dies geschieht, wird von The Python Language Reference, Release 3.7.0a1, 6.15 festgelegt). Die Auswertung des Primärausdrucks ergibt ein aufrufbares Objekt, und die Auswertung des Ausdrucks ergibt ein Objekt. Alsdann wird eine Inkarnation (Verbindung) des aufrufbaren Objekts mit dem Objekt hergestellt und gestartet. Diese legt dann den Wert des Aufrufes fest.
Typerwartungen
Wenn ein Argument vom Typ ›int‹ erwartet wird, so kann auch ein Argument vom Typ ›bool‹ angegeben werden («True» steht dann für «1» und «False» für «0»).
Ansonsten hängt es von der jeweiligen Funktion ab, wie Argumente behandelt werden, deren Typ anders als erwartet ist. Man kann davon ausgehen, daß ein Argument vom Typ ›int‹, das nicht zu groß ist, in der Regel akzeptiert und umgewandelt wird, wenn ein Argument vom Typ ›float‹ erwartet wird.
Anmerkungen
Komplexe Argumentausdrücke
Argumentausdrücke können beliebige Ausdrücke sein (wenn nicht in Einzelfällen zusätzliche Anforderungen, etwa an den Typ des Argumentwertes, dagegenstehen).
So kann ein Argumentausdruck wie in dem folgenden Beispiel, eine Summe sein.
- Auswertung
neg( 4 + 3 )
-7
Durch einen Operatorausdruck als Argumentausdruck können wir den Unterschied zwischen einem Argumentausdruck und seinem Wert (dem Argumentwert) verdeutlichen: Der Argumentausdruck in »neg( 4 + 3 )« ist »4 + 3«, der Argumentwert ist «7».
Da „Argument“ alleine „Argumentausdruck“ bedeutet, ist das Argument in »neg( 4 + 3 )« also »4 + 3« (und nicht «7»).
Die Bezeichnung „Argumentausdruck“ gehört zur Syntax, die Bezeichnung „Argumentwert“ zur Semantik.
Formatierung
In diesem Kurs werden Leerzeichen nach einer öffnenden »(« und vor einer schließenden Klammer »)« verwendet, obwohl dies so nicht allgemein üblich ist und nicht von der Stilfibel PEP 8 empfohlen wird. Das folgende Beispiel zeigt die Schreibweise ohne jene Leerzeichen. Es könnte der Eindruck entstehen, daß die »4« eher zu »neg(« gehört als zu »+«. Um solch einen Eindruck zu vermeiden, werden in diesem Kurs zusätzliche Leerzeichen auf der Innenseite von Klammern verwendet.
- Quelltext ohne Leerzeichen auf der Innenseite von Klammern (PEP 8 )
neg(4 + 3)
- Quelltext ohne Leerzeichen auf der Innenseite von Klammern (PEP 8 ) (übertrieben dargestellt)
neg(4 + 3)
- Quelltext mit Leerzeichen auf der Innenseite von Klammern (oft in diesem Kurs zu finden)
neg( 4 + 3 )
Übungsfragen
Wir setzen bei den folgenden Übungen geeignete Importe voraus.
- Importe
from math import floor
from random import random
from operator import neg
? Übungsfrage
Die Funktion »abs« aus dem Modul »builtins« ergibt den Betrag ihres Argumentwertes. Der Betrag einer Zahl ist ihr Abstand von «0».
Wie spricht man den Ausdruck »abs( 2 )« aus und welchen Wert hat er?
? Übungsfrage
Die Funktion »neg« aus dem Modul »operator« ergibt das Negative ihres Argumentwertes.
Wie spricht man den Ausdruck »neg( 2 )« aus und welchen Wert hat er?
? Ausdrücke lesen
- Aussprachehinweis
- floor ˈflɔɚ
Was ist der Argumentausdruck in dem Aufrufausdruck »floor( 2 + 3.2 )«?
Was ist der Argumentwert in dem Aufrufausdruck »floor( 2 + 3.2 )«?
? Ausdrücke lesen (1)
Was ist der Argumentausdruck in dem Aufrufausdruck »floor( random() * 4 )«?
Welche Werte kann dieser Argumentausdruck haben?
Die Boden-Funktion »floor« (»from math import floor«) ergibt die Abrundung des Wertes ihres Argumentausdrucks zur nächsten darunterliegenden ganzen Zahl (genauergesagt: zur größten ganzen Zahl, die nicht größer als der Argumentwert ist, die sogenannte „untere Gaußklammer “). Beispielsweise sind »floor( 5.0 )« und »floor( 5.7 )« beide gleich «5» (vom Typ ›int‹), während »floor( 4.99 )« gleich «4» ist.
Welche Werte kann der Aufrufausdruck »floor( random() * 4 )« haben?
? Ermittlung von Operanden ⃗
Kann es eine Funktion »f« geben, die wie in den folgenden Beispielen gezeigt, den linken Operanden ihres Argumentausdrucks ergibt?
- Auswertung
f( 1 + 3 )
1
- Auswertung
f( 2 + 2 )
2
- Auswertung
f( 3 + 1 )
3
Übungsaufgaben
Ab jetzt dürfen bei allen Übungsaufgaben auch passende Funktionen aus der Dokumentation herausgesucht und verwendet werden, selbst wenn sie noch nicht im Kurs vorgestellt wurden. Ausgenommen davon sind lediglich Übungsaufgaben, bei denen ausdrücklich Gegenteiliges gesagt wird. Jedoch gibt es im Kurs nur relativ wenige Aufgaben, bei denen es unbedingt nötig ist, etwas selber herauszusuchen. Dies kann immer dann in Erwägung gezogen werden, wenn man mit den bisher vorgestellten Mitteln keinen Weg zur Lösung einer Aufgabe sieht.
/ Übungsaufgabe
Schreiben Sie einen Aufruf der Boden-Funktion »floor« mit dem Argumentausdruck »1.1 + 7.0«. Die Formatierung (Verwendung von Leerzeichen) können Sie dabei selber festlegen.
/ Übungsaufgabe
Zur Lösung dieser Aufgabe soll die Funktion »random« aus dem Modul »random« verwendet werden. Andere Funktionen dürfen bei der Lösung dieser Aufgabe nicht verwendet werden.
Schreiben Sie einen Ausdruck, der bei jeder Auswertung eine ganze Zahl, die entweder 0 oder 1 ist, ergibt. Die Wahrscheinlichkeit für jeden der beiden Werte soll näherungsweise gleich groß sein.
(In der Lösung dieser Aufgabe darf auch »floor« verwendet werden.)
/ Übungsaufgabe ⃗
Schreiben Sie einen Ausdruck, der bei jeder Auswertung eine ganze Zahl zwischen 1 (einschließlich) und 6 (einschließlich) ergibt. Die Wahrscheinlichkeit für jeden der 6 Werte soll näherungsweise gleich groß sein.
(In der Lösung dieser Aufgabe darf auch »floor« verwendet werden.)