ich für den Python-Ausdruck zu glauben, verwendet f(g)(x)
, der Bewertungsprozess ist:Expression Evaluierungsmechanismus von Python
- auswerten
f(g)
, Rückkehrfunktionh
; - Werten Sie
h(x)
aus, geben Sie das Endergebnis zurück.
Aber der folgende Code zeigt dies ist nicht wahr:
def double(x):
return 2 * x
def double_or_zero(f):
def f_or_zero(x):
if x > 0:
return f(x)
else:
return -999
return f_or_zero
print(double_or_zero(double)(3))
print(double_or_zero(double)(-3))
Wenn der erste Teil (falls vorhanden) double_or_zero(double)
ausgewertet wird, kann es zu "sehen" den Parametern (3
und -3
) in der nächste Schritt, , die das von-links-nach-rechts-Bewertungsmodell zeigt, ist nicht wahr.
Also was ist der Ausdruck Evaluierungsmechanismus für Python (2.x und 3.x)?
aktualisieren
Dank Bi Rico Antwort wertet Python Ausdruck zu Recht streng von links. Hoffe, dass der Code unten macht es deutlich:
def double(x):
return 2 * x
def f_or_zero(this_f):
def this_f_or_zero(x):
print('I am running with x = %s' % x)
if x > 0:
return this_f(x)
else:
return -999
print('I am created: %s' % this_f_or_zero)
return this_f_or_zero
double_or_zero = f_or_zero(double)
print(double_or_zero(3))
print(double_or_zero(-3))
Run it:
$ python demo.py
I am created: <function this_f_or_zero at 0x7f9f53786500>
I am running with x = 3
6
I am running with x = -3
-999
Ich bin mir nicht sicher, ob ich das Problem verstehe. Wie zeigt der Code unten, dass das nicht stimmt? 'double_or_zero (double)' gibt eine Funktion zurück, die einen Parameter ('h (x)') und abhängig von diesem Parameter ('x') entweder' double (x) 'oder' -999' ... – mgilson
@mgilson zurückgibt Wenn der Python-Interpreter 'double_or_zero (double) (3)' strikt von links nach rechts parst, sollte er keine Ahnung haben, was der nächste Teil ('3') ist, weil' 3' außerhalb des aktuellen Evaluierungsbereichs liegt ('double_or_zero (doppelt) '). – Chad
Dieses Verhalten ist genau das, was ich erwarten würde, wenn die Reihenfolge der Auswertung von links nach rechts ist. f (g) gibt eine Funktion h zurück, die selbst einen Parameter, in Ihrem Beispiel 3 oder -3, nimmt und abhängig vom Vorzeichen die entsprechende Ausgabe liefert. Es funktioniert genau so, wie Sie in den Punkten 1 und 2 beschrieben haben. –