python生成器与迭代器,python中迭代器和生成器

  python生成器与迭代器,python中迭代器和生成器

  是的,生成器是一个特殊的迭代器。在遍历自定义容器对象时,它使用python的内置函数iter()调用遍历对象的_iter_(self)来获取迭代器。

  python中生成器和迭代器的区别(Python3.5中测试的代码):

  迭代程序

  定义:

  对于容器对象(比如list、string、tuple和dict),使用For循环遍历非常有用。在后台对容器对象调用iter()函数进行语句。Iter()是python内置函数。iter()函数返回一个迭代器对象,该对象定义了(一次访问一个容器中的元素)方法。Next()也是python内置函数。如果没有后续元素,next))抛出StopIteration异常,并通知for语句循环已经完成。

  迭代器用于记录每次迭代中访问的位置。当迭代器使用next))函数时,迭代器将返回记录位置的下一个位置的数据。实际上是next))函数,迭代器对象的_next_ method(在Python3中是对象的_next_ method,在Python2中是对象的next)会被调用。因此,要创建迭代器,必须实现其_next_ method。然而,这还不够。Python要求迭代器是可重复的。因此,iter_ method必须为迭代器实现。另外_iter_ method还必须返回一个迭代器。因为迭代器本身就是迭代器,迭代器的_ iterator _ method只需要返回自身。

  一些术语的描述:

  1)迭代器协议(Iterator protocol)对象必须返回迭代中的下一项,或者提供下一个(next))抛出StopIteration异常以结束迭代的方法。

  2.可重复对象:实现迭代器协议的对象。list、tuple和dict是Iterable(可重复对象,但不是Iterator迭代器)对象。但是,您可以使用内置函数iter()将其全部用作Iterable()的迭代器。

  3.Iterable循环中for item的本质是使用iterator()函数获取可重复对象的迭代器,并反复调用获取的迭代器的next)方法获取下一个值,然后转换为item。

  Python附带了容器对象:

  #请随意定义列表

  listarray=[ 1,2,3 ]

  Iter(使用函数

  ITERname=ITER(listarray)))))))))).

  是打印(迭代器名)

  #结果如下。列表迭代器

  #

  打印(下一个(ITER名字))

  打印(下一个(ITER名字))

  打印(下一个(ITER名字))

  Print(next) itername)不会重复到下一个元素,而是直接抛出异常。

  # 1

  # 2

  # 3

  #跟踪背景(mostrecentcalllast):

  #文件 Test07.py ,第32行,在

  #停止迭代

  -

  Python中安装了_iter_ method和_next_ method的类对象之一是iterator。下面是计算psdlm序列的情况。

  类文件(对象):

  def __init__(self,max):

  超级(fib,self)。__init__))

  self.max=max

  def __iter__(self):

  self.a=0

  self.b=1

  返回

  def __next__(自己) :

  fib=自我

  if fib self.max:

  提升停止迭代

  self.a、self.b=self.b

  返回反馈

  #定义循环的每个psdlm切削次数的主函数。

  戴尔大师(:

  # 20以内的数字

  FIB=FIB(20)

  对于光纤中的I:

  我是印刷品(一)

  #测试

  if __name__==__main__ :

  main())

  描述:

  这个类的实现定义了_iter_(self)方法。在遍历for循环的过程中,会调用这个方法返回迭代器。因为在遍历过程中,iter()可以通过直接调用被调用的python内置函数iter()、iter()、iter()和self()得到一对。

  一个迭代器。使用迭代器,您可以逐个遍历元素。在逐个遍历时,我们还使用内置的next()函数,通过调用对象的_next_(self)方法来遍历迭代器对象。所以要实现两个方法_iter_(self)和_next_(self)。

  而且因为实现了_next_(self)方法,所以在实现_iter_(self)的时候直接返回self就足够了。

  总而言之,一句话就是:

  在遍历自定义容器对象时,会用python的内置函数iter()调用迭代器的_iter_(self)得到迭代器,然后用next()调用迭代器对象的_next_(self)。

  注意:_iter_(self)只会被调用一次,而_next_(self)会被调用n次,直到发生StopIteration异常。

  建设者

  角色:

  延迟操作。也就是说,结果是在需要时产生的,而不是立即产生的。

  注意事项:

  生成器只能遍历一次。

  生成器是一种特殊的迭代器。

  分类:

  第一类:生成器函数:函数仍由def定义,但使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果的中间,函数的状态被挂起,这样下次它就可以从停止的地方继续执行。

  下面是一个例子:

  # psdlm切割序列

  定义纤维(最大):

  n,a,b=0,0,1

  当n最大值:

  产量b

  a,b=b,a b

  n=n 1

  返回“亲爱的!‘没有数据……’

  #调用方法生成10个数字。

  f=纤维(10)

  #使用循环捕获上次返回的值,并将其保存在异常StopIteration的值中。

  虽然正确:

  尝试:

  x=下一个(f)

  打印( f:,x)

  除了StopIteration作为e:

  打印(生成器的最终返回值是:e.value)

  破裂

  第二类:生成器表达式:类似于列表派生,只是一对大括号[]被转换成一对括号()。但是,生成器表达式是按需生成一个生成器结果对象,如果想得到每个元素,就需要循环遍历。

  下面是一个例子:

  #一个列表

  小可=[2,3,4,5]

  # generator generator,类似于list,但将[]改为()

  gen=(小可中的一个对一个)

  对于我在gen:

  打印(一)

  #结果是:

  2

  三

  四

  五

  #为什么要使用发电机?因为效率。

  #使用生成器表达式代替列表派生可以节省cpu和RAM。

  #如果你构造一个列表只是为了把它传递给其他函数,

  #例如,如果将它传递给tuple()或set(),请改用生成器表达式!

  #在这种情况下,列表直接转换为元组。

  kk=tuple(小可中a对a)

  打印(kk)

  #结果是:

  (2, 3, 4, 5)

  # Python的一些内置函数可以识别出这是一个生成器表达式,外面有一对括号,就是生成器。

  result1=sum(a for a in range(3))

  打印(结果1)

  #列表派生

  result2=sum([a for a in range(3)])

  打印(结果2)

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

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