Was ist die Verwendung des Tilde-Operators in Python?
Eine Sache, über die ich nachdenken kann, ist, auf beiden Seiten einer Zeichenfolge oder Liste etwas zu tun, z. B. zu überprüfen, ob eine Zeichenfolge palindrom ist oder nicht:
def is_palindromic(s):
return all(s[i] == s[~i] for i in range(len(s) / 2))
Irgendeine andere gute Verwendung?
~
durch die spezielle Methode implementierte unäre Komplementoperator__invert__
nicht mit demnot
Operator zusammenhängt, der den von__bool__
(oder__nonzero__
in 2.x) zurückgegebenen Wert logisch negiert . Es hat auch nichts mit dem-
unären Negationsoperator zu tun, der von implementiert wird__neg__
. Zum Beispiel~True == -2
, was nichtFalse
oder falsch ist und-False == 0
was immer noch falsch ist.-False==0
) Es ist verwirrend, da du über das gesprochen hast~
und~False == -1
was nicht falsch ist.__neg__
). Wahrscheinlich hätte ich weiter verwenden sollenTrue
, z. B.-True == -1
was nicht -2 oderFalse
oder falsch ist, was es deutlicher mit dem~True
Ergebnis verknüpft und auch, dass sich die arithmetische Negation von abool
von seiner logischen Negation unterscheidet. Ich habe nicht versucht, tief zu sein. Ich habe nur 3 Operationen und die zugrunde liegenden speziellen Methoden hervorgehoben, die manchmal verwirrt werden.Antworten:
Es ist ein unärer Operator (mit einem einzigen Argument), der aus C entlehnt ist, wobei alle Datentypen nur unterschiedliche Arten der Interpretation von Bytes sind. Es ist die "Invert" - oder "Komplement" -Operation, bei der alle Bits der Eingabedaten umgekehrt werden.
In Python werden für Ganzzahlen die Bits der Zweierkomplementdarstellung der Ganzzahl umgekehrt (wie
b <- b XOR 1
für jedes einzelne Bit), und das Ergebnis wird erneut als Zweierkomplement-Ganzzahl interpretiert. Also für ganze Zahlen~x
ist äquivalent zu(-x) - 1
.Die einheitliche Form des
~
Betreibers wird bereitgestellt alsoperator.invert
. Geben Sie eine__invert__(self)
Methode an, um diesen Operator in Ihrer eigenen Klasse zu unterstützen .Jede Klasse, in der es sinnvoll ist, ein "Komplement" oder "Inverses" einer Instanz zu haben, die auch eine Instanz derselben Klasse ist, ist ein möglicher Kandidat für den Invertierungsoperator. Das Überladen von Operatoren kann jedoch bei Missbrauch zu Verwirrung führen. Stellen Sie daher sicher, dass dies wirklich sinnvoll ist, bevor Sie
__invert__
Ihrer Klasse eine Methode zur Verfügung stellen. (Beachten Sie, dass Byte-Strings [Beispiel:'\xff'
] diesen Operator nicht unterstützen, obwohl es sinnvoll ist, alle Bits eines Byte-Strings zu invertieren.)quelle
~
ist der bitweise Komplementoperator in Python, der im Wesentlichen berechnet-x - 1
So würde ein Tisch aussehen
Also für
i = 0
es würdes[0]
mits[len(s) - 1]
, füri = 1
,s[1]
mit vergleichens[len(s) - 2]
.Was Ihre andere Frage betrifft, kann dies für eine Reihe von bitweisen Hacks nützlich sein .
quelle
Sie können nicht nur ein bitweiser Komplementoperator sein , sondern
~
auch einen booleschen Wert zurücksetzen , obwohl dies hier nicht der herkömmlichebool
Typ ist, sondern Sie ihn verwenden solltennumpy.bool_
.Dies wird erklärt in,
Das Umkehren des logischen Werts kann manchmal nützlich sein, z. B. wird der folgende
~
Operator verwendet, um Ihr Dataset zu bereinigen und Ihnen eine Spalte ohne NaN zurückzugeben.quelle
numpy.NaN
scheint definiert zu sein alsnumpy.float
. Wenn ich es versuche~numpy.NaN
, beschwert sich Python, dass der unäre Operator~
nicht für den Typ definiert istnumpy.float
.~True
führt-2
, während für numpy Boolesche Werte~np.True_
ergibtFalse
.Man sollte im Fall von Array - Indizierung beachten Sie, dass,
array[~i]
beträgtreversed_array[i]
. Es kann als Indizierung ab dem Ende des Arrays angesehen werden:quelle
~i
(dh dem negativen Wert) hervorgeht, als Ausgangspunkt für den Array-Index dient, den Python gerne akzeptiert, wodurch der Index umbrochen und von hinten ausgewählt wird.Das einzige Mal, dass ich dies jemals in der Praxis verwendet habe, ist mit
numpy/pandas
. Zum Beispiel mit der.isin()
Datenrahmenmethode .In den Dokumenten zeigen sie dieses grundlegende Beispiel
Aber was ist, wenn Sie stattdessen alle Zeilen nicht in [0, 2] haben möchten?
quelle
Ich habe dieses Leetcode-Problem gelöst und bin auf diese schöne Lösung eines Benutzers namens Zitao Wang gestoßen .
Das Problem geht so, dass für jedes Element im angegebenen Array das Produkt aller verbleibenden Zahlen ohne Verwendung von Divison und in der
O(n)
Zeit gefunden wirdDie Standardlösung lautet:
Seine Lösung verwendet nur eine for-Schleife, indem sie verwendet. Er berechnet das linke und das rechte Produkt im laufenden Betrieb mit
~
quelle
Dies ist eine geringfügige Verwendung ist Tilde ...
Der obige Code stammt aus "Hands On Machine Learning".
Sie verwenden Tilde (~ Zeichen) als Alternative zum Indexzeichen - Zeichen
Genau wie Sie Minus verwenden - steht für Integer Index
Ex)
ist das samething als
print(array[~1])
quelle