python中迭代器和生成器的区别,python中的生成器和迭代器

  python中迭代器和生成器的区别,python中的生成器和迭代器

  Python迭代器和生成器

  1.迭代程序

  1.什么是迭代器?

  在迭代器之前,还有一个相关的iter要介绍:iterable object:只要定义了iterator()方法,我们就说对象是迭代器,迭代器可以提供迭代器。

  在Python中,for循环可以用于Python中的任何类型,包括list、ancestor等。事实上,for循环可以用于任何“可迭代对象”,它实际上是一个迭代器。

  迭代器是实现迭代器协议的对象。在Python中,迭代器协议意味着带有下一个方法的对象将前进到下一个结果,在一系列结果结束时,它将触发StopIteration。通过使用for循环或其他遍历工具,可以在Python中迭代任何这样的对象。下一个方法将在每次迭代时在迭代工具内部被调用,StopIteration异常将被捕获以确定何时离开。

  2.为什么要使用迭代器?

  使用迭代器的一个明显的优点是一次只从一个对象中读取一段数据,不会造成过多的内存开销。

  例如,要使用readlines()方法逐行读取文件的内容,我们可以这样写:

  for line in open(test.txt )。readlines():

  打印行

  虽然这可以工作,但不是最好的方法。因为他实际上是一次性将文件加载到内存中,然后逐行打印。当文件非常大时,这种方法的内存开销非常大。

  使用文件的迭代器,我们可以这样写:

  对于open中的行( test . txt ):#使用文件迭代器

  打印行

  这是最简单快捷的写作方法。它使用迭代器一次读取下一行,而不是显式读取文件。

  3.如何使用迭代器?

  迭代器对象可以通过使用内置工厂函数iter(iterable)获得(对象如果包含iter方法可以迭代,iter方法返回一个迭代器):

  lst=范围(5)

  it=iter(lst)

  它

  使用next()方法访问下一个元素。

  it.next()

  0

  it.next()

  一个

  it.next()

  2

  处理python迭代器越界会引发StopIteration异常。

  it.next()

  三

  it .下一个

  it.next()

  四

  it.next()

  回溯(最近一次呼叫):

  文件“”中的第1行

  停止迭代

  知道了StopIteration,就可以使用迭代器来遍历:

  lst=范围(5)

  it=iter(lst)

  尝试:

  虽然正确:

  val=it.next()

  打印值

  除了StopIteration:

  及格

  对于语法糖:

  lst=范围(5)

  对于第一个中的I:

  .打印I

  .

  0

  一个

  2

  三

  四

  第二,发电机

  1.什么是发电机?

  生成器与Python中迭代器协议的概念相关联。简而言之,一个包含yield语句的函数会被专门编译成生成器。当函数被调用时,它们返回一个支持迭代器接口的生成器对象。该函数可能有一个return语句,但它的功能是产生一个值。

  2.为什么要用发电机?

  Python生成器用于支持延迟操作。所谓延迟操作,就是在需要的时候产生结果,而不是马上产生。因此,发电机还具有以下优点:-1。它节省了资源消耗。与声明序列不同,生成器在不使用时几乎不占用内存,也没有声明计算过程!-2.使用时,生成器随用随生成,用后立即释放,效率很高!-3.可以实现单线程下并发操作的处理效果。

  3.发电机怎么用?

  用斐波那契数列的例子来说明:

  def fab(最大):

  n,a,b=0,0,1

  当n最大值:

  产量b

  a,b=b,a b

  n=n 1

  #执行

  对于fab(5)中的n:

  印刷

  一个

  一个

  2

  三

  五

  该函数通过yield关键字返回结果,每次迭代在yield语句处停止,直到下一次迭代。

  生成器也是迭代器。简单来说,yield的作用就是把一个函数变成一个生成器。带yield的函数不再是普通函数,Python解释器会把它当成生成器。调用fab(5)不会执行fab函数,而是返回一个iterable对象!执行for循环时,每次都会执行fab函数内部的代码。当到达产量b时,fab函数将返回一个迭代值。在下一次迭代中,代码将从yield b的下一条语句开始继续执行,函数的局部变量看起来与上次中断执行前完全一样,因此函数将继续执行,直到再次满足yield。看起来好像一个函数在正常执行过程中被yield中断了几次,每次中断都会通过yield返回当前的迭代值。

  也可以手动调用fab(5)的next()方法(因为fab(5)是一个生成器对象,它有next()方法),这样我们可以更清楚的看到fab的执行流程:

  f=fab(3)

  f.next()

  一个

  f.next()

  一个

  f.next()

  2

  f.next()

  回溯(最近一次呼叫):

  文件“”中的第1行

  停止迭代

  4.返回的功能

  在生成器中,如果没有返回,默认会一直执行到函数完成;如果遇到return,如果在执行过程中返回,将直接抛出StopIteration终止迭代。例如:

  def read_file(fpath):

  BLOCK_SIZE=1024

  用open(fpath, rb )作为f:

  虽然正确:

  block=f.read(BLOCK_SIZE)

  如果阻止:

  屈服块

  否则:

  返回

  如果直接在file对象上调用read()方法,会导致不可预知的内存占用。一个好的方法是使用固定长度的缓冲区不断地读取文件的内容。使用yield,我们可以轻松地读取文件,而无需编写读取文件的迭代类。

  历史提交的图片或压缩文件

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

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