python中迭代器与生成器的区别

  

python中迭代器与生成器的区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>迭代器

我们先从迭代器开始入手,迭代器并不是python独有的概念,在c++和Java当中都有迭代器的概念,两者的使用也都差不多。迭代器主要解决了一个问题,在一个复杂场景下,获取数据怎么尽可能简便。

我们来假设一个场景,假设我们从某个数据源获取了一批数据,然后我们需要调用前一万条生成一个结果,得到结果之后,我们要将剩下的数据交给另一个调用方去处理。这个过程看起来非常平常,但是隐藏了两个问题,第一个问题是如果我们能保证第一次处理的时候,每次都是使用一万条还好说,如果我们使用的条数是一个动态的值呢?显然,我们需要一个变量来记录我们究竟用了多少条数据,和这批数据的状态。其次,如果这个数据量很大会存在一个数据传输的问题。我们每次都要将一大批数据传来传去,显然会消耗很多资源。

还有一个场景是如果我们开发的是一个比较复杂的数据结构,比如一棵多叉树,下游想要遍历它的时候,必须要了解它的实现原理才行。这显然也不太友好。

迭代器的出现正是针对以上这些问题,它的含义也很简单,有点像是我们遍历链表的时候用到的坏蛋的指针。永远指向当前的位置,永远知道下一个位置在哪里。

<强>容器迭代器

我们先从简单的元素迭代器开始了解它的用途,我们都知道python当中经典的几个容器:<代码>列表,<代码>元组和<代码> dict>

我们来看一个例子:

:
  打印(i) 

这种用法就和我们用的循环遍历元素是一样的。

<>强自定义迭代器

官方的迭代器的用法就这么多,这也不是它的主要用法,它最主要的用法是我们自己创建迭代器。和之前介绍Python自定义排序的时候的思路一样,我们为类添加上<代码> __iter__ 方法和<代码> __next__ 方法即可。

其中<代码> __iter__ 方法用来初始化并返回迭代器,关于它的解释比较复杂。在Python当中迭代有两个概念一个是<代码> iterable> 迭代器>

我知道这么说可能听不太明白,我举个例子,比如说员工和老板,员工没有审批权限,只能转达给老板。我们把员工比喻成iterable对象,老板比喻成<代码>迭代器>

员工面临一个问题的时候没有权限处理,只能找来老板决定。也就是最终决定的是老板,但如果是老板自己发现的问题,他完全可以自己就解决了,不需要再去找其他人。所以说我们用iter调用iterable对象的<代码> __iter__> __next__>

到这里也就清楚了,只有迭代器有<代码> __next__ 方法,而iterable没有,并且__iter__返回的是一个迭代器,然而我们定义的已经是迭代器了,它同时也是一个iterable对象,所以调用__iter__时只需要返回<代码>自我>

我们来看一个例子:

类PowTwo:
  “““类来实现迭代器
  权力two"““
  
  def __init__(自我,max=0):
  自我。max=max
  
  def __iter__(自我):
  自我。n=0
  回归自我
  
  def __next__(自我):
  如果自我。n & lt;=self.max:=2 * * self.n结果
  自我。n +=1
  返回结果
  其他:
  提高抛出StopIteration 

python中迭代器与生成器的区别