El operador de tilde en Python
¿Cuál es el uso del operador de tilde en Python?
Una cosa en la que puedo pensar es en hacer algo en ambos lados de una cadena o lista, como verificar si una cadena es palindrómica o no:
def is_palindromic(s):
return all(s[i] == s[~i] for i in range(len(s) / 2))
¿Algún otro buen uso?
Es un operador unario (que toma un solo argumento) tomado de C, donde todos los tipos de datos son simplemente formas diferentes de interpretar bytes. Es la operación "invertir" o "complementar", en la que se invierten todos los bits de los datos de entrada.
En Python, para los números enteros, los bits de la representación en complemento a dos del número entero se invierten (como b <- b XOR 1
para cada bit individual) y el resultado se interpreta nuevamente como un entero en complemento a dos. Entonces, para números enteros, ~x
es equivalente a (-x) - 1
.
La forma cosificada del ~
operador se proporciona como operator.invert
. Para admitir este operador en su propia clase, asígnele un __invert__(self)
método.
>>> import operator
>>> class Foo:
... def __invert__(self):
... print 'invert'
...
>>> x = Foo()
>>> operator.invert(x)
invert
>>> ~x
invert
Cualquier clase en la que tenga sentido tener un "complemento" o "inverso" de una instancia que también sea una instancia de la misma clase es un posible candidato para el operador de inversión. Sin embargo, la sobrecarga de operadores puede generar confusión si se usa incorrectamente, así que asegúrese de que realmente tenga sentido hacerlo antes de proporcionar un __invert__
método a su clase. (Tenga en cuenta que las cadenas de bytes [ej: '\xff'
] no admiten este operador, aunque tiene sentido invertir todos los bits de una cadena de bytes).
~
es el operador de complemento bit a bit en Python que esencialmente calcula-x - 1
Así se vería una mesa
i ~i
-----
0 -1
1 -2
2 -3
3 -4
4 -5
5 -6
Entonces, for i = 0
se compararía s[0]
con s[len(s) - 1]
, for i = 1
, s[1]
con s[len(s) - 2]
.
En cuanto a su otra pregunta, esto puede ser útil para una variedad de hacks bit a bit .
Cabe señalar que en el caso de la indexación de matrices, array[~i]
asciende a reversed_array[i]
. Puede verse como una indexación que comienza desde el final de la matriz:
[0, 1, 2, 3, 4, 5, 6, 7, 8]
^ ^
i ~i