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']不支持此运算符,即使反转字节字符串的所有位也是有意义的.)
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)
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)
应该注意的是,在数组索引的情况下,array[~i]等于reversed_array[i]。可以将其视为从数组末尾开始的索引:
[0, 1, 2, 3, 4, 5, 6, 7, 8]
^ ^
i ~i
Run Code Online (Sandbox Code Playgroud)