开心一刻
有一个激进分子常常残害基督徒。这一日在街头他杀了几个基督徒后,又抓住一个男子,问道:“你是不是基督徒?”男子道:“幸好我不是。阿门…”“嗯?!”“……阿前一棵葡萄树,阿嫩阿嫩绿滴刚发芽,瓜牛背着那沉重的壳呀……”
写在前面
最近和同学讨论python3中迭代器和生成器的区别,看了一些博客也是一知半解的,后来通过讨论基本弄明白了两者的区别,同时又把可迭代对象和迭代器、生成器的区别也整理了一下,也怕以后再忘掉,在这里写一篇博客记录一下。
三者简要关系图
从上图可知,迭代器一定是可迭代对象,但是可迭代对象不一定是迭代器对象。
迭代器和可迭代对象
直接上结论:
1)可迭代对象包含迭代器。
2)如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象再拥有__next__方法,其是迭代器。
3)定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和__next__方法。
介绍一下上述两个方法:
(1)iter(self)
该方法返回的是当前对象的迭代器类的实例。主要有两种写法:
写法一:返回自身即返回self;
写法二:返回可迭代对象的迭代器类的实例。
(2)next(self)
返回迭代的每一步,实现该方法时注意要最后超出边界要抛出StopIteration异常。
生成器
生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和__next__方法),不需要再手动实现两方法。
生成器在迭代的过程中可以改变当前迭代值(send方法),而修改普通迭代器的当前迭代值往往会发生异常,影响程序的执行。
– | 可迭代对象 | 迭代器 | 生成器 |
---|---|---|---|
特点 | 对象拥有__iter__方法就是可迭代对象 | 实现了__iter__和__next__方法的就是迭代器对象 | 自动实现__iter__和__next__方法,能通过send方法修改当前迭代的值,是一个特殊的迭代器 |
使用 | 可多次使用 | 使用一次后如果不重新赋则无法再使用 | 使用一次后如果不重新赋则无法再使用 |
可迭代对象和迭代器和生成器还是需要好好理解,掌握它们的特点,就能够正确使用它们。
文中都是我个人的理解,如有错误的地方欢迎下方评论告诉我,我及时更正,大家共同进步