Python中的迭代器与生成器高级用法解析
2020-06-25 07:45:19 来源:易采站长站 作者:易采站长站整理
... print '--yield raised %r--' % e
... else:
... print '--yield returned %s--' % ans
>>> it = g()
>>> next(it)
--start--
--yielding 0--
0
>>> it.send(11)
--yield returned 11--
--yielding 1--
1
>>> it.throw(IndexError)
--yield raised IndexError()--
--yielding 2--
2
>>> it.close()
--closing--
注意: next还是__next__?
在Python 2.x中,接受下一个值的迭代器方法是next,它通过全局函数next显式调用,意即它应该调用__next__。就像全局函数iter调用__iter__。这种不一致在Python 3.x中被修复,it.next变成了it.__next__。对于其它生成器方法——send和throw情况更加复杂,因为它们不被解释器隐式调用。然而,有建议语法扩展让continue带一个将被传递给循环迭代器中send的参数。如果这个扩展被接受,可能gen.send会变成gen.__send__。最后一个生成器方法close显然被不正确的命名了,因为它已经被隐式调用。
链式生成器
注意: 这是PEP 380的预览(还未被实现,但已经被Python3.3接受)
比如说我们正写一个生成器,我们想要yield一个第二个生成器——一个子生成器(subgenerator)——生成的数。如果仅考虑产生(yield)的值,通过循环可以不费力的完成:
subgen = some_other_generator()
for v in subgen:
yield v
然而,如果子生成器需要调用send()、throw()和close()和调用者适当交互的情况下,事情就复杂了。yield语句不得不通过类似于前一章节部分定义的try…except…finally结构来保证“调试”生成器函数。这种代码在PEP 380中提供,现在足够拿出将在Python 3.3中引入的新语法了:
yield from some_other_generator()
像上面的显式循环调用一样,重复从some_other_generator中产生值直到没有值可以产生,但是仍然向子生成器转发send、throw和close。
您可能感兴趣的文章:深入讲解Python中的迭代器和生成器python的迭代器与生成器实例详解Python中生成器和迭代器的区别详解举例讲解Python中的迭代器、生成器与列表解析用法Python3中的列表生成式、生成器与迭代器实例详解老生常谈Python之装饰器、迭代器和生成器解析Python中的生成器及其与迭代器的差异Python 中迭代器与生成器实例详解python生成器,可迭代对象,迭代器区别和联系浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器python生成器/yield协程/gevent写简单的图片下载器功能示例python 协程中的迭代器,生成器原理及应用实例详解













闽公网安备 35020302000061号