Python快速入门之迭代器和生成器!最详细的教程…

2018-07-20 05:58:52来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

幸运的是,在当今时代,各种市场因素已将内存、磁盘甚至 CPU 容量的价格统统压缩至原先难以想象的低价。但与此同时,诸如大数据、AI 和认知计算这类蓬勃发展的应用,正在以超快的速度推升我们对于这些资源的需求。令人感觉有点啼笑皆非的是,当计算资源较充足时,开发人员了解如何降低资源耗用量来保持竞争力却变得愈加重要。

是不是非常重要,私信小编007即可获取数十套PDF哦!

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

Python 的 for 语句在所谓的 迭代器 上运行。迭代器是可重复调用以生成一系列值的对象。如果 in 关键字后的值尚未成为迭代器,那么 for 会尝试将其转换为迭代器。内置 range 函数就是可以转换为迭代器的一个示例。它可生成一系列数字, for 循环会对这些项进行迭代,依次将每个项分配到变量 ix 。

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

此时会打印 0,这与您的预期相符。接下来再次输入 print(next(r)) ,将会打印 1,以此类推。继续在此行中输入。在这一点上,值得高兴的是,对于大部分系统,只需按 Python 解释器上的向上箭头即可检索最近使用的命令,然后按 Enter 键即可重复执行命令,您甚至还可以在按 Enter 键之前随意对其进行调整。

在此情况下,最终将得到类似如下的结果:

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

它会打印消息“That's all folks!” for 语句使用 StopIteration 异常来确定何时退出循环。

其他可迭代对象

range 只是可转换为迭代器的一种对象。以下解释器会话演示了如何将各种标准类型解释为迭代器。

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

对于列表或元组,这是非常直接的过程。字典仅对其键进行迭代,当然无法保证顺序。对于集合也无法保证迭代顺序,即使在此示例中,来自迭代器的首个项碰巧也是用于构造集合的元组中的首个项。字符串会对其字符进行迭代。所有此类对象都称为 可迭代对象 。

正如您可能想到的,并非每个 Python 对象都可转换为迭代器。

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

以上是一个自动的生成器函数,因为其主体中包含至少一条 yield 语句。这一细微差别是将常规函数转变为生成器函数的唯一因素,这有点棘手,因为常规函数与生成器函数之间存在巨大差异。

以类似任何其他函数的方式来调用生成器函数:

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

生成器函数自变量

生成器函数接受自变量,这些自变量可传递到生成器主体中。粘贴以下生成器函数。

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

我从一个生成器函数创建两个生成器对象。随后,我可从其中任一对象获取下一个项,并留意每个对象独立暂挂和恢复的方式。它们在各个方面都彼此独立,包括进入 StopIteration 的方式。

务必仔细研究此会话,直至您确实掌握整个过程为止。一旦掌握了这一过程,您也就真正对生成器有了基础的认识,并明白了它们如此强大的原因所在。

请记住,您还可以使用所有常用的定位和关键字自变量功能。

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

weathermaker 函数使用了许多常用编程功能,并且还解释了生成器的一些很有趣的特性。生成的项数并不固定。可能会与天数一样少,也可能会因连续晴天或雨天而添加的注释导致数量增加。这些都是在不同条件分支下生成的。

运行此清单后,应显示如下内容:

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

请花些时间自行尝试一下,首先为 volatility 和 days 传入不同的值,然后对生成器函数代码本身进行调整。试验是确保您真正了解生成器运作方式的最佳途径。

我希望这个有趣的示例通过生成器的一些强大功能,可以激发您的想像力。当然无需生成器也可以编写上述代码,但这种方法不仅更易于表达、通常更高效,并且除了清单底部的简单循环之外,还能通过其他有趣的方法来复用 weathermaker 生成器。

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

简而言之,只要您使用括号将 for 表达式括起,那么它就会变成一个生成器表达式。生成的对象即为生成器对象,在此情况下此对象被分配至 words 。有时,您最后会使用某些更有趣的 Python 内容来适应此类表达式。在此情况下,我对字典使用 get 方法,此方法会查找一个键,但允许我指定未找到此键时返回的默认值。我要求系统返回 item 的替换值(如果能找到),否则仅按现状返回 item 。

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

以上两个示例之间的实际差异主要在于,第一个示例中创建的列表自创建之后便存在,会占用所有必要内存来存储其值。生成器表达式不会使用这么多的存储空间,而是处于暂挂状态,当对其进行迭代时才恢复,就像生成器函数的主体一样。事实上,它允许您按需获取数据,而不是预先为您存储所有数据。

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

在此系列教程中,有时我将从生成器构建列表,以便于快速展示。

过滤和链接

您可以在生成器表达式中使用简单的条件从输入迭代器中过滤掉某些项。以下示例可生成从 1 到 20 之间不是 2 和 3 的倍数的所有数字。它使用易用的 math.gcd 函数,返回这两个整数的最大公约数。例如,如果某个数字和 2 的最大公约数为 1,那么此数字不是 2 的倍数。

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

 

学习使用迭代器和生成器是掌握 Python 的一个重要步骤,而另一个重要步骤就是学习使用标准库中为处理迭代器而提供的众多神奇的工具。这将是本系列中下一个教程的主题。

是不是非常重要,进群:125240963  即可获取数十套PDF哦!

Python快速入门之迭代器和生成器!最详细的教程!祝早日入门!

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:python-全栈开发-前方高能-内置函数

下一篇:sort、sorted高级排序-Python3.7 And 算法<七>