欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-03 10:23:47
...

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]

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

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