El operador de tilde en Python

Resuelto clwen asked hace 12 años • 10 respuestas

¿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?

clwen avatar Nov 29 '11 09:11 clwen
Aceptado

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 1para cada bit individual) y el resultado se interpreta nuevamente como un entero en complemento a dos. Entonces, para números enteros, ~xes 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).

wberry avatar Nov 29 '2011 03:11 wberry

~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 = 0se 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 .

GWW avatar Nov 29 '2011 02:11 GWW

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
Le Frite avatar Feb 03 '2019 16:02 Le Frite