当前位置: 首页 > news >正文

python中应该使用while 1吗?按位运算符可以代替逻辑运算符使用吗?

while 1

很多初学者都很喜欢使用while 1,原因可能是,1只需要输入一个字符,更加“省事”,可以“偷懒”,并且,1看起来更加简洁明了。

实际上,在python中,while 1while True是等价的,都是布尔真值,这意味着,他们最终的结果都是无限循环。然而,从代码风格和可读性的角度来说,使用while 1是不适合的,正确的做法是使用while True,因为,其明确表达了意图,即“当条件为真时循环”。

相比之下,while 1则没有那么明确,并且,如果while 1可行的话,是不是while 2while 520while "sagegrass"都是可行的呢?如果这样做的话,代码将会陷入到混乱之中。因此,建议总是使用while True

按位代替逻辑

按位操作符

按位操作符,也即&|~,对于其使用,我之前有过详细的介绍,如果不了解的话,可以查看这篇文章,按位操作符的使用

逻辑操作符,也即andornot

按位操作符确实可以操作布尔值,例如:

bool1 = True
bool2 = Falseprint(bool1 & bool2)  # 结果为False
print(bool1 | bool2)  # 结果为True
print(~bool1)  # 结果为-2
print(~bool2)  # 结果为-1

对于~bool1的结果,可能让人大吃一惊,1按位取反以后,怎么不是0呢?怎么会变成-2呢?

实际上,对于任意整数x,~x的结果,应该为-(x + 1),所以对于1,结果为-(1 + 1),所以得到的是-2。

因此,很显然,按位取反不能代替not使用。

逻辑运算符的短路特性

那么,按位与以及按位或的结果确实看起来和逻辑与与逻辑或的结果是相同的,那么,按位与以及按位或可以代替逻辑运算符使用吗?

实际上,逻辑运算符具有短路特性,也即:

A and B时:如果A为False,则立即返回False,不再继续对B求值。

A or B时:如果A为True,则立即返回True,不再继续对B求值。

利用这个特性,可以写出一些专门的代码,例如:

# 除以0是不正确的,会触发异常# 如果使用逻辑运算符and,由于在条件False时就停止了,因此不会触发异常
if False and (1 / 0):pass# 如果使用按位运算符&,按位运算符没有短路特性,因此,会触发异常
if False & (1 / 0):pass

因此,按位运算符无法使用逻辑运算符的短路特性。

非布尔值的情况

如果,我们遇到了本身非布尔值,而是后续转为布尔值的情况,例如:

a = 1
b = 2print(a and b)  # 结果为True
print(a & b)  # 结果为0

可以看到,这里明显使用按位操作符就是不正确的了,他与我们希望得到的结果是完全不同的,除非改为:

a = 1 
b = 2print(bool(a) & bool(b))

因此,综合上述情况,按位操作符不应该,也不建议代替逻辑运算符使用。

命题逻辑的运算律

逻辑运算律

在数学中,运算律是一些基本的规则,用于对命题进行逻辑操作。

应用逻辑运算律

python中的逻辑运算符同样也遵循这些运算律,因此,可以应用到程序中。

例如,对于德摩根律,这些两种形式是等价的:

if not a or not b:passif not (a and b):pass

在实际使用中,可能是这样的,例如,对于一个用户登陆的情况:

username = request.get("username")  # 尝试取出用户名,可能有,也可能没有
password = request.get("password")  # 尝试取出密码,可能有,也可能没有# 按照正常思路,理解为“如果没有用户名或者没有密码”
if not username or not password:pass# 根据德摩根率,可以简写
if not (username and password):pass

 

http://www.lryc.cn/news/476831.html

相关文章:

  • 线程ID和线程库
  • 使用AWS Lambda构建无服务器应用程序
  • 响应式网页设计案例
  • 麦麦Docker笔记(一)
  • 【设计模式系列】总览
  • P11118 [ROI 2024 Day 2] 无人机比赛 题解
  • 时序数据库是什么:概念、特点与分类简析
  • 大数据上岗.入职.就业面试题
  • 2016年7月和8月NASA的气候成像(ATom)-1飞行活动期间测量的黑碳(BC)质量混合比(单位为ng BC / kg空气)
  • python opencv3
  • git原理与上传
  • LeetCode:633. 平方数之和(Java)
  • linux查看端口状态的命令合集
  • 幼儿园篮球游戏
  • Android编译环境构建(二)(可用于物理机、虚拟机、容器化Jenkins环境)
  • Web服务器(实验)
  • 【湖南-常德】《市级信息化建设项目初步设计方案编制规范和支出预算编制标准(试行)》-省市费用标准解读系列05
  • 微信小程序 https://pcapi-xiaotuxian-front-devtest.itheima.net 不在以下 request 合法域名
  • vue什么时候渲染旧的VDOM,什么时候渲染新的VDOM
  • 【Qwen2技术报告分析】从模型架构 数据构建和模型评估出发
  • Naive UI 选择器 Select 的:render-option怎么使用(Vue3 + TS)(鼠标悬停该条数据的时候展示全部内容)
  • 使用Mac如何才能提高OCR与翻译的效率
  • QML----复制指定下标的ListModel数据
  • CSS Text(文本)
  • 聊一聊Spring中的@Transactional注解【下】【注解失效场景】
  • 对称加密与非堆成加密
  • 江协科技STM32学习- P28 USART串口数据包
  • Linux脚本循环(for、while、until)
  • 文件系统上云的挑战
  • 【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十一章 制作Ubuntu文件系统