Może ktoś wyjaśnić dlaczego interpreter Pythona (2.7.3) daje następujące:Wiele operatorów między argumentami
>>> 5 -+-+-+ 2
3
Czy to zawsze przydatne, iw jakim celu?
Może ktoś wyjaśnić dlaczego interpreter Pythona (2.7.3) daje następujące:Wiele operatorów między argumentami
>>> 5 -+-+-+ 2
3
Czy to zawsze przydatne, iw jakim celu?
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
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
Czyli inne niż zaciemnianie jest naprawdę bezużyteczne? –
@AthomSfere: Jeśli lubisz robić '++ x' w C, możesz to zrobić w Pythonie! (Bardzo niezalecane dla rzeczywistego kodu poza potencjałem rozrywki) – nneonneo
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 ?! –
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
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ć.
Możesz 'dis' lambdas:' dis.dis (lambda: 5 - + - + - + 2) ' – nneonneo
Ah, rozumiem, dzięki za miły podział. – Sharp3