Qual é o uso do operador til no Python?
Uma coisa que posso pensar é fazer algo nos dois lados de uma string ou lista, como verificar se uma string é palindrômica ou não:
def is_palindromic(s):
return all(s[i] == s[~i] for i in range(len(s) / 2))
Algum outro bom uso?
~
implementado pelo método especial__invert__
não está relacionado aonot
operador, o que nega logicamente o valor retornado por__bool__
(ou__nonzero__
em 2.x). Também não está relacionado ao-
operador de negação unário, implementado por__neg__
. Por exemplo~True == -2
, o que não éFalse
ou falso, e o-False == 0
que ainda é falso.-False==0
) Sua confuso, já que você estava falando sobre o~
, e~False == -1
que não é falso.__neg__
). Provavelmente eu deveria ter continuado usandoTrue
, por exemplo-True == -1
, que não é -2 ouFalse
ou falso, o que o vincula mais claramente ao~True
resultado e também que a negação aritmética de abool
é diferente de sua negação lógica. Eu não estava tentando ser profundo. Eu estava apenas destacando três operações e os métodos especiais subjacentes que às vezes ficam confusos.Respostas:
É um operador unário (usando um único argumento) que é emprestado de C, onde todos os tipos de dados são apenas maneiras diferentes de interpretar bytes. É a operação "inverter" ou "complementar", na qual todos os bits dos dados de entrada são revertidos.
Em Python, para números inteiros, os bits da representação de dois complementos do número inteiro são invertidos (como em
b <- b XOR 1
cada bit individual), e o resultado interpretado novamente como um número inteiro de dois complementos. Portanto, para números inteiros,~x
é equivalente a(-x) - 1
.O formulário reificado do
~
operador é fornecido comooperator.invert
. Para oferecer suporte a esse operador em sua própria classe, forneça um__invert__(self)
método.Qualquer classe na qual seja significativo ter um "complemento" ou "inverso" de uma instância que também seja uma instância da mesma classe é um possível candidato ao operador invertido. No entanto, a sobrecarga do operador pode causar confusão se for mal utilizada; portanto, faça sentido antes de fornecer um
__invert__
método para sua classe. (Observe que as cadeias de bytes [ex:'\xff'
] não suportam esse operador, mesmo que seja significativo inverter todos os bits de uma cadeia de bytes.)fonte
~
é o operador de complemento bit a bit em python que essencialmente calcula-x - 1
Então, uma tabela se pareceria
Então, para
i = 0
comparars[0]
coms[len(s) - 1]
, parai = 1
,s[1]
coms[len(s) - 2]
.Quanto à sua outra pergunta, isso pode ser útil para uma variedade de hacks bit a bit .
fonte
Além de ser um operador de complemento bit a bit,
~
também pode ajudar a reverter um valor booleano , embora não seja obool
tipo convencional aqui, você deve usarnumpy.bool_
.Isso é explicado em,
A reversão do valor lógico pode ser útil algumas vezes, por exemplo, o
~
operador abaixo é usado para limpar seu conjunto de dados e retornar uma coluna sem NaN.fonte
numpy.NaN
parece ser definido comonumpy.float
. Se eu tentar~numpy.NaN
, o python reclama, que o operador unário~
não está definido para o tiponumpy.float
.~True
resulta em-2
, enquanto que para numerosos booleanos~np.True_
resulta emFalse
.Deve-se notar que, no caso de indexação de array, isso
array[~i]
equivale areversed_array[i]
. Pode ser visto como indexação a partir do final da matriz:fonte
~i
(ou seja, valor negativo) atua como um ponto de partida para o índice de array que o python aceita alegremente, fazendo com que o índice seja contornado e escolhido pelas costas.A única vez que usei isso na prática é com
numpy/pandas
. Por exemplo, com o.isin()
método dataframe .Nos documentos, eles mostram este exemplo básico
Mas e se você não quisesse todas as linhas em [0, 2]?
fonte
Eu estava resolvendo esse problema do leetcode e me deparei com essa bela solução de um usuário chamado Zitao Wang .
O problema é o seguinte: para cada elemento na matriz fornecida, encontre o produto de todos os números restantes sem fazer uso da divisão e no
O(n)
tempoA solução padrão é:
Sua solução usa apenas um loop para fazer uso de. Ele calcula o produto esquerdo e o produto certo em tempo real usando
~
fonte
Este é um uso menor é til ...
o código acima é de "Hands On Machine Learning"
você usa til (~ sign) como alternativa para - assinar o marcador de índice
assim como você usa menos - é para índice inteiro
ex)
é a mesma coisa que
print(array[~1])
fonte