2016-07-08 6 views
0

ich für den Python-Ausdruck zu glauben, verwendet f(g)(x), der Bewertungsprozess ist:Expression Evaluierungsmechanismus von Python

  1. auswerten f(g), Rückkehrfunktion h;
  2. 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 
+4

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

+0

@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

+0

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. –

Antwort

3

Warum denken Sie, dass Python die Parameter sehen kann, wenn der erste Teil ausgewertet wird, kann es nicht. Dieses Beispiel verdeutlicht, was passiert. Ihr Beispiel funktioniert genauso.

def double(x): 
    return 2 * x 

def f_or_zero(this_f): 
    def this_f_or_zero(x): 
     if x > 0: 
      return this_f(x) 
     else: 
      return 0 
    return this_f_or_zero 


double_or_zero = f_or_zero(double) 
print(double_or_zero(3)) 
print(double_or_zero(-3)) 

double_or_zero ist eine Funktion, die (meist) wie jede andere Python Funktion verhält. Es ist einfach so, dass diese Funktion dynamisch erstellt und durch einen Aufruf an eine andere Funktion zurückgegeben wird.