Python中的波形符运算符

clw*_*wen 181 python operators

Python中代字号运算符的用法是什么?

我能想到的一件事是在字符串或列表的两边做一些事情,比如检查字符串是否是回文符号:

def is_palindromic(s):
    return all(s[i] == s[~i] for i in range(len(s) / 2)) 
Run Code Online (Sandbox Code Playgroud)

还有其他好用吗?

wbe*_*rry 170

它是从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
Run Code Online (Sandbox Code Playgroud)

对于具有同一类的实例的实例的"补充"或"反向"有意义的任何类都是反转运算符的可能候选者.但是,如果误操作,操作符重载可能会导致混淆,因此在向__invert__类提供方法之前确保这样做是有意义的.(注意,字节字符串[ex:'\xff']不支持此运算符,即使反转字节字符串的所有位也是有意义的.)

  • 好的解释,但需要注意的是 - 操作员超载的所有安全免责声明都适用于此 - 这不是一个好主意,除非它完全符合要求. (16认同)

GWW*_*GWW 79

~是python中的按位补码运算符,它基本上是计算的-x - 1

所以表格看起来像

i  ~i  
0  -1
1  -2
2  -3
3  -4 
4  -5 
5  -6
Run Code Online (Sandbox Code Playgroud)

因此,对于i = 0它会比较s[0]s[len(s) - 1],对i = 1,s[1]s[len(s) - 2].

至于你的另一个问题,这可能对一系列按位黑客有用.


Nic*_*las 23

除了是一个按位补码运算符,~也可以帮助恢复一个布尔值,虽然它不是传统的bool类型,而是应该使用numpy.bool_.


这解释在,

import numpy as np
assert ~np.True_ == np.False_
Run Code Online (Sandbox Code Playgroud)

反转逻辑值有时是有用的,例如,在~运算符下方用于清理数据集并返回没有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()]
Run Code Online (Sandbox Code Playgroud)

  • 注意,`~True`导致`-2`,而numpy booleans`~np.True_`导致'False`. (5认同)
  • @ M.Herzkamp,这是对的.NaN,+ Inf和-Inf是浮点数的特例.反转浮点数的位会产生无意义的结果,因此Python不允许它.这就是为什么你需要首先在数据数组上调用.isnull()或np.isnan(),然后反转生成的布尔值. (2认同)

Ada*_*hes 10

我唯一一次在实践中使用过它是使用numpy/pandas. 例如,使用.isin() 数据框方法

在文档中,他们展示了这个基本示例

>>> df.isin([0, 2])
        num_legs  num_wings
falcon      True       True
dog        False       True
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要所有不在[0, 2] 中的行呢?

>>> ~df.isin([0, 2])
        num_legs  num_wings
falcon     False       False
dog        True        False
Run Code Online (Sandbox Code Playgroud)


Le *_*ite 9

应该注意的是,在数组索引的情况下,array[~i]等于reversed_array[i]。可以将其视为从数组末尾开始的索引:

[0, 1, 2, 3, 4, 5, 6, 7, 8]
    ^                 ^
    i                ~i
Run Code Online (Sandbox Code Playgroud)

  • 这主要是因为从 `~i` 出来的值(即负值)作为数组索引的起点,python 很乐意接受,导致索引环绕并从后面拾取。 (3认同)