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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。