Python 中的 (&,|)及(and,or)之间的区别与联系

1. 用法辨析

首先,在python中没有 && 及 || 这两个运算符的,取而代之的是英文 andor。其他运算符没有变动。

(&,|)和(and,or)是用来比较两组变量的,格式基本上是:

a & b
a | b
a and b
a or b

1.1 and 和 or

  1. 判断变量是否为 0, 是 0 则为 False,非 0 判断为 True
  2. and 中含0,返回0; 均为非0时,返回后一个值
  3. 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 面试题 判断一个整数是否为 奇数:
(简单解法在 《编程珠玑》中有提到)。需要解决的问题:

  1. 需要符合函数返回类型 bool 值。不能返回 汉字 如 “偶数”
  2. 边界问题。需要考虑到输入可能是 负数
  3. 代码简洁性。可以用
    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 的幂 进行取模运算可以转化为:

i % 2^n = i & (2^n - 1)

只有除数为2的次幂时才可以这样计算。如果想要用负数对正数求余数总得到一个正数可以使用 Math.floorMod(x, y) 方法

参考:

  1. https://zhuanlan.zhihu.com/p/57859872
  2. https://blog.csdn.net/weixin_40041218/article/details/80868521
发布了28 篇原创文章 · 获赞 4 · 访问量 1207

猜你喜欢

转载自blog.csdn.net/weixin_41888257/article/details/104343766