2013-04-08 9 views

Antwort

10

Sie dis hier verwenden können, um zu sehen, wie der Ausdruck tatsächlich ausgewertet wurde:

In [29]: def func(): 
    ....:  return 5 -+-+-+ 2 
    ....: 

In [30]: import dis 

In [31]: dis.dis(func) 
    2   0 LOAD_CONST    1 (5) 
       3 LOAD_CONST    2 (2) 
       6 UNARY_POSITIVE  
       7 UNARY_NEGATIVE  
       8 UNARY_POSITIVE  
       9 UNARY_NEGATIVE  
      10 UNARY_POSITIVE  
      11 BINARY_SUBTRACT  
      12 RETURN_VALUE   

Damit Ausdruck entspricht dies:

In [32]: 5 - (+(-(+(-(+(2)))))) 
Out[32]: 3 
+0

Sie können 'dis' lambdas:' dis.dis (lambda: 5 - + - + - + 2) ' – nneonneo

+0

Ah, hab es, danke für den schönen Zusammenbruch. – Sharp3

6

Dies ist nur gleich

5 - (+(-(+(-(+2))))) 

wo alle + und - über die ersten sind unäre Operatoren. Bei Zahlen gibt + den Operanden unverändert zurück. Aber seine Bedeutung kann über die spezielle Methode __pos__ in Ihren eigenen Klassen überschrieben werden.

Es ist sinnlos Verschleierungs dies mit Zahlen zu tun, aber es kann sinnvoll (wenn unglaublich verwirrend), wenn Sie Klasseninstanzen mit benutzerdefinierter verwenden __neg__ und/oder __pos__ Operationen.


du missbrauchen C-wie Prä-Inkrement -- und ++ Betreiber zu bekommen. Tue das niemals wirklich.

class IncrementableInteger(object): 
    def __init__(self, val=0): 
     self.val = val 
    def __pos__(self): 
     class PlusOne: 
      def __pos__(_self): 
       self.val += 1 
     return PlusOne() 
    def __neg__(self): 
     class MinusOne: 
      def __neg__(_self): 
       self.val -= 1 
     return MinusOne() 
    def __str__(self): 
     return str(self.val) 
    def __repr__(self): 
     return repr(self.val) 

Beispiel:

>>> IncrementableInteger(4) 
4 
>>> v=_ 
>>> ++v 
>>> v 
5 
+2

Also, außer Verschleierung ist es wirklich nutzlos? –

+1

@AthomSfere: Nun, wenn du es magst, '++ x' in C zu machen, kannst du es jetzt in Python machen! (Sehr viel nicht für tatsächlichen Code neben Unterhaltungspotential empfohlen) – nneonneo

+0

Ah, aber ++ x vs x ++ hat eine sehr spezifische Funktion (Obwohl meistens redundant!) Ich mag Ihre Erklärung, aber es scheint wirklich eher ein Puzzle/Verschleierungspraxis als eine praktische Logikübung. Und ich nehme es nie für irgendeinen echten Code ?! –

3

Anders als den Code zu verschleiern, sehe ich kein Dienstprogramm dazu.

Die Auswertung dieser ist:

5 -+-+-+ 2 = 5 -(+(-(+(-(+ 2))))) 
      = 5 -(+(-(+(- 2)))) 
      = 5 -(+(-(- 2))) 
      = 5 -(+(+ 2)) 
      = 5 -(+ 2) 
      = 5 - 2 
      = 3 
2

Es wird wie folgt interpretiert:

5 - (+(-(+(-(+2))))) 

Sie dürfen -a schreiben, um die negativen a zu bekommen. Für Symmetrie und "Warum nicht?" Sie müssen auch ein Pluszeichen Präfix wie +a verwenden.

Das Hinzufügen mehrerer Zeichen ist nicht wirklich nützlich, aber es ist erlaubt, wahrscheinlich weil es in der Grammatik einfach legal ist und niemand es explizit verbieten musste.

Verwandte Themen