十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
迭代器:在其内部实现yield方法和next方法的对象。可迭代对象:在类内部实现一个iter方法,并返回一个迭代器。
北京网站制作公司哪家好,找创新互联建站!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联建站于2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联建站。
异步迭代器:实现了__aiter__()和__anext__()方法的对象,必须返回一个awaitable对象。async_for支持处理异步迭代器的
__anext__()方法返回的可等待对象,直到引发一个stopAsyncIteration异常,这个改动由PEP 492引入。
异步可迭代对象:可在async_for语句中被使用的对象,必须通过它的__aiter__()方法返回一个asynchronous_iterator(异步迭代器). 这个改动由PEP 492引入。
示例: 不能直接写在普通方法或者暴露在外面。必须写在协程函数,任意协程函数均可。
什么是迭代
可以直接作用于for循环的对象统称为可迭代对象(Iterable)。
可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator)。
所有的Iterable均可以通过内置函数iter()来转变为Iterator。
对迭代器来讲,有一个__next ()就够了。在你使用for 和 in 语句时,程序就会自动调用即将被处理的对象的迭代器对象,然后使用它的 next__()方法,直到监测到一个StopIteration异常。
L = [1,2,3] [x**2 for x in L] [1, 4, 9] next(L) Traceback (most recent call last): File "stdin", line 1, in module TypeError: 'list' object is not an iterator I=iter(L) next(I) 1 next(I) 2 next(I) 3 next(I) Traceback (most recent call last): File "stdin", line 1, in module StopIteration
上面例子中,列表L可以被for进行循环但是不能被内置函数next()用来查找下一个值,所以L是Iterable。L通过iter进行包装后设为I,I可以被next()用来查找下一个值,所以I是Iterator。
是不一样的。
iter()是一个内置函数,功能是通过可以迭代对象生成一个迭代器。
比如:iter([1,2,3,4])
__iter__则是个魔法方法,需要配合__next__方法使用,构造一个迭代对象
一种特殊的数据结构,以对象形式存在 i1 = l1.__iter__() i1 = iter(l1)
可迭代对象:
序列: list、str、tuple
非序列: dict、file
自定义类: __iter__()、 __getitem__()
注意:
若要实现迭代器,需要在类中定义next()方法
要使迭代器指向下一个对象,则使用成员函数 next()
i1.next()
当没有元素时,会引发StopIteration异常 for循环可用于任何可迭代对象
例: l1 = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'] i1 = l1.__iter__() il.next() 'Sun'
il.next() 'Mon'
generator都输出生成一个iterator对象,再由iterator遍历出元素。迭代器就是逐个以“下一个”的形式返回元素的函数。
比如range(10)是生成器,生成一个显示为"range(0,10)"的迭代器对象,可以进一步由for等遍历输出0,1,2,3..10
又比如对于遍历字典的iter(d)都是生成器函数
都在不同的层面,无所谓好坏...生成器产生不同的迭代器,迭代器直接产生元素,适合各自情况的就用...
有必要区分generator生成器函数(对象)和generator expression生成器表达式
比如:
range()生成器函数
for i in range(10)生成器表达式
[i+1 for i in range(10)]对生成器表达式的"列表分解"
另,贴图中由于断章取义,这里的“生成器自身”应该是有特指某个生成器,而不是所有生成器的共性