《Python数据科学指南》——1.9 生成一个迭代器和生成器

    xiaoxiao2024-03-25  125

    本节书摘来自异步社区《Python数据科学指南》一书中的第1章,第1.9节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    1.9 生成一个迭代器和生成器

    上一节,我们了解了什么是迭代器,这一节我们来讨论如何生成一个迭代器。

    1.9.1 准备工作

    生成器提供了清晰的语法,能够依次访问一个序列,并不需要使用__iter__和next()这两个函数。我们也不用写一个类了。请注意,生成器和可迭代这两者才能制造一个迭代器。

    1.9.2 操作方法

    如果你理解了前面小节里的推导,我们下面的示例你也能明白,在这个示例中,我们有一个生成器推导。回忆一下,我们曾经用下面的方式来进行一个元组推导,并得到了一个生成器对象。

    SimpleCounter = (x**2 for x in range(1,10)) tot = 0 for val in SimpleCounter: tot+=val print tot

    1.9.3 工作原理

    很明显,上面的代码片段将算出给定范围的数的平方和,本例中的范围是从1到9(Python的range函数是右侧结束),使用生成器,我们创建了一个名为SimpleCounter的迭代器,我们用它在for循环中循序访问那些潜在的数据。请注意我们现在没有使用iter()函数,代码十分清晰,我们成功地用一种优雅的方式重建了我们的旧SimpleCounter类。

    1.9.4 更多内容

    让我们看看如何使用yield语句来创建一个生成器。

    def my_gen(low,high): for x in range(low,high): yield x**2 tot = 0 for val in my_gen(1,10): tot+=val print tot

    在上面的代码中,my_gen()函数就是一个生成器,我们使用yield语句来返回一个序列输出。

    在前面的小节中,我们提到过生成器和可迭代两者才能制造一个迭代器,下面我们通过使用iter函数调用生成器来验证一下。

    gen = (x**2 for x in range(1,10)) for val in iter(gen): print val

    在我们进入下一节“使用可迭代对象”之前,强调一下使用生成器的注意事项,当我们完成对序列的访问时,就该立刻结束,不要再试图获取更多的数据。

    使用生成器对象时,我们只能访问序列一次。

    最新回复(0)