Вопрос-Ответ

The tilde operator in Python

Оператор тильды в Python

Как используется оператор тильды в Python?

Единственное, о чем я могу подумать, это сделать что-то с обеих сторон строки или списка, например, проверить, является ли строка палиндромной или нет:

def is_palindromic(s):
return all(s[i] == s[~i] for i in range(len(s) / 2))

Есть еще хорошее применение?

Переведено автоматически
Ответ 1

Это унарный оператор (принимающий один аргумент), заимствованный из языка Си, где все типы данных представляют собой просто разные способы интерпретации байтов. Это операция "инвертирования" или "дополнения", при которой все биты входных данных меняются местами.

В Python для целых чисел биты представления с двойным дополнением целого числа меняются местами (как в b <- b XOR 1 для каждого отдельного бита), и результат снова интерпретируется как целое число с двойным дополнением. Итак, для целых чисел, ~x эквивалентно (-x) - 1.

Конкретизированная форма ~ оператора представлена как operator.invert. Чтобы поддерживать этот оператор в вашем собственном классе, присвойте ему __invert__(self) метод.

>>> import operator
>>> class Foo:
... def __invert__(self):
... print 'invert'
...
>>> x = Foo()
>>> operator.invert(x)
invert
>>> ~x
invert

Любой класс, в котором имеет смысл иметь "дополнение" или "инверсию" экземпляра, который также является экземпляром того же класса, является возможным кандидатом для оператора инвертирования. Однако перегрузка оператора может привести к путанице при неправильном использовании, поэтому убедитесь, что это действительно имеет смысл сделать, прежде чем предоставлять __invert__ метод вашему классу. (Обратите внимание, что байтовые строки [например: '\xff'] не поддерживают этот оператор, хотя имеет смысл инвертировать все биты байтовой строки.)

Ответ 2

~ это оператор побитового дополнения в python, который по сути вычисляет -x - 1

Итак, таблица будет выглядеть следующим образом

i  ~i
-----
0 -1
1 -2
2 -3
3 -4
4 -5
5 -6

Таким образом, для i = 0 он будет сравниваться s[0] с s[len(s) - 1], для i = 1, s[1] с s[len(s) - 2].

Что касается вашего другого вопроса, это может быть полезно для ряда побитовых взломов.

Ответ 3

Следует отметить, что в случае индексации массива, array[~i] равно reversed_array[i]. Это можно рассматривать как индексацию, начинающуюся с конца массива:

[0, 1, 2, 3, 4, 5, 6, 7, 8]
^ ^
i ~i
Ответ 4

Помимо того, что он является оператором побитового дополнения, ~ также может помочь вернуть логическое значение, хотя это не обычный bool тип здесь, скорее вы должны использовать numpy.bool_.


Это объясняется в,

import numpy as np
assert ~np.True_ == np.False_

Иногда может быть полезно поменять логическое значение местами, например, ниже ~ оператор используется для очистки вашего набора данных и возврата столбца без NaN.

from numpy import NaN
import pandas as pd

matrix = pd.DataFrame([1,2,3,4,NaN], columns=['Number'], dtype='float64')
# Remove NaN in column 'Number'
matrix['Number'][~matrix['Number'].isnull()]
python