python中不得不知道的:迭代器与生成器理解,最简单易懂的版本

mac2025-08-22  1

什么是可迭代对象

最直观的理解就是可以被for in 循环的对象,例如字符串,字典,列表,元组,集合等, 用另一句话来说就是实现了__iter__ 方法的就是可迭代对象(__iter__方法是python内置方法,用于返回迭代器自身)

什么是迭代器

迭代器就是一个实现了迭代方法的容器,他是一个带状态的对象,他能在你调用next的时候返回容器内的下一个值 任何实现了__iter__和__next__方法的对象都叫迭代器 iter方法返回迭代器本身,next方法返回下一个值 当所有值都返回完,没有更多值的时候,迭代器抛出StopIteration错误,此时迭代结束 相对于可迭代对象,迭代器就多了个next方法。并且,迭代器为一次性消费,next迭代出来的元素用完 不可再生,如需再次迭代使用,需要再次获取迭代器

举个栗子

#此时这个list是个普普通通的列表,也是个可迭代对象 list = [1,2,3,4,5,6] #这时it_obj是接受了由list的iter方法返回的迭代器对象, #众所周知iter方法可以返回一个迭代器对象 it_obj = iter(list) #执行next方法迭代这个迭代器: print(it_obj.__next__()) #此处输出为1 print(it_obj.__next__()) #此处输出为2 print('-'*30) for it in it_obj: #此时输出结果应是从3开始,因为1,2已被迭代使用掉了, #迭代器的元素使用都是一次性的,所以输出3,4,5,6后抛出异常,迭代结束 print(it)

输出:

for循环内部调用了迭代对象的iter方法

迭代器与跌的对象的关系就是如上所述,下面来讲讲生成器

生成器

生成器可以理解为一个特殊的迭代器,它会在执行的时候保存执行环境的上下文,并在下次循环中执行在yield函数,生成器的标志就是yield函数。 生成器看起来就像一个正儿八经的函数,特殊就特殊在它带了yield关键字,生成器没有将有序列表一次性生成,而是用一次生成一次,它可以有无穷的元素,但不需要无穷的空间,用生成器对内存优化很有帮助。

举个栗子

def get_item(): for i in range(10): print('running!') #生成器每次运行到yield,下次调用next从yield后开始执行 yield i print('again') a = get_item() print(a.__next__()) print('-'*30) print(a.__next__()) print('-'*30) print(a.__next__()) print('-'*30) print(a.__next__())

运行结果:

总结一下:可迭代对象就是字符串,列表,字典,集合,元组这些可以用for循环迭代的东西,它们有个iter方法会被for调用出一个迭代器。这个迭代器有固定的元素总量和空间,生成器就是特殊的迭代器,它长得就是个带yield 的函数,它用一次生成一次,比普通迭代器功能强大的多,可以优化内存空间。下次有空讲讲yield关键字和异步
最新回复(0)