前言
在对Python的学习过程中,经常有人会问:对于逻辑运算,and/or 与 &/| 的区别在哪里?用哪个好?真的是哪个输入简单一点用哪个吗?其实他们是有内在区别的:and和or判断的是整个对象,而&和| 判断的是每个对象中的比特位。如果一脸懵逼请往下看。
提示:为方便快捷地解决问题,本文仅介绍主要区别,并非全面介绍
一、什么是逻辑运算?
抄一下百度百科:
逻辑运算又称布尔运算。布尔用数学方法研究逻辑问题,成功地建立了逻辑演算。他用等式表示判断,把推理看作等式的变换。这种变换的有效性不依赖人们对符号的解释,只依赖于符号的组合规律 。这一逻辑理论人们常称它为布尔代数。20世纪30年代,逻辑代数在电路系统上获得应用,随后,由于电子技术与计算机的发展,出现各种复杂的大系统,它们的变换规律也遵守布尔所揭示的规律。逻辑运算 (logical operators) 通常用来测试真假值。最常见到的逻辑运算就是循环的处理,用来判断是否该离开循环或继续执行循环内的指令。
二、两者区别
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
2.&/| 用于每个对象中的比特位
当使用&和|对整个单位进行操作时,判断的是单位元素的比特,可以说是将每个比特用and或or来进行比较。所以会出现如下奇怪的现象:
print(43&45)
41
如果我们把数字分解为比特,就能知道其中的原因了:
print(bin(43))
print(bin(45))
print(bin(43&45))
print(bin(41))
0b101011
0b101101
0b101001
0b101001
可以看到,&是将比特位进行逐一比较。当然,如果我们输入一个字符串会直接报错:
print('hello' & 'world')
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for &: 'str' and 'str'
三、实际运用
只说它们的区别可能印象并没有那么深刻,我这里举一个实际运用的例子可能就会恍然大悟。
先创建一个随机数组:
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小碗菜系列,主要是笔者平时碰到和想到的Python中小知识和小技巧,后续也会持续更新,希望大家喜欢。
本文地址:https://blog.csdn.net/weixin_43887421/article/details/110388735
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!