python中迭代器与生成器的区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
<强>迭代器强>
我们先从迭代器开始入手,迭代器并不是python独有的概念,在c++和Java当中都有迭代器的概念,两者的使用也都差不多。迭代器主要解决了一个问题,在一个复杂场景下,获取数据怎么尽可能简便。
我们来假设一个场景,假设我们从某个数据源获取了一批数据,然后我们需要调用前一万条生成一个结果,得到结果之后,我们要将剩下的数据交给另一个调用方去处理。这个过程看起来非常平常,但是隐藏了两个问题,第一个问题是如果我们能保证第一次处理的时候,每次都是使用一万条还好说,如果我们使用的条数是一个动态的值呢?显然,我们需要一个变量来记录我们究竟用了多少条数据,和这批数据的状态。其次,如果这个数据量很大会存在一个数据传输的问题。我们每次都要将一大批数据传来传去,显然会消耗很多资源。
还有一个场景是如果我们开发的是一个比较复杂的数据结构,比如一棵多叉树,下游想要遍历它的时候,必须要了解它的实现原理才行。这显然也不太友好。
迭代器的出现正是针对以上这些问题,它的含义也很简单,有点像是我们遍历链表的时候用到的坏蛋的指针。永远指向当前的位置,永远知道下一个位置在哪里。
<强>容器迭代器强>
我们先从简单的元素迭代器开始了解它的用途,我们都知道python当中经典的几个容器:<代码>列表代码>,<代码>元组代码>和<代码> dict> 代码。它们都是一个可迭代对象,我们可以直接使用关键字iter获取一个对应的迭代器。
我们来看一个例子:
: 打印(i)
这种用法就和我们用的循环遍历元素是一样的。
<>强自定义迭代器强>
官方的迭代器的用法就这么多,这也不是它的主要用法,它最主要的用法是我们自己创建迭代器。和之前介绍Python自定义排序的时候的思路一样,我们为类添加上<代码> __iter__ 代码>方法和<代码> __next__ 代码>方法即可。
其中<代码> __iter__ 代码>方法用来初始化并返回迭代器,关于它的解释比较复杂。在Python当中迭代有两个概念一个是<代码> iterable> 代码,一个是<代码>迭代器> 代码。协议规定iteratble的__iter__方法会返回一个迭代器,而迭代器本身也是一个iterable对象,自然也需要实现__iter__方法。
我知道这么说可能听不太明白,我举个例子,比如说员工和老板,员工没有审批权限,只能转达给老板。我们把员工比喻成iterable对象,老板比喻成<代码>迭代器> 代码。
员工面临一个问题的时候没有权限处理,只能找来老板决定。也就是最终决定的是老板,但如果是老板自己发现的问题,他完全可以自己就解决了,不需要再去找其他人。所以说我们用iter调用iterable对象的<代码> __iter__> 代码的时候,会得到一个迭代器,也就是调用员工返回老板,然后通过调用迭代器的<代码> __next__> 代码来进行迭代。
到这里也就清楚了,只有迭代器有<代码> __next__ 代码>方法,而iterable没有,并且__iter__返回的是一个迭代器,然而我们定义的已经是迭代器了,它同时也是一个iterable对象,所以调用__iter__时只需要返回<代码>自我> 代码就好了.__next__方法很简单,对应迭代器的下方法,用来返回下一个迭代的元素。
我们来看一个例子:
类PowTwo: “““类来实现迭代器 权力two"““ def __init__(自我,max=0): 自我。max=max def __iter__(自我): 自我。n=0 回归自我 def __next__(自我): 如果自我。n & lt;=self.max:=2 * * self.n结果 自我。n +=1 返回结果 其他: 提高抛出StopIterationpython中迭代器与生成器的区别