python迭代器和生成器

  • 时间:
  • 浏览:6

到目前为止,您肯能肯能注意到大多数容器对象都可不能能使用 for 一句话:

python生成器

Generator 是一个多多多多用于创建迭代器的简单而强大的工具。 它们的写法例如 标准的函数,但当它们要返回数据都有使用 yield 一句话。 每次对生成器调用 next() 时,它会从上次拖累位置恢复执行(它会记住上次执行一句话时的所有数据值)。 显示如可非常容易地创建生成器的示例如 下:

脚注

[1] 地处一个多多多多例外。 模块对象一个多多多多多秘密的只读属性 dict__,它返回用于实现模块命名空间的字典;__dict 是属性但都有全局名称。 显然,使用很多 将违反命名空间实现的抽象,应当仅被用于事后调试器例如 的场合。

看了python迭代器协议的幕后机制,我能 的类换成迭代器行为就很容易了。 定义一个多多多多 __iter__() 法律最好的办法来返回一个多多多多含晒 __next__() 法律最好的办法的对象。 肯能类已定义了 __next__(),则 __iter__() 可不能能简单地返回 self:

很多简单的生成器可不能能写成简洁的表达式代码,所用语法例如 列表推导式,将外层为圆括号而非方括号。 很多 表达式被设计用于生成器将立即被外层函数所使用的状况。 生成器表达式相比详细的生成器织密凑但较不灵活,相比等效的列表推导式则更为节省内存。

例如 :

生成器表达式

除了会自动创建法律最好的办法和保存多线程 状况,当生成器终结时,它们都有自动引发 StopIteration。 哪几个社会形态结合在共同,使得创建迭代器能与编写常规函数一样容易。

从前关键社会形态在于局部变量和执行状况会在每次调用之间自动保存。 这使得该函数相比使用 self.index 和 self.data 很多 实例变量的法律最好的办法更易编写且更为清晰。

很多 访问风格清晰、简洁又方便。 迭代器的使用非常普遍并使得 Python 成为一个多多多多统一的整体。 在幕后,for 一句话会调用容器对象中的 iter()。 该函数返回一个多多多多定义了 __next__() 法律最好的办法的迭代器对象,该法律最好的办法将逐一访问容器中的元素。 当元素用尽时,__next__() 将引发 StopIteration 异常来通知终止 for 循环。 我能 使用 next() 内置函数来调用 __next__() 法律最好的办法;很多 例子显示了它的运作法律最好的办法:

可不能能用生成器来完成的操作同样可不能能用前一节所描述的基于类的迭代器来完成。 但生成器的写法更为紧凑,肯能它会自动创建 __iter__() 和 __next__() 法律最好的办法。