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

yipeiwu_com7年前Python基础

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利用itertools生成密码字典并多线程撞库破解rar密码

脚本功能: 利用itertools生成密码字典(迭代器形式) 多线程并发从密码字典中取出密码进行验证 验证成功后把密码写入文件中保存 #!/usr/bin/env...

跟老齐学Python之集成开发环境(IDE)

跟老齐学Python之集成开发环境(IDE)

当安装好python之后,其实就已经可以进行开发了。下面我们开始写第一行python代码。 值得纪念的时刻:Hello world 如果是用windows,请打开CMD,并执行pytho...

python递归法实现简易连连看小游戏

python递归法实现简易连连看小游戏

问题:简单版连连看小游戏 一个分割成w*h个正方格子的矩形板上,每个正方格子可以有游戏卡,也可以没有游戏卡 两个游戏卡之间有一条路径相连需满足以下三个条件: 1.路径只包含水平和垂直的直...

在Pycharm中自动添加时间日期作者等信息的方法

在Pycharm中自动添加时间日期作者等信息的方法

1.按照下面路径以此打开 File→→Settings→→Editor→→File and code Templates 右侧找到Python Script,如下图 2.设置相...

Python实现ssh批量登录并执行命令

局域网内有一百多台电脑,全部都是linux操作系统,所有电脑配置相同,系统完全相同(包括用户名和密码),ip地址是自动分配的。现在有个任务是在这些电脑上执行某些命令,者说进行某些操作,比...