Python小碗菜:and/or 与 &/| 到底有什么区别

  • 前言
  • 一、什么是逻辑运算?
  • 二、两者区别
    • 1.and/or用于整个对象
    • 2.&/| 用于每个对象中的比特位
  • 三、实际运用
  • 总结

前言

在对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 "<stdin>", line 1, in <module>
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