Оператор Тильды в 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. Однако перегрузка оператора может привести к путанице при неправильном использовании, поэтому убедитесь, что он действительно имеет смысл сделать это перед поставкой
__invert__метод для вашего класса. (Обратите внимание, что байт-строки [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]на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) array[-1]
Comments