Pour l'exemple suivant:
def fuctionName(int, bool):
if int in range(...):
if bool == True:
return False
else:
return True
Existe-t-il un moyen de sauter la deuxième instruction if? Juste pour dire à l'ordinateur de renvoyer l'opposé du booléen bool
?
int
etbool
sont les deux noms de BUILTIN (pour les types qu'ils représentent), et ne doit pas être utilisé comme noms de variables.if x == True:
devrait être écritif x:
.Réponses:
Vous pouvez simplement utiliser:
la source
int in range (....)
est inefficace. Il créera une liste puis effectuera une recherche linéaire. Mieux que cex in range(low, high)
n'estlow <= x < high
.L'
not
opérateur (négation logique)La meilleure façon est probablement d'utiliser l'opérateur
not
:Donc au lieu de votre code:
Vous pouvez utiliser:
La négation logique comme fonction
Il y a aussi deux fonctions dans le
operator
moduleoperator.not_
et son aliasoperator.__not__
au cas où vous en auriez besoin comme fonction plutôt que comme opérateur:Ceux-ci peuvent être utiles si vous souhaitez utiliser une fonction qui nécessite une fonction de prédicat ou un rappel.
Par exemple
map
oufilter
:Bien entendu, la même chose pourrait également être obtenue avec une
lambda
fonction équivalente :N'utilisez pas l'opérateur d'inversion au niveau du bit
~
sur les booléensOn pourrait être tenté d'utiliser l'opérateur d'inversion au niveau du bit
~
ou la fonction d'opérateur équivalenteoperator.inv
(ou l'un des 3 autres alias là-bas). Mais commebool
une sous-classe duint
résultat peut être inattendue car elle ne renvoie pas le "booléen inverse", il renvoie le "entier inverse":C'est parce que
True
équivaut à1
etFalse
à0
et que l'inversion au niveau du bit fonctionne sur la représentation au niveau du bit des entiers1
et0
.Donc, ceux-ci ne peuvent pas être utilisés pour "nier" un
bool
.Négation avec les tableaux NumPy (et sous-classes)
Si vous avez affaire à des tableaux NumPy (ou des sous-classes comme
pandas.Series
oupandas.DataFrame
) contenant des booléens, vous pouvez en fait utiliser l'opérateur inverse au niveau du bit (~
) pour annuler tous les booléens d'un tableau:Ou la fonction NumPy équivalente:
Vous ne pouvez pas utiliser l'
not
opérateur ou laoperator.not
fonction sur les tableaux NumPy car ceux-ci exigent que ceux-ci retournent un seulbool
(pas un tableau de booléens), cependant NumPy contient également une fonction logique non qui fonctionne élément par élément:Cela peut également être appliqué aux tableaux non booléens:
Personnaliser vos propres classes
not
fonctionne en appelantbool
la valeur et annule le résultat. Dans le cas le plus simple, la valeur de vérité appellera simplement__bool__
l'objet.Ainsi, en implémentant
__bool__
(ou__nonzero__
en Python 2), vous pouvez personnaliser la valeur de vérité et donc le résultat denot
:J'ai ajouté une
print
déclaration afin que vous puissiez vérifier qu'elle appelle vraiment la méthode:De même, vous pouvez implémenter la
__invert__
méthode pour implémenter le comportement lorsqu'il~
est appliqué:Encore une fois avec un
print
appel pour voir qu'il est effectivement appelé:Cependant, une
__invert__
telle implémentation pourrait être déroutante car son comportement est différent du comportement Python "normal". Si jamais vous faites cela, documentez-le clairement et assurez-vous qu'il a un cas d'utilisation assez bon (et commun).la source
Python a un opérateur "pas", non? N'est-ce pas simplement "non"? Un péché,
la source
Vous pouvez simplement comparer le tableau booléen. Par exemple
puis
te donnerait
la source
La réponse acceptée ici est la plus correcte pour le scénario donné.
Cela m'a fait me demander comment inverser simplement une valeur booléenne en général. Il s'avère que la solution acceptée ici fonctionne comme une seule doublure, et il y en a une autre qui fonctionne également. En supposant que vous ayez une variable "n" que vous savez être un booléen, les moyens les plus simples de l'inverser sont:
qui était ma solution originale, puis la réponse acceptée à cette question:
Ce dernier est plus clair, mais je me suis posé des questions sur les performances et je l'ai exploré
timeit
- et il s'avère quen = not n
c'est aussi le moyen PLUS RAPIDE d'inverser la valeur booléenne.la source
Si vous essayez d'implémenter une bascule , de sorte que chaque fois que vous réexécutez un code persistant, il est annulé, vous pouvez le faire comme suit:
L'exécution de ce code définira d'abord le
toggle
àTrue
et à chaque fois que cet extrait de code sera appelé, la bascule sera annulée.la source