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