python 迭代器和可迭代对象,python迭代器是什么

  python 迭代器和可迭代对象,python迭代器是什么

  仅供参考,转载请注明出处。

  迭代器迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有元素都被访问。迭代器只能向前,不能向后。

  1.可迭代对象。我们已经知道,我们可以使用循环语法.在.从列表、元组、字符串和其他类型数据中获取数据以供使用。我们称这个过程为遍历,也叫迭代。

  但是,是否所有数据类型都可以放入for的语句中.在.然后让.在.一次拿出一个数据给我们用,就是给我们迭代?

  比如integer int的数据是不能迭代的。

  在[1]中:对于100中的I:

  .打印(一)

  .

  -

  类型错误回溯(最近一次调用)

  模块()中的ipython-input-1-86150fa0c47d

  - 1代表100分之一的I:

  第二版(一)

  三

  type error:“int”对象不可迭代

  在[2]:从上面可以看到错误消息TypeError: int 对象不可迭代,说明int不是迭代类型。

  那么类是迭代类型吗?

  在[2]中:类MyList(对象):

  .def __init__(self):

  .self.list=[]

  .定义添加(自身,项目):

  .self.list.append(项目)

  .

  In [3]: mylist=MyList()

  In [4]: mylist.add(1)

  In [5]: mylist.add(2)

  In [6]: mylist.add(3)

  在[8]中:对于我的列表中的编号:

  .打印(数字)

  .

  -

  类型错误回溯(最近一次调用)

  模块()中的ipython-input-8-1e13316c02cd

  - 1表示我的列表中的数量:

  2份打印(数量)

  三

  TypeError:“my list”对象不可迭代

  在[9]中:对于mylist.list中的编号:

  .打印(数字)

  .

  一个

  2

  三

  在[10]:从上面可以看出,即使一个类的值被定义为list的迭代类型,它自己的类也不是迭代类型。其实写的过程肯定有问题。

  如果重写它,使类成为迭代类型,会怎么样呢?

  2.如何确定一个对象是否可以迭代?您可以使用isinstance()来确定一个对象是否是可迭代对象:

  In [10]:从集合导入Iterable

  在[11]中:isinstance([],Iterable)

  Out[11]:真

  In [12]: isinstance({},Iterable)

  Out[12]:真

  In [13]: isinstance(hello ,Iterable)

  Out[13]:真

  In [14]: isinstance(mylist,Iterable)

  Out[14]:假

  In [15]: isinstance(100,可迭代)

  Out[15]:假

  In [16]:从上面的执行,list,dict,string等。都是可迭代的对象类型,而mylist instance和100不是。

  3.可迭代对象的本质。我们分析了迭代使用iterable对象的过程,发现每次迭代(即for中的每次循环.在.)将返回对象中的下一条数据,并反向读取数据,直到所有数据都被迭代。那么,在这个过程中,应该有一个“人”来记录每次访问了哪一段数据,这样每次迭代才能返回下一段数据。我们把这个能帮我们迭代数据的“人”叫做迭代器。迭代对象的本质就是可以给我们提供这样一个中间的“人”,也就是迭代器,来帮助我们迭代。迭代对象通过_ _ iterator _ _方法为我们提供了一个迭代器。我们在迭代一个迭代器的时候,实际上是先得到一个对象提供的迭代器,然后通过这个迭代器依次得到对象中的每一个数据。那么,带有_ _ iterator _ _方法的对象就是可迭代对象。将__iter__方法添加到前面的Mylist类中,然后检查该对象是否是可迭代对象。

  在[16]:类MyList(对象):

  .def __init__(self):

  .self.list=[]

  .定义添加(自身,项目):

  .self.list.append(项目)

  .def __iter__(self):

  .通过

  .

  在[18]中:mylist=MyList()

  In [19]: isinstance(mylist,Iterable)

  Out[19]:真

  在[20]中:此测试发现带有__iter__方法的mylist对象已经是迭代对象。

  4.iter()函数和next()函数列表、元组等。都是可迭代的对象。我们可以通过iter()函数得到这些可迭代对象的迭代器。然后我们可以在迭代器上使用next()函数来获取下一个数据。iter()函数实际上调用了iterable对象的__iter__方法。#创建列表

  在[20]中:李=[1,2,3,4,5]

  #将列表放入迭代器中

  在[21]中:li_iter=iter(li)

  #调用next方法打印迭代器的内容。

  在[22]:下一个(li_iter)

  Out[22]: 1

  在[23]:下一个(li_iter)

  Out[23]: 2

  在[24]:下一个(li_iter)

  Out[24]: 3

  在[25]:下一个(li_iter)

  Out[25]: 4

  在[26]:下一个(li_iter)

  Out[26]: 5

  # Iterator next没有数据。此异常类似于作为while方法的中断条件。

  在[27]:下一个(li_iter)

  -

  StopIteration Traceback(最近一次调用)

  模块()中的ipython-input-27-ab6a83f394a1

  - 1下一个(li_iter)

  停止迭代:

  在[28]中:注意,当我们已经迭代完最后一个数据后,再次调用next()函数会抛出StopIteration异常,告诉我们所有数据都已经迭代完了,所以我们不需要再执行next()函数了。

  5.迭代器迭代器通过上面的分析,我们已经知道迭代器是用来帮助我们记录每次迭代所访问的位置的。当我们在迭代器上使用next()函数时,迭代器会将它记录的位置的下一个位置的数据返回给我们。实际上在使用next()函数时,调用的是迭代器对象的__next__方法(在Python3中是对象的__next__方法,在Python2中是对象的next()方法)。所以,如果我们想构造一个迭代器,我们必须实现它的__next__方法。但这还不够。python要求迭代器本身是迭代的,所以我们要为迭代器实现_ _ iterator _ _方法,而_ _ iterator _ _方法返回一个迭代器。迭代器本身就是迭代器,所以迭代器的_ _ iterator _ _方法返回自身。实现__iter__方法和next()方法的对象是迭代器。在[21]:类MyList(对象):

  .def __init__(self):

  .self.list=[]

  .自电流=0

  .

  .定义添加(自身,变量):

  .self.list.append(var)

  .

  .定义下一个(自己):

  .如果self.current len(self.list):

  .item=self.list[self.current]

  .自电流=1

  .退货项目

  .否则:

  .引发StopIteration

  .

  .def __iter__(self):

  .回归自我

  .

  在[22]中:

  In [22]: mylist=MyList()

  In [23]: isinstance(mylist,Iterable)

  Out[23]:真的

  In [24]: mylist.add(1)

  In [25]: mylist.add(2)

  In [26]: mylist.add(3)

  In [27]: mylist.next()

  Out[27]: 1

  In [28]: mylist.next()

  Out[28]: 2

  In [29]: mylist.next()

  Out[29]: 3

  In [30]: mylist.next()

  -

  StopIteration Traceback(最近一次调用)

  模块()中的ipython-input-30-1897446021c8

  - 1 mylist.next()

  ipython-input-21-110 aa 633 e 856 in next(self)

  13退货项目

  14其他:

  - 15提升停止迭代

  16

  17 def __iter__(self):

  停止迭代:

  在[31]中:

  在[31]中:

  In [31]: mylist=MyList()

  In [32]: mylist.add(1)

  In [33]: mylist.add(2)

  In [34]: mylist.add(3)

  在[35]中:对于我的列表中的编号:

  .打印(数字)

  .

  一个

  2

  三

  在[36]:从上面的代码可以看出,python2使用next方法后,就有可能通过使用for循环迭代调用next并打印。

  6.for的本质.在.循环Iterable循环中for item的本质是首先通过iterator()函数获取Iterable对象的迭代器,然后调用next()方法获取下一个值并赋给item。当遇到StopIteration异常时,循环结束。

  7.迭代器的应用场景。我们发现迭代器的核心功能是通过调用next()函数返回下一个数据值。如果每次返回的数据值不是在已有的数据集中读取,而是通过程序按照一定的规则计算生成,就意味着不需要依赖已有的数据集,也就是说不需要缓存所有要迭代一次的数据供后续读取,可以节省大量的存储(内存)空间。

  比如数学中有一个著名的斐波那契数列,第一个数字是0,第二个数字是1,后面的每个数字都可以通过前两个数字相加得到:

  0, 1, 1, 2, 3, 5, 8, 13, 21, 34,

  现在我们想遍历迭代斐波那契数列中的前n个数字.在.循环。然后这个斐波那契数列可以用迭代器来实现,每次迭代通过数学计算生成下一个数。

  #编码=utf-8

  类FibIterator(对象):

  斐波那契序列迭代器

  def __init__(self,n):

  :param n: int,指示生成的序列中第一个n的编号。

  self.n=n

  # current用于将当前生成的数字保存到序列中。

  自电流=0

  # num1用于保存之前的数字,初始值为0,序列中的第一个数字。

  self.num1=0

  # num2用于存储前一个数,初始值为序列中的第二个数1。

  self.num2=1

  定义下一个(自己):

  由next()函数调用以获取下一个数字

  if self.current self.n:

  num=self.num1

  self.num1,self.num2=self.num2,self.num1 self.num2

  自电流=1

  退货数量

  否则:

  提升停止迭代

  def __iter__(self):

  迭代器的__iter__返回自身

  回归自我

  if __name__==__main__ :

  fib=FibIterator(10)

  对于光纤中的数量:

  Print(num)按如下方式执行:

  g:\ python 27 \ python . exe F:/python project/Iter/Iter . py

  0

  一个

  一个

  2

  三

  五

  八

  13

  21

  38.不仅仅是for循环可以接收iterable对象。除了for循环,链表,元组等。也可以接收可迭代的对象。

  if __name__==__main__ :

  fib=FibIterator(10)

  对于光纤中的数量:

  打印(数字)

  #使用列表接收

  li=list(FibIterator(15))

  打印(李)

  #用tunple接收

  tp=tuple(FibIterator(6))

  打印(tp)按如下方式执行:

  [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

  (0, 1, 1, 2, 3, 5)

  关注微信微信官方账号,回复【数据】,Python,PHP,JAVA,web,即可获取Python,PHP,JAVA,前端等视频数据。

  来自海洋的渔夫原创作品,

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: