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

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

164 голосов
/ 29 ноября 2011

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

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

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

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

Ответы [ 5 ]

158 голосов
/ 29 ноября 2011

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

73 голосов
/ 29 ноября 2011

~ - это побитовый оператор дополнения в 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].

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

21 голосов
/ 04 сентября 2016

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

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

[0, 1, 2, 3, 4, 5, 6, 7, 8]
    ^                 ^
    i                ~i
0 голосов
/ 13 сентября 2018

Это незначительное использование тильды ...

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]

приведенный выше код взят из "Hands On Machine Learning"

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

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

ex)

array = [1,2,3,4,5,6]
print(array[-1])

- это то же самое, что и

print(array[~1])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...