详谈python3中用for循环删除列表中元素的坑


Posted in Python onApril 19, 2018

for循环语句的对象是可迭代对象,可迭代对象需要实现__iter__或iter方法,并返回一个迭代器,什么是迭代器呢?迭代器只需要实现 __next__或next方法。

现在来验证一下列表为什么支持迭代:

x = [1,2,3]
its = iter(x)
# its = x.__iter__()
print(type(its))
# print(its.__next__())
# print(its.__next__())
# print(its.__next__())
print(next(its))
print(next(its))
print(next(its))

结果:

<class 'list_iterator'>
1
2
3

for 语句如何循环的呢?步骤是:

(1)先判断对象是否为可迭代对象,不是的话直接报错,抛出TypeError异常,是的话,调用 __iter__或iter方法,返回一个迭代器

(2)不断地调用迭代器的__next__或next方法,每次按序返回迭代器中的一个值

(3)迭代到最后,没有更多元素了,就抛出异常 StopIteration,这个异常 python 自己会处理,不会暴露给开发者

list1 = [1,2,3,4,5,6]
for i in list1:
 if i == 2:
  list1.remove(i)
 print(i)
print(list1)

结果:

1
2
4
5
6
[1, 3, 4, 5, 6]

第二个print打印的结果显然是删除了元素2的列表,第一个print为什么没有3呢?因为执行for语句时,先生成一个迭代器,再用next方法,按序返回迭代器中的值,当列表中删除了元素2时,元素3的索引变成了原来元素2的索引,把元素3往前推到了元素2的位置,所以next方法就没返回值3.在python中,使用iter函数可以获得有序聚合类型的迭代器,我个人将迭代器理解为带有next指针的单向链表,获取到的迭代器为链表的表头,表头内容为空,next指针指向有序聚合类型的第一个元素。

在访问链表最后一个元素的next指针时,python会报错StopIteration。

以上这篇详谈python3中用for循环删除列表中元素的坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
决策树的python实现方法
Nov 18 Python
Python中max函数用法实例分析
Jul 17 Python
Python设计模式之命令模式简单示例
Jan 10 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
Nov 07 Python
3分钟学会一个Python小技巧
Nov 23 Python
Python WEB应用部署的实现方法
Jan 02 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
Jan 18 Python
如何使用python代码操作git代码
Feb 29 Python
jupyter lab文件导出/下载方式
Apr 22 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
Jun 18 Python
python中pycryto实现数据加密
Apr 29 Python
PyQt5每天必学之关闭窗口
Apr 19 #Python
python实现在IDLE中输入多行的方法
Apr 19 #Python
python贪婪匹配以及多行匹配的实例讲解
Apr 19 #Python
PyQt5每天必学之工具提示功能
Apr 19 #Python
PyQt5每天必学之QSplitter实现窗口分隔
Apr 19 #Python
python 读入多行数据的实例
Apr 19 #Python
Python 绘图库 Matplotlib 入门教程
Apr 19 #Python
You might like
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
分享下PHP register_globals 值为on与off的理解
2013/09/26 PHP
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
JS 获取select(多选下拉)中所选值的示例代码
2013/08/02 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
python多进程中的内存复制(实例讲解)
2018/01/05 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
python实现随机梯度下降法
2020/03/24 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
房地产出纳岗位职责
2013/12/01 职场文书
高中数学教学反思
2014/01/30 职场文书
三爱活动实施方案
2014/03/19 职场文书
书香家庭事迹材料
2014/05/09 职场文书
股指期货心得体会
2014/09/10 职场文书
社区国庆节活动总结
2015/03/23 职场文书