【python学习】-在条件分支结构中错误使用or导致其他条件分支的代码跳过并不执行

在条件分支结构中错误使用or导致其他条件分支的代码跳过并不执行

  • bug的来源背景
  • 代码目标
    • 第一版代码
    • 第二版代码
    • 第三版代码
  • 问题总结
  • 后语

bug的来源背景

由于课题更换的原因,最近去做实验搬砖工了,所以大半年没有写代码,这两天开始处理一些代码任务,发现代码逻辑能力下降、测试代码的能力也下降了!所以出现很多bug,但这也让我回到了以前经常排除代码bug的那种感觉。因此,借一个bug,记录一下代码排错过程。很多时候,bug往往出现在我们觉得代码逻辑没有问题,但细节描述有问题的地方,废话不多说,咋们进入正文!

代码目标

代码块的实现目标是:
实现在不同条件下,执行不同操作

【思路设计】

  • 第一、用for逐次遍历条件
  • 第二、在遍历过程中,使用if…elif条件结构,判断条件是否符合(对一些同类条件用了or进行归并),然后执行条件分支下的操作

第一版代码

folder=['condition_1','condition_2','condition_3']
for i in range(0,len(folder),1):if folder[i]=='condition_1' or 'condition_2':print('已执行condition_1与condition_2条件下的操作')elif folder[i]=='condition_3':print('已执行condition_3条件下的操作')
已执行condition_1与condition_2条件下的操作
已执行condition_1与condition_2条件下的操作
已执行condition_1与condition_2条件下的操作

【问题】可以发现这样的结构每次只执行了第一个条件分支第二个elif的条件分支没有执行,为什么呢?
【代码调整】检查遍历过程中是否有出现folder[i]='condition_3'的情况

第二版代码

folder=['condition_1','condition_2','condition_3']
for i in range(0,len(folder),1):print('i',i,'folder[i]',folder[i])if folder[i]=='condition_1' or 'condition_2':print('已执行condition_1与condition_2条件下的操作')elif folder[i]=='condition_3':print('已执行condition_3条件下的操作')
i 0 folder[i] condition_1
已执行condition_1与condition_2条件下的操作
i 1 folder[i] condition_2
已执行condition_1与condition_2条件下的操作
i 2 folder[i] condition_3
已执行condition_1与condition_2条件下的操作

【问题】为什么代码块明明已经出现folder[i]='condition_3',为什么不执行最后符合条件的分支结构呢?
【代码调整】难道是因为这里or的指代范围不明确?相当于else的作用?对or的指代进行明确看一下,即具体化folder[i]=='condition_2'

第三版代码

folder=['condition_1','condition_2','condition_3']
for i in range(0,len(folder),1):print('i',i,'folder[i]',folder[i])if folder[i]=='condition_1' or folder[i]=='condition_2':print('已执行condition_1与condition_2条件下的操作')elif folder[i]=='condition_3':print('已执行condition_3条件下的操作')
i 0 folder[i] condition_1
已执行condition_1与condition_2条件下的操作
i 1 folder[i] condition_2
已执行condition_1与condition_2条件下的操作
i 2 folder[i] condition_3
已执行condition_3条件下的操作

可见,此时对or的指代具体化后,代码结构相当于以下代码的执行情况

folder=['condition_1','condition_2','condition_3']
for i in range(0,len(folder),1):if folder[i]=='condition_1':print('已执行condition_1条件下的操作')elif folder[i]== 'condition_2':print('已执行condition_2条件下的操作')elif folder[i]=='condition_3':print('已执行condition_3条件下的操作')
已执行condition_1条件下的操作
已执行condition_2条件下的操作
已执行condition_3条件下的操作
folder=['condition_1','condition_2','condition_3']
for folder_i in folder:if folder_i=='condition_1':print('已执行condition_1条件下的操作')elif folder_i== 'condition_2':print('已执行condition_2条件下的操作')elif folder_i=='condition_3':print('已执行condition_3条件下的操作')
已执行condition_1条件下的操作
已执行condition_2条件下的操作
已执行condition_3条件下的操作

问题总结

那么or的不正确使用真的会导致出现else的结果吗,用以下代码验证一下

