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



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



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



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


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

679   4  

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

    Ничего не найдено.