Kann jemand erklären, warum der Python-Interpreter (2.7.3) gibt die folgenden:Mehrere Operatoren zwischen Operanden
>>> 5 -+-+-+ 2
3
Ist das immer nützlich, und zu welchem Zweck?
Kann jemand erklären, warum der Python-Interpreter (2.7.3) gibt die folgenden:Mehrere Operatoren zwischen Operanden
>>> 5 -+-+-+ 2
3
Ist das immer nützlich, und zu welchem Zweck?
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
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
Also, außer Verschleierung ist es wirklich nutzlos? –
@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
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 ?! –
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
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.
Sie können 'dis' lambdas:' dis.dis (lambda: 5 - + - + - + 2) ' – nneonneo
Ah, hab es, danke für den schönen Zusammenbruch. – Sharp3