folder=['condition_1','condition_2','condition_3']
for i in range(0,len(folder),1):print('i',i,'folder[i]',folder[i])if folder[i]=='condition_1' or 'b':print('已执行condition_1与condition_2条件下的操作')elif folder[i]=='condition_3':print('已执行condition_3条件下的操作')
i 0 folder[i] condition_1
已执行condition_1与condition_2条件下的操作
i 1 folder[i] condition_2
已执行condition_1与condition_2条件下的操作
i 2 folder[i] condition_3
已执行condition_1与condition_2条件下的操作

【总结】

可见,or后面的指代如果没有变量(如if folder[i]=='condition_1' or 'condition_2':),代码默认第一个分支结构相当于if..else,此时or后面的条件不管是什么,代码都是识别为else;
如果or后面有明确对变量的条件进行指代(如:if folder[i]=='condition_1' or folder[i]=='condition_2':),则相当于if..elif

后语

其实最初开始写代码时,尤其是要实现一个较为复杂的功能时,我都会先用一些简单的代码来测试自己的逻辑是否正确,以及一些语法表达是否就是能达到我想要的效果。后来写得多了,很复杂的功能也不用做太多的小测试了,直接在脑里大概定下代码思路,就可以开始写。可见,大半年不写代码直接退化到初级水平!结论就是,好刀要多磨,放久了就是会生锈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用CMake组织构建QT项目

文章目录 定位Qt安装路径查找QT包设置自动MOC、UIC和RCC包含和链接Qt库处理资源文件调整编译器设置处理UI文件多平台支持高级编译选项在使用CMake来组织和构建Qt项目时,需要注意一系列的细节以确保项目的顺利编译和运行。这些细节涉及确保Qt和CMake之间的兼容性、处理UI文件和…

HTML详解

1. 文档结构标签 <!DOCTYPE html>&#xff1a;声明文档类型&#xff0c;告诉浏览器这是一个HTML5文档。<html>&#xff1a;HTML文档的根元素&#xff0c;包含整个HTML文档。<head>&#xff1a;包含文档的元数据&#xff08;metadata&#xff09;&#xff0c…

计算多图的等价无向图的邻接链表表示

计算多图的等价无向图的邻接链表表示 摘要:一、引言二、算法思路三、伪代码实现四、C代码实现五、算法分析六、结论摘要: 在图论中,多图(Multigraph)是一种允许边重复以及存在自循环边(即一个顶点到其自身的边)的图。给定一个多图的邻接链表表示,本文旨在探讨如何构造…

Git 忽略已经提交的文件

对于未提交过的文件直接用ignore文件即可,不再赘述 对于已经提交过的文件,但是实际上不需要的,可以用git rm --cached命令 比如下图这个 .vsconfig被我误提交了或者忘了在ignore里添加了 但是我实际上不想要这个文件,那么在项目根目录打开git bash ,输入 git rm --cached .vsc…

【QNX+Android虚拟化方案】107 - QNX NFS Server + Android NFS Client 完整配置

【QNX+Android虚拟化方案】107 - QNX NFS Server + Android NFS Client 完整配置 一、QNX 侧 NFS Server 修改:ip 为 192.168.1.21.1 配置拷贝 nfsd、rpcbind 到 /mnt 目录下1.2 配置 exports1.3 为NFS 共享目录挂载镜像1.4 修 startup.sh 开机自启动 nfsd Server1.5 关闭 QNX…

分歧时间估计与被子植物的年代-文献精读43

Ad fontes: divergence-time estimation and the age of angiosperms 回归本源&#xff1a;分歧时间估计与被子植物的年代 摘要 准确的分歧时间对于解释和理解谱系演化的背景至关重要。在过去的几十年里&#xff0c;有关冠被子植物推测的分子年龄&#xff08;通常估计为晚侏罗…

RabbitMQ中的死信交换机?(RabbitMQ延迟队列有了解过吗)

延迟队列 延迟队列:进入队列的消息会被延迟消费的队列。 延迟队列死信交换机 TTL&#xff08;过期时间&#xff09; 延迟队列的使用场景:超时订单、限时优惠、定时发布 死信交换机 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信(dead letter): 消费者使…

wpf prism 《1》、区域 、模块化

安装prism.DryIoc 修改app.xaml <prism:PrismApplication x:Class"WpfApp3.App"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local"clr-namespace:W…

求职Leetcode题目(9)

1.通配符匹配 题解&#xff1a; 其中&#xff0c;横轴为string s&#xff0c;纵轴为pattern p 这个表第(m,n)个格子的意义是:【p从0位置到m位置】这一整段&#xff0c;是否能与【s从0位置到n位置】这一整段匹配 也就是说&#xff0c;如果表格的下面这一个位置储存的是T(True)…

