Python中生成器与迭代器有什么区别

  介绍

这篇文章将为大家详细讲解有关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()> 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中生成器与迭代器有什么区别