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

каково использование оператора Тильды в Python?

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

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

любое другое хорошее использование?

4 ответов


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

в 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__ метод для вашего класса. (Обратите внимание, что byte-strings [ex:'\xff'] не поддерживают этот оператор, хотя имеет смысл инвертировать все биты байтовой строки.)


~ это оператор побитового дополнения в 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], for i = 1, s[1] С s[len(s) - 2].

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


помимо того, что побитовый оператор дополнения,~ также может помочь вернуть boolean значением, хотя это не обычный 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()]

def split_train_test_by_id(data, test_ratio, id_column):
    ids = data[id_column]
    in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio)) 
    return data.loc[~in_test_set], data.loc[in_test_set]

код выше от "руки на машинном обучении"

вы используете Тильду (~знак) в качестве нецелочисленного маркера индекса

так же, как вы используете минус - для целочисленного индекса

ex) массив[-1]