shell脚本--正则表达式

一、正则表达式的类型 在Linux中,有两种流行的正则表达式引擎: POSIX基础正则表达式(basic regular expression,BRE)引擎 POSIX扩展正则表达式(extended regular expression,ERE)引擎 POSIX BRE引擎通常出现在依赖正则表达式进行文本过滤的编程语言中。它为常见模式提供…

pytorch交叉熵损失函数

nn.CrossEntropyLoss 是 PyTorch 中非常常用的损失函数,特别适用于分类任务。它结合了 nn.LogSoftmax 和 nn.NLLLoss(负对数似然损失)的功能,可以直接处理未经过 softmax 的 logits 输出,计算预测值与真实标签之间的交叉熵损失。 1. 交叉熵损失的原理 交叉熵损失衡量的是…

cnocr 安装

打开终端 如果不会打开终端 -> 终端打开输入 pip install cnocr 执行中途可能报错 去这里下载工具&#xff1a;c构建工具下载完打开&#xff0c;勾选这个 然后点安装安装完回到第2步重新执行

等保2.0--安全计算环境--TiDB数据库

在使用本博客提供的学习笔记及相关内容时,请注意以下免责声明:信息准确性:本博客的内容是基于作者的个人理解和经验,尽力确保信息的准确性和时效性,但不保证所有信息都完全正确或最新。非专业建议:博客中的内容仅供参考,不能替代专业人士的意见和建议。在做出任何重要决…

移动端前端开发主流框架及其技术方案

移动端前端开发主流框架及其技术方案 在现代移动端应用开发中&#xff0c;前端框架的选择至关重要。它不仅影响开发效率&#xff0c;还直接关系到应用的性能和用户体验。以下是当前主流的移动端前端框架的详细技术方案&#xff0c;包括 React Native、Flutter 和 Ionic&#x…

PyTorch 的自动求导与计算图

在深度学习中&#xff0c;模型的训练过程本质上是通过梯度下降算法不断优化损失函数。为了高效地计算梯度&#xff0c;PyTorch 提供了强大的自动求导机制&#xff0c;这一机制依赖于“计算图”&#xff08;Computational Graph&#xff09;的概念。 1. 什么是计算图&#xff1…

前胡基因组与伞形科香豆素的进化-文献精读42

The gradual establishment of complex coumarin biosynthetic pathway in Apiaceae 伞形科中复杂香豆素生物合成途径的逐步建立 羌活基因组--文献精读-36 摘要&#xff1a;复杂香豆素&#xff08;CCs&#xff09;是伞形科植物中的特征性代谢产物&#xff0c;具有重要的药用价…

深度学习与大模型第1课环境搭建

深度学习与大模型第1课 环境搭建 1. 安装 Anaconda 首先&#xff0c;您需要安装 Anaconda&#xff0c;这是一个开源的 Python 发行版&#xff0c;能够简化包管理和环境管理。以下是下载链接及提取码&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Na2xOFpBXQMgzXA…

网络准入控制系统

当我们谈论网络准入控制系统时&#xff0c;我们谈论的并不是网络准入控制系统&#xff0c;而是安全&#xff0c;我们不能只囿于它表面的浮华而忘掉它的本质&#xff0c;记住&#xff0c;不管讨论什么&#xff0c;我们必须要有直达本质的能力。网络的本质就是安全。 网络准入控制…

TDesign 微信小程序组件库配置

文章目录 1.安装 npm 包2. 构建 npm3. 构建完成后即可使用 npm 包。4.修改 app.json5.修改 tsconfig.json6.使用组件 1.安装 npm 包 在小程序 package.json 所在的目录中执行命令安装 npm 包&#xff1a; npm install结果报错 PS C:\WeChatProjects\miniprogram-1> npm i…

vscode和edge浏览器等鼠标输入光标变透明

本人是AMD的APU会出现这种情况。它的gpu加速有些问题。 都是要关闭gpu硬件加速功能。edge浏览器好找。vscode是通过以下方法。 要关闭VSCode的硬件加速功能&#xff0c; ‌通过配置文件调整‌&#xff1a; 打开VSCode的设置&#xff08;通过按下CtrlShiftP或CmdShiftP打开命令…