概述
迭代器(Iterator)与生成器( Generator) :
迭代器: 一个类方法中同时有iter方法和next方法,此时可以通过for循环遍历该类对象.我们把这个类创建的实例对象称为可迭代对象 .
使用for遍历该类对象时, 会自动调用__iter__()方法,而__iter__()方法会返回一个定义了__next__()方法的迭代器对象,它在容器中逐个访问容器内元素, next()也是 python的内置函数。在没有后续元素时调用next()会抛出一个 StopIteration异常,遍历停止.对于 strings、list、dict、tuple等这类容器对象,底层函数含有迭代器,于是可以直接使用 for循环遍历。
生成器: 是创建迭代器的简单而强大工具。它们写起来就像是正规的函数,只在需要返回据时候使用 yield语句。每次 next()被调用时,生成器会返回它脱离的位置(记忆语句最后一次执行和所有数据 ,生成器会返回它脱离的位置)。
区别:生成器能做到迭代器的所有事,而且因为自动创建了 __iter__()和 next()方法 ,生成器显得特别简洁 ,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省 cup和内存。除了自动创建方法和保存程序状态之外,当生成器终结时,还会自动抛出 StopIteration异常。Yield的用法有点像return,但是它返回的是一个生成器。
易踩坑点:使用iter()方法时经常会遇到ConcurrentModificationException异常,这通常是由于在使用Iter遍历容器的同时又对容器做增加或删除操作所导致的,由于遍历时是按照索引执行的 ,删除已经遍历过的索引时,会导致后面的索引统一向前挪,举个栗子:
解决方法: 先定义一个空列表来储存要删除的对象, 筛选一遍后 再进行删除 .
C = [x for x in A if x =="C"or x == "D"] for i in C: A.remove(i)
打印结果:
['C', 'D'] ['A', 'B', 'E', 'F']
最后
以上就是瘦瘦时光为你收集整理的迭代器(Iterator)与生成器( Generator)以及 for 循环删除元素的一个坑!!!!!的全部内容,希望文章能够帮你解决迭代器(Iterator)与生成器( Generator)以及 for 循环删除元素的一个坑!!!!!所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复