python | 探寻python生成器

简介: python | 探寻python生成器

image.png


面试官: 听说你熟悉python,那么你能简单阐述一下python的装饰器、生成器以及迭代器么?

我: emm, 我不清楚,我只是了解过python最基本的代码。

上述是弟弟前段时间去面试运维开发,遇到的问题,emmm,运维是一个很杂的职业,在小公司,总结一句话就是宽而浅,痛定思痛,决定来了解一下python特性,于是乎,就有了这篇文章。


这边文章,我们将介绍python生成器,使用环境为: Python 3.6.8


image.png

如果你还没有了解过迭代器,建议查看迭代器的文章:《python | 你知道for...in是底层原理是什么样的么?探寻python迭代器》



什么是python生成器


上一篇文章我们介绍了迭代器,而生成器是一种特殊的迭代器,它内部也有__iter__方法和__next__方法,在终止生成器的时候,还是会抛StopIteration异常以此来退出循环,只不过相比于迭代器,生成器还有特性会保存“中间值”,下次运行的时候,还会借助这个“中间值”来操作。

生成器的关键字是yield,我们下面来写一个最简单的生成器。

image.png

粗看代码,可能会觉着这个是个啥啊,为啥不直接用range来生成,偏偏要用yield,哎,不急,我们接着往下看为什么需要生成器,或者说,生成器解决了什么问题。



为什么需要python生成器


在说明这个问题之前,我们先来写一个需求,输出 0——10000000 以内的数据,而后运行查看导出内存运行截图。


调用python程序内存信息辅助说明


这里可以借助pythonmemory_profiler模块来检测程序内存的占用情况。

安装memory_profiler库:

image.png

使用方法很简单,在需要检测的函数或者是代码前添加@profile装饰器即可,例如:

image.png


生成.dat文件

image.png

导出图示,可以使用

image.png


python案例代码


以下2个程序,都是输出0—9999999之间的数据,不同的是,第一个程序是使用range而后给appendlist中,第二个则是使用迭代器来生成该数据。

main.py程序

image.png


main_2.py程序image.png


运行程序

代码也有了,就可以按照上述来运行一下程序,并且导出内存信息

image.png


运行后内存信息查看

main.py 运行内存图

image.png



main_2.py 运行内存图


image.png


如上2张对比图,当我们将数据叠加进列表,再输出的时候,占用内存接近400M,而使用迭代器来计算下一个值内存仅使用16M。


通过上述案例,我们应该知道为什么要使用生成器了吧。



python生成器原理


由于生成器表达式yield语句涉及到了python解释权内部机制,所以很难查看其源码,很难获取其原理,不过我们可以利用yield的暂停机制,来探寻一下生成器。


可以编写如下代码:

image.png


运行后效果如下

image.png


通过上述实例,再结合下面这段生成器的运行过程,会加深对生成器的感触。


python遇到yield语句时,会记录当前函数的运行状态,并且暂停执行,将结果抛出。会持续等待下一次调用__next__方法,该方法调用后,会恢复函数的运行,直至下一个yield语句或者函数结束,执行到最后没有yield函数可执行的时候,会抛StopIteration来标志生成器的结束。



生成器表达式


python中,生成器除了写在函数中,使用yield返回之外,还可以直接使用生成器表达式,额。。。可能很抽象,但是你看下面这段代码,你就明白了。


image.png


其中,代码(i for i in [1,2,3,4,5])就等同于printNums函数,其类型都是生成器,我们可以使用type打印出来看下。

改下代码,输出结果如下:

image.png


好了,生成器表达式其实不复杂,暂时就讲到这里。



总结


该篇文章是介绍python生成器,所谓的生成器其实也是一个特殊的迭代器,其底层依然有__iter____next__方法,不仅如此,它还可以将函数“暂停”,当遇到_next__后,又从上一次暂停的地方开始执行,既然是一个特殊的迭代器,所以还是会引发StopIteration异常。而后介绍了为什么需要生成器,距了一个例子,分别打印0——n个数,一个使用生成器 还有一个 使用list,当然list会更加耗费内存,最后介绍了生成器原理 以及 生成器表达式。



相关文章
|
2月前
|
数据采集 存储 大数据
深入理解Python中的生成器及其应用
本文详细介绍了Python中的生成器概念,包括其定义、工作原理、常见用法以及在实际项目中的应用。通过具体示例和代码分析,帮助读者更好地理解和运用生成器,提高编程效率。
|
27天前
|
存储 Python
Python代码优化使用生成器(Generators)
【7月更文挑战第22天】
34 5
|
7天前
|
大数据 Python
Python理解与实现生成器 (Generators)
Python理解与实现生成器 (Generators)
7 0
|
1月前
|
存储 大数据 数据处理
优化Python中的数据处理效率:使用生成器提升性能
在Python编程中,有效的数据处理是提升性能和效率的关键。本文将探讨如何利用生成器(generator)优化数据处理过程,通过实例展示生成器如何在内存效率和执行速度上带来显著提升。
|
1月前
|
Python
python解包迭代器或生成器
【7月更文挑战第1天】
20 3
|
1月前
|
大数据 数据处理 Python
Python的生成器(Generator)
【7月更文挑战第2天】
22 1
|
2月前
|
数据处理 Python
从零开始学迭代器生成器:打造高效、易读的Python代码
从零开始学迭代器生成器:打造高效、易读的Python代码
|
1月前
|
Python
python解包迭代器或生成器
【7月更文挑战第1天】
19 1
|
2月前
|
IDE Linux 数据处理
探索Linux中的`pydoc`命令:Python文档生成器的力量
`pydoc`是Linux上Python的文档生成和查看工具,尤其对数据科学家有价值。它从docstring生成模块、函数和类的文档,提供快速API参考。主要特点包括易用性、支持标准库和第三方库、跨平台。命令行示例:`pydoc pandas` 查看库文档,`pydoc numpy.array` 查看类详情,`pydoc -k 关键字` 进行搜索。使用时注意正确安装Python,编写清晰的docstring,并结合IDE以提升效率。
|
2月前
|
算法 大数据 数据处理
深入理解Python中的生成器及其应用
生成器是Python中一种强大的工具,能够简化代码、节省内存并提高程序的效率。本文将详细介绍生成器的概念、语法以及在实际项目中的应用场景,帮助开发者更好地利用这一特性。