1. ホーム
  2. パイソン

[解決済み】Pythonのチルダ演算子について

2022-04-01 23:02:17

質問

Pythonのチルダ演算子の使い方は?

例えば、ある文字列が回文かどうかをチェックするような、文字列やリストの両側で何かをすることが考えられます。

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

他に良い使い方があれば教えてください。

解決方法は?

これは単項演算子(引数は1つ)で、すべてのデータ型がバイトの異なる解釈の仕方であるC言語から借用したものです。 これは、入力データのすべてのビットを反転させる、"invert" または "complement" 演算です。

Pythonでは、整数の場合、そのビットは 二重補数表現 のように)整数の逆順になります。 b <- b XOR 1 を各ビットに割り当て、その結果を再び2項補数型の整数として解釈します。 つまり、整数の場合は ~x は次のように等価です。 (-x) - 1 .

を再定義したものである。 ~ 演算子は operator.invert . この演算子を自作クラスでサポートするには、そのクラスに __invert__(self) メソッドを使用します。

>>> import operator
>>> class Foo:
...   def __invert__(self):
...     print 'invert'
...
>>> x = Foo()
>>> operator.invert(x)
invert
>>> ~x
invert

同じクラスのインスタンスの "complement" または "inverse" を持つことに意味があるクラスはすべて、invert 演算子の候補になりえます。 しかし、演算子のオーバーロードは使い方を誤ると混乱を招くので、演算子を指定する前に本当に意味があるのかどうかを確認してください。 __invert__ メソッドをクラスに追加します。 (ただし、バイト列[ex: '\xff' バイト列のすべてのビットを反転させることに意味があるにもかかわらず、この演算子はサポートされていません)。