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

Python:不要在循环中删除元素

目录

01 有话要说

02 题目分析


01 有话要说

最近刷Python二级题,我实在没有想到真题里面居然出现循环中删除元素并判断的一道选择题。我觉得Python有一个很鲜明的特点就是:简洁清晰。说实在的,我不是很认可将这种题目放到考试里面去,本身在循环中删除元素就是大忌,但凡有点常识的人都不会这么干,更何况是学习python。如果我们阅读代码还需要翻阅大量的书籍,查阅网站才可以分析看懂这一行两行代码,我个人认为这种代码属于垃圾代码,真正牛x的代码应该是老少皆宜,应该在不丧失可读性的情况下去保证简洁。我觉得python之禅他应该奉为圭臬。

02 题目分析

当然,上面是我的小情绪,该分析的还是需要分析,下面是原题。

 答案选C

首先需要了解for循环的原理:首先使用iiter()得到列表的可迭代对象,再使用next()方法对列表的可迭代对象取值,直到取完所有值。

如果你不明白迭代器这些,那也不是问题,这里通俗说一下就好你就明白了。对于列表,for循环,每取一个值,实际上都是先取索引(最初从0开始依次加1),然后根据索引找到对应的列表值返回,所以for循环呈现给我们的假象是依次取出每一个元素值。如果你还是不明白,那我们总明白for循环总是可以用while循环表示对吧,那我们就用while循环表现类似的效果(为了不增加难度,这里不对列表进行迭代等等操作)

num = [1, 2, 3, 4]
# 以下是for循环的过程(这实际并不是,只是类似的效果)
length = len(num)
first = 0
while first < length:
    num_i = num[first]  # num_i是取出的列表元素值
    first += 1
# 上述类似于完成了for i in num中的取值i

所以呢,我们来分析题目。

先取索引0,然后得到值'A' ==>  if判断发现不是'D',进入下一次循环

取索引1,然后得到值'B' ==> if判断发现不是'D',进入下一次循环

取索引2,然后得到值'C' ==> if判断发现不是'D',进入下一次循环

取索引3,然后得到值'D' ==> if判断发现就是是'D',使用remove()方法将第一个D删除。

取索引4,前面已经对列表进行了删除所以现在列表是['A','B','C','D','D'],那么按要求来,索引为4的值是目前列表中的第二个'D' ==> if判断发现就是'D',使用remove()方法将第一个'D'删除(remove方法永远只删从左往右遇见的第一个目标值)。

取索引5,前面已经对列表进行了两次删除所以现在列表是['A','B','C','D'],那么按要求来,索引为5的值不存在,所以取值失败退出for循环。

可能上面的过程分析你会有所疑虑,但是我想说,大体过程确实如此,只是没有将迭代等相关的知识容纳进去,但是它并不会影响你理解这道题为什么正确结果是D。

如果你需要分析,这里给出代码,就不过多解释了。

>>> num = ['A', 'B', 'C', 'D', 'D', 'D']
>>> num_iter = iter(num)  # 得到num的迭代器
>>> next(num_iter)  # 获取索引为0的值并返回,值为'A'
'A'
>>> next(num_iter)  # 获取索引为1的值并返回,值为'B'
'B'
>>> next(num_iter)  # 获取索引为2的值并返回,值为'C'
'C'
>>> next(num_iter)  # 获取索引为3的值并返回,值为'D'
'D'
>>> num.remove('D')  # if判断为True,删除第一个'D'
>>> next(num_iter)  # 获取索引为4的值并返回,由于上一行对列表进行了删操作,所以新列表是['A', 'B', 'C', 'D', 'D'],获取的 是第二个'D'
'D'
>>> num.remove('D')  # id判断为True,删除第一个'D'(remove删除从左往右遇见的第一个目标值)
>>> next(num_iter)  # 获取索引为5的值并返回,由于上一行对列表进行了删操作,所以新列表是['A', 'B', 'C', 'D'],新列表没有索引5,所以取值失败,退出for循环
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

<p>炒茄子</p>

相关文章:

  • 地理标志农产品质量安全风险评估及预警研究
  • 计算机毕业设计springboot+vue基本微信小程序的我来运动健身系统
  • 如何前后端分离?
  • Putty连接登录Linux .ppk
  • Java面试:MySQL间隙锁是什么鬼?
  • Android 不允许在子线程中更新 UI ,你有想过这是为什么吗?
  • Numpy数组中的运算与拼接,看这篇就够了
  • Docker网络模型
  • U9二次开发之补丁制作
  • 数字孪生与元宇宙相比有何区别?
  • java计算机毕业设计计算机散件报价系统源码+数据库+系统+lw文档+mybatis+运行部署
  • Qt Quick/QML入门到精通_专栏demo对应文章目录(目前27个demo/长期更新)
  • Java并发 | 17.[锁机制] 重量级锁(Monitor+自旋锁)
  • 【我拥有的书】
  • MSP432P 汇编,C语言点灯
  • Android框架之Volley
  • canvas 高仿 Apple Watch 表盘
  • gops —— Go 程序诊断分析工具
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS编译提示和导航提示
  • js ES6 求数组的交集,并集,还有差集
  • Lucene解析 - 基本概念
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Node + FFmpeg 实现Canvas动画导出视频
  • PHP 小技巧
  • Python学习笔记 字符串拼接
  • React的组件模式
  • text-decoration与color属性
  • vue自定义指令实现v-tap插件
  • webpack入门学习手记(二)
  • 程序员最讨厌的9句话,你可有补充?
  • 从输入URL到页面加载发生了什么
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 回流、重绘及其优化
  • 收藏好这篇,别再只说“数据劫持”了
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 网络应用优化——时延与带宽
  • 微信小程序填坑清单
  • 原生JS动态加载JS、CSS文件及代码脚本
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​第20课 在Android Native开发中加入新的C++类
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • (7)STL算法之交换赋值
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C语言)二分查找 超详细
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (四)模仿学习-完成后台管理页面查询
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET 表达式计算:Expression Evaluator
  • .NET 简介:跨平台、开源、高性能的开发平台
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