Python 中的 (&,|)及(and,or)之间的区别与联系
原创
©著作权归作者所有:来自51CTO博客作者wx62d4c4d0ec83a的原创作品,请联系作者获取转载授权,否则将追究法律责任
1. 用法辨析
首先,在python中没有 && 及 || 这两个运算符的,取而代之的是英文 and和 or。其他运算符没有变动。
(&,|)和(and,or)是用来比较两组变量的,格式基本上是:
1.1 and 和 or
- 判断变量是否为 0, 是 0 则为 False,非 0 判断为 True
- and中含0,返回0; 均为非0时,返回后一个值
- or中, 至少有一个非0时,返回第一个非0
2 and 0 # 返回0
2 and 1 # 返回1
1 and 2 # 返回2
2 or 0 # 返回2
2 or 1 # 返回2
0 or 1 # 返回1
1.2 &和 |
表示位运算
"""1&2,2在二进制里面是10,1在二进制中是01,那么01与运算10得到是0
0 1
& 1 0
————————————
0 0
#########################################################
0 1
| 1 0
————————————
1 1
"""
1 & 2 # 输出为 0,
1 | 2 # 输出为3
1.3 联系
如果 a, b 是逻辑变量, 则两类的用法基本一致
In[103]:(3>0) | (3<1)
Out[103]: True
In[104]:(3>0) and (3<1)
Out[104]: False
In[105]:(3>0) or (3<1)
Out[105]: True
In[106]:(3>0) & (3<1)
Out[106]: False
In [17]: True and False
Out[17]: False
In [18]: True & False
Out[18]: False
In [19]: True | False
Out[19]: True
In [20]: True | False
2. 特殊用法
在DataFrame的切片过程,要注意逻辑变量的使用。
需要求得满足多个逻辑条件的数据时,要使用 & 和 | ,在某些条件下用and/ or会报错‘ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().’
target_url = "http://aima.cs.berkeley.edu/data/iris.csv"
data = pd.read_csv(target_url, header=None, columns=['s_line', 's_wid', 'p_line', 'p_wid', 'kind'])
data.columns = ['s_line', 's_wid', 'p_line', 'p_wid', 'kind']
x_data = data.iloc[:, :-1]
# 在多个逻辑条件下,用& 或者|,
x_1 = x_data[x_data['s_line'] > 6 & x_data['p_wid'] > 0]


3. 位运算的应用——判断整数是否为奇数
有一道 java 面试题 判断一个整数是否为 奇数:
(简单解法在 《编程珠玑》中有提到)。需要解决的问题:
- 需要符合函数返回类型bool 值。不能返回 汉字 如 “偶数”
- 边界问题。需要考虑到输入可能是负数
- 代码简洁性。可以用
return i % 2 == 1
一句话代替
if ( i % 2 == 1): return true
else: return false
这两句话
解法 1:
因为输入的可能是正数,也可能是负数
用 return i % 2 != 0
代替 return i % 2 == 1 || i % 2 == -1
Java
public boolean isOdd(int i) {
return i % 2 != 0;
}
解法 2:位运算
public boolean isOdd(int i) {
return (i & 1) == 1;
}
【说明】
理论上 解法 2 的位运算会比解法 1 的取模运算快。但是实际上测试的时候,时间却差不多。原因如下:
编译器会对 2 的指数的取模操作,自行优化成 位运算操作。
正数对 2 的幂 进行取模运算可以转化为:
只有除数为2的次幂时才可以这样计算。如果想要用负数对正数求余数总得到一个正数可以使用 Math.floorMod(x, y)
方法
参考:
- https://zhuanlan.zhihu.com/p/57859872