Para o seguinte exemplo:
def fuctionName(int, bool):
if int in range(...):
if bool == True:
return False
else:
return True
Existe alguma maneira de pular a segunda instrução if? Apenas dizer ao computador para retornar o oposto do booleano bool
?
int
ebool
são nomes internos (para os tipos que representam) e não devem ser usados como nomes de variáveis.if x == True:
deve ser escritoif x:
.Respostas:
Você pode apenas usar:
fonte
int in range (....)
é ineficiente. Ele criará uma lista e, em seguida, fará uma pesquisa linear. Melhor do quex in range(low, high)
élow <= x < high
.O
not
operador (negação lógica)Provavelmente, a melhor maneira é usar o operador
not
:Então, em vez de seu código:
Você pode usar:
A negação lógica como função
Também há duas funções no
operator
módulooperator.not_
e seu apelidooperator.__not__
caso você precise dele como função em vez de como operador:Isso pode ser útil se você quiser usar uma função que requer uma função de predicado ou um retorno de chamada.
Por exemplo
map
oufilter
:Claro que o mesmo também pode ser alcançado com uma
lambda
função equivalente :Não use o operador invertido bit a bit
~
em booleanosAlguém pode ficar tentado a usar o operador invertido bit a bit
~
ou a função de operador equivalenteoperator.inv
(ou um dos outros 3 aliases lá). Mas porquebool
é uma subclasse doint
resultado pode ser inesperado porque não retorna o "booleano inverso", ele retorna o "inteiro inverso":Isso porque
True
é equivalente a1
eFalse
to0
e a inversão bit a bit opera na representação bit a bit dos inteiros1
e0
.Portanto, eles não podem ser usados para "negar" a
bool
.Negação com matrizes NumPy (e subclasses)
Se você estiver lidando com matrizes NumPy (ou subclasses como
pandas.Series
oupandas.DataFrame
) contendo booleanos, você pode usar o operador inverso bit a bit (~
) para negar todos os booleanos em uma matriz:Ou a função NumPy equivalente:
Você não pode usar o
not
operador ou aoperator.not
função em matrizes NumPy porque eles exigem que retornem um únicobool
(não uma matriz de booleanos); no entanto, NumPy também contém uma função não lógica que funciona em elementos:Isso também pode ser aplicado a matrizes não booleanas:
Personalizando suas próprias aulas
not
funciona chamandobool
o valor e negando o resultado. No caso mais simples, o valor verdade apenas chamará__bool__
o objeto.Portanto, ao implementar
__bool__
(ou__nonzero__
no Python 2), você pode personalizar o valor verdadeiro e, portanto, o resultado denot
:Eu adicionei uma
print
instrução para que você possa verificar se ela realmente chama o método:Da mesma forma, você pode implementar o
__invert__
método para implementar o comportamento quando~
é aplicado:Novamente com uma
print
chamada para ver se é realmente chamado:No entanto, uma implementação
__invert__
como essa pode ser confusa porque seu comportamento é diferente do comportamento "normal" do Python. Se você fizer isso, documente-o claramente e certifique-se de que tenha um caso de uso muito bom (e comum).fonte
Python tem um operador "não", certo? Não é apenas "não"? Como em,
fonte
Você pode apenas comparar o array booleano. Por exemplo
então
daria a você
fonte
A resposta aceita aqui é a mais correta para o cenário fornecido.
Isso me fez pensar sobre simplesmente inverter um valor booleano em geral. Acontece que a solução aceita aqui funciona como uma linha e há outra linha que também funciona. Supondo que você tenha uma variável "n" que você sabe que é booleana, as maneiras mais fáceis de invertê-la são:
qual foi a minha solução original e, em seguida, a resposta aceita a partir desta pergunta:
O último é mais claro, mas me perguntei sobre o desempenho e consegui passar
timeit
- e descobri quen = not n
também é a maneira MAIS RÁPIDA de inverter o valor booleano.fonte
Se você estiver tentando implementar uma alternância , de modo que sempre que executar novamente um código persistente ele seja negado, você pode conseguir isso da seguinte maneira:
A execução deste código definirá primeiro
toggle
comoTrue
e sempre que este snippet for chamado, a alternância será negada.fonte