Für das folgende Beispiel:
def fuctionName(int, bool):
if int in range(...):
if bool == True:
return False
else:
return True
Gibt es eine Möglichkeit, die zweite if-Anweisung zu überspringen? Nur um dem Computer zu sagen, dass er das Gegenteil des Booleschen Wertes zurückgeben soll bool
?
int
undbool
sind beide builtin Namen (für die Typen sie repräsentieren), und sollten nicht als Variablennamen verwendet werden.if x == True:
sollte geschrieben werdenif x:
.Antworten:
Sie können einfach verwenden:
quelle
int in range (....)
ist ineffizient. Es wird eine Liste erstellt und anschließend eine lineare Suche durchgeführt. Besser als esx in range(low, high)
istlow <= x < high
.Der
not
Operator (logische Negation)Der wahrscheinlich beste Weg ist die Verwendung des Operators
not
:Also anstelle Ihres Codes:
Du könntest benutzen:
Die logische Negation als Funktion
Es gibt auch zwei Funktionen im
operator
Moduloperator.not_
und es ist ein Alias,operator.__not__
falls Sie es als Funktion anstatt als Operator benötigen:Diese können nützlich sein, wenn Sie eine Funktion verwenden möchten, die eine Prädikatfunktion oder einen Rückruf erfordert.
Zum Beispiel
map
oderfilter
:Das gleiche könnte natürlich auch mit einer äquivalenten
lambda
Funktion erreicht werden:Verwenden Sie den bitweisen Invertierungsoperator nicht
~
für Boolesche WerteMan könnte versucht sein, den bitweisen Invertierungsoperator
~
oder die entsprechende Operatorfunktionoperator.inv
(oder einen der anderen 3 Aliase dort) zu verwenden. Dabool
jedoch eine Unterklasse desint
Ergebnisses unerwartet sein kann, weil sie nicht den "inversen Booleschen Wert" zurückgibt, gibt sie die "inverse Ganzzahl" zurück:Das liegt daran ,
True
entspricht1
undFalse
auf0
und bitweise Inversion arbeitet auf der bitweise Darstellung der ganzen Zahlen1
und0
.Diese können also nicht verwendet werden, um a zu "negieren"
bool
.Negation mit NumPy-Arrays (und Unterklassen)
Wenn Sie mit NumPy-Arrays (oder Unterklassen wie
pandas.Series
oderpandas.DataFrame
) arbeiten, die Boolesche Werte enthalten, können Sie den bitweisen inversen Operator (~
) verwenden, um alle Booleschen Werte in einem Array zu negieren :Oder die entsprechende NumPy-Funktion:
Sie können den
not
Operator oder dieoperator.not
Funktion nicht für NumPy-Arrays verwenden, da diese erfordern, dass diese ein einzelnesbool
(kein Array von Booleschen Werten) zurückgeben. NumPy enthält jedoch auch eine logische Nicht-Funktion, die elementweise funktioniert:Dies kann auch auf nicht-boolesche Arrays angewendet werden:
Anpassen Ihrer eigenen Klassen
not
funktioniert, indembool
der Wert aufgerufen und das Ergebnis negiert wird. Im einfachsten Fall ruft der Wahrheitswert nur__bool__
das Objekt auf.Durch die Implementierung
__bool__
(oder__nonzero__
in Python 2) können Sie den Wahrheitswert und damit das Ergebnis vonnot
:Ich habe eine
print
Anweisung hinzugefügt , damit Sie überprüfen können, ob die Methode wirklich aufgerufen wird:Ebenso können Sie die
__invert__
Methode implementieren, um das Verhalten zu implementieren, wenn~
es angewendet wird:Nochmals mit einem
print
Anruf, um zu sehen, dass es tatsächlich heißt:Eine
__invert__
solche Implementierung kann jedoch verwirrend sein, da sich das Verhalten vom "normalen" Python-Verhalten unterscheidet. Wenn Sie dies jemals tun, dokumentieren Sie es klar und stellen Sie sicher, dass es einen ziemlich guten (und allgemeinen) Anwendungsfall hat.quelle
Python hat einen "nicht" -Operator, oder? Ist es nicht nur "nicht"? Wie in,
quelle
Sie können einfach das boolesche Array vergleichen. Beispielsweise
dann
würde dir geben
quelle
Wenn Sie versuchen, einen Umschalter zu implementieren , damit ein persistenter Code, der erneut ausgeführt wird, negiert wird, können Sie dies wie folgt erreichen:
Wenn Sie diesen Code ausführen, wird zuerst das
toggle
auf gesetzt ,True
und jedes Mal, wenn dieses Snippet aufgerufen wird, wird das Umschalten negiert.quelle
Die hier akzeptierte Antwort ist die richtige für das gegebene Szenario.
Ich habe mich allerdings gefragt, ob ich einen Booleschen Wert im Allgemeinen einfach invertieren soll. Es stellt sich heraus, dass die hier akzeptierte Lösung als ein Liner funktioniert, und es gibt einen anderen Einzeiler, der ebenfalls funktioniert. Angenommen, Sie haben eine Variable "n", von der Sie wissen, dass sie ein Boolescher Wert ist, können Sie sie am einfachsten invertieren:
Das war meine ursprüngliche Lösung und dann die akzeptierte Antwort auf diese Frage:
Letzteres ist klarer, aber ich habe mich über die Leistung gewundert und sie durchgeknallt
timeit
- und es stellt sich heraus, dass diesn = not n
auch die SCHNELLERE Möglichkeit ist, den Booleschen Wert umzukehren.quelle