1.and/or用于整个对象

在Python中所有的“非零”对象都会被会被判定为True。

a = 'hello world!'
b = ''
c = 0
print(bool(a))
print(bool(b))
print(bool(c))
print(bool(a and b))
print(bool(a or b))
print(bool(a and c))
print(bool(a or c))

输出:

True
False
False
False
True
False
True

x or y:

如果x是0,输出y

如果x是非0,输出x

例如: print(0 or 1)   结果为1

      print(2 or 1)   结果为2

x and y: 与or相反

如果x是0,输出x

如果x是非0,输出y

例如: print(1 and 2)  结果为2

      print(0 and 1)  结果为0

True当做非0,False当做0

2.&/| 用于每个对象中的比特位

当使用&和|对整个单位进行操作时,判断的是单位元素的比特,可以说是将每个比特用and或or来进行比较。所以会出现如下奇怪的现象:

print(43 and 45)
print(43 & 45)

输出:

45
41

如果我们把数字分解为比特,就能知道其中的原因了:

print(bin(43))
print(bin(45))
print(bin(43&45))
print(bin(41))

输出:

对于&:只有都一样才是1,其余都是0

0b101011
0b101101
0b101001
0b101001

可以看到,&是将比特位进行逐一比较。当然,如果我们输入一个字符串会直接报错:

print('hello' & 'world')

输出:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'str' and 'str'

3.实际运用

只说它们的区别可能印象并没有那么深刻,我这里举一个实际运用的例子可能就会恍然大悟。

先创建一个随机数组:

import numpy as np
data = np.random.randint(0,10,10)
data

输出:

array([8, 6, 5, 0, 4, 1, 0, 2, 4, 5])

用&统计大于3且小于7的数:

(data>3) & (data<7)

输出:

array([False,  True,  True, False,  True, False, False, False,  True,True])

很简单也很快的就能实现。如果我们用and会出现什么情况呢?

(data>3) and (data<7)

输出:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

显然会报错,回顾上面所说的:and和or用于对象整体,&和| 用于对象的组成部分,就可以很清楚的理解了。

Python小碗菜:and/or 与 &/| 到底有什么区别 - 不知者的文章 - 知乎 https://zhuanlan.zhihu.com/p/330487314

posted on 2023-02-21 21:06  白的枫叶  阅读(43)  评论(0)    收藏  举报