2013-04-08 16 views

Odpowiedz

10

Można użyć dis tutaj, aby zobaczyć, jak wyrażenie faktycznie oceniano:

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   

Tak, że wyrażenie jest równoważne to:

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

Możesz 'dis' lambdas:' dis.dis (lambda: 5 - + - + - + 2) ' – nneonneo

+0

Ah, rozumiem, dzięki za miły podział. – Sharp3

6

To jest po prostu równa

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

gdzie wszystkie + i - poza pierwszym są operatory jednoargumentowe. Dla liczb, + zwraca operand bez zmian. Ale jego znaczenie może zostać zmienione przy użyciu specjalnej metody __pos__ na własnych zajęciach.

To bezużyteczne zaciemnianie, aby zrobić to za pomocą liczb, ale może być przydatne (jeśli jest niewiarygodnie zagmatwane), jeśli używasz instancji klasy z niestandardowymi operacjami __neg__ i/lub __pos__.


można nadużywać tego dostać C-jak preinkrementuj -- i ++ operatorów. Nigdy tak naprawdę nie rób tego.

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) 

Przykład:

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

Czyli inne niż zaciemnianie jest naprawdę bezużyteczne? –

+1

@AthomSfere: Jeśli lubisz robić '++ x' w C, możesz to zrobić w Pythonie! (Bardzo niezalecane dla rzeczywistego kodu poza potencjałem rozrywki) – nneonneo

+0

Ah, ale ++ x vs x ++ ma bardzo specyficzną funkcję (Chociaż w większości niepotrzebne!) Podoba mi się twoje wyjaśnienie, ale to naprawdę wydaje się być bardziej zagadką/zaciemnianie praktyki niż praktyczna logika. I biorę to nigdy nie robię tego dla żadnego prawdziwego kodu ?! –

3

Poza zaciemnianiem kodu, nie widzę w tym żadnej użyteczności.

Ocenę tego jest:

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

To jest interpretowane tak:

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

Wolno napisać -a uzyskać negatyw a. Dla symetrii i "Dlaczego nie?" należy również użyć przedrostka z dodatkowym znakiem, takim jak +a.

Dodawanie wielu znaków nie jest zbyt użyteczne, ale jest dozwolone, prawdopodobnie dlatego, że po prostu jest zgodne z gramatyką i nikt nie widział potrzeby, aby jawnie tego zabronić.