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
浙公网安备 33010602011771号