Оператор Тильды в 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]