迭代器(Iterator)与生成器( Generator)以及 for 循环删除元素的一个坑!!!!!

迭代器(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']


猜你喜欢

转载自blog.csdn.net/weixin_42371158/article/details/80550893