目录
- 1️⃣生成器
- 2️⃣为什么要用yield
- 🌱:不使用yield
- 🌱:使用yield
- 3️⃣小结
上一篇文章讲到了迭代器和可迭代对象:
- 【python知识点】你知道Iterable对象吗?什么是迭代器?
这一篇我们来看生成器。
1️⃣生成器
- 在 Python 中,使用了
yield
的函数被称为生成器(generator
)
所以生成器就是一个特殊的函数
- 一个函数用了
yield
后,返回的是一个迭代器对象,此时Python
解释器会将其视作生成器 - 也就是说生成器一定是迭代器,它也一定可迭代。
那么问题来了:什么是yield
?
简单的说,在生成器中:
yield
相当于断点,当我们调用生成器时,一旦遇到yield
, 生成器就是会暂停并保存当前所有的运行信息,并返回yield
后面的值,。- 在下一次执行
next()
方法时,生成器会从之前断点处开始,继续运行。
2️⃣为什么要用yield
我们为什么要用yield
简单来说:
- 有时,函数会返回一个列表,这个列表的大小是动态的,随着参数的大小变化而变化
- 比如斐波那契数列
- 一旦参数过大,数列的长度就会随之变大,此时的内存占用就会变得很大
- 为了节省内存,我们就想着让函数返回一个迭代器
- 当每次循环时能够一个一个得到列表中的值,而不是直接得到一整个列表
- 这个时候
yield
就起作用了- 使用了
yield
的函数,也就是生成器,就可以返回一个迭代器,在每次迭代中返回下一个值- 下次迭代时,代码从会从
yield
的下一条语句继续执行- 而函数的状态是和上次中断执行前完全一样的
- 于是函数继续执行,直到遇到 yield,再次中断
这样吧,来看看例子:
就斐波那契数列的两段代码对比,较容易地看出区别:
🌱:不使用yield
🌱:使用yield
或者使用for
循环来访问:
甚至你想这样转换为列表也行:(意义不大)
3️⃣小结
生成器就是加了yield
的函数
每次执行到有yield
的时候,会返回yield
后面的值,并且函数会暂停,直到下次调用才继续执行函数。最后迭代终止。
生成器的特点:
- 生成器对象可以使用for循环或者__next__方法,
next()
函数进行遍历- 生成器对象可以转换为列表,元组
- 需要注意的是,访问生成器对象的元素时,已经访问过的元素就无法再次访问。
- 如果想要再次访问就得重新创建一个生成器对象
使用生成器的好处:
- 节省内存空间
- 提升代码运行速度
因此,一旦我们想要节约内存资源或者提升运行效率,可以考虑使用生成器!
好了,python生成器的小知识就看到这,希望对你有所帮助