这篇文章将为大家详细讲解有关Python中生成器与迭代器有什么区别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
Num01→迭代器
定义:
对于列表中,字符串,tuple, dict等这些容器对象,使用的循环遍历是很方便的。在后台为语句对容器对象调用<代码> iter() 代码>函数。<代码> iter() 代码>是Python内置函数。
<代码> iter() 代码>函数会返回一个定义了<代码> next() 代码>方法的迭代器对象,它在容器中逐个访问容器内的元素。<代码> next() 代码>也是Python内置函数。在没有后续元素时,<代码> next() 代码>会抛出一个抛出StopIteration异常,通知为语句循环结束。
迭代器是用来帮助我们记录每次迭代访问到的位置,当我们对迭代器使用next()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。实际上,在使用<代码> next() 代码>函数的时候,调用的就是迭代器对象的_next_方法(Python3中是对象的_next_方法,Python2中是对象的<代码> next() 代码>方法),所以,我们要想构造一个迭代器,就要实现它的_next_方法。但这还不够,Python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现_iter_方法,而_iter_方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的_iter_方法返回自身自我即可。
一些术语的解释:
1,迭代器协议:对象需要提供<代码> next() 代码>方法,它要么返回迭代中的下一项,要么就引起一个抛出StopIteration异常,以终止迭代。
2,可迭代对象:实现了迭代器协议对象.list, tuple,东西都是Iterable(可迭代对象),但不是迭代器(迭代器对象)。但可以使用内建函数<代码> iter()> 代码,把这些都变成Iterable(可迭代器对象)。
3项的Iterable循环的本质就是先通过<代码> iter() 代码>函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用<代码> next() 代码>方法来获取下一个值并将其赋值给项目,当遇到抛出StopIteration的异常后循环结束
Python自带容器对象案例:
#,随便定义一个列表 listArray=(1、2、3) #,使用iter()函数 iterName=iter (listArray) 打印(iterName) #,结果如下:是一个列表列表的迭代器 #,& lt; list_iterator  object at 0 x0000017b0d984278> 打印(下(iterName)) 打印(下(iterName)) 打印(下(iterName)) 打印下(iterName))(#没有迭代到下一个元素,直接抛出异常 #,1 #,2 #,3 #,Traceback (most recent call 最后): #,File “Test07.py",, line 32岁,拷贝& lt; module> #,抛出StopIteration
Python中一个实现了_iter_方法和_next_方法的类对象,就是迭代器,如下案例是计算菲波那切数列的案例
class Fib(对象): ,def __init__(自我,,max): 超级才能(Fib,,自我). __init__ () self.max 才能=max ,def __iter__(自我): self.a 才能=0 self.b 才能=1 return 才能自我 ,def __next__(自我): fib 才能=self.a if 才能;fib 祝辞,self.max: ,,raise 抛出StopIteration ,,self.a, self.b =, self.b,, self.a + self.b return 才能,无伤大雅 #,定义一个主要函数,循环遍历每一个菲波那切数 def main (): ,# 20以内的数=,,fib  Fib (20) ,for 小姐:fib拷贝: 打印(i)才能 #,测试 if __name__ ==, & # 39; __main__ # 39;: 之前,main () >解释说明:
在本类的实现中,定义了一个<代码> _iter_(自我)代码>方法,这个方法是在对循环遍历时被iter()调用,返回一个迭代器。因为在遍历的时候,是直接调用的python内置函数<代码> iter() 代码>,由iter()通过调用<代码> _iter_(自我)代码>获得对象的迭代器。有了迭代器,就可以逐个遍历元素了。而逐个遍历的时候,也是使用内置的下一个()函数通过调用对象的<代码> _next_(自我)代码>方法对迭代器对象进行遍历,所以要实现<代码> _iter_(自我)代码>和<代码> _next_(自我)代码>这两个方法。
而且因为实现了<代码> _next_(自我)代码>方法,所以在实现<代码> _iter_(自我)> 代码的时候,直接返回自我就可以。
总结一句话就是:
在循环遍历自定义容器对象时,会使用python内置函数
Python中生成器与迭代器有什么区别