目录

  • 1️⃣生成器
  • 2️⃣为什么要用yield
  • 🌱:不使用yield
  • 🌱:使用yield
  • 3️⃣小结


python 生成文件出现u_学习

上一篇文章讲到了迭代器和可迭代对象:

  • 【python知识点】你知道Iterable对象吗?什么是迭代器?

这一篇我们来看生成器。


1️⃣生成器

  • 在 Python 中,使用了 yield 的函数被称为生成器(generator

所以生成器就是一个特殊的函数

  • 一个函数用了yield后,返回的是一个迭代器对象,此时Python解释器会将其视作生成器
  • 也就是说生成器一定是迭代器,它也一定可迭代。

那么问题来了:什么是yield

python 生成文件出现u_python 生成文件出现u_02

简单的说,在生成器中:

  • yield相当于断点,当我们调用生成器时,一旦遇到yield, 生成器就是会暂停并保存当前所有的运行信息,并返回 yield 后面的值,。
  • 在下一次执行 next() 方法时,生成器会从之前断点处开始,继续运行。

2️⃣为什么要用yield

python 生成文件出现u_python_03

我们为什么要用yield

简单来说:

  • 有时,函数会返回一个列表,这个列表的大小是动态的,随着参数的大小变化而变化
  • 比如斐波那契数列
  • 一旦参数过大,数列的长度就会随之变大,此时的内存占用就会变得很大
  • 为了节省内存,我们就想着让函数返回一个迭代器
  • 当每次循环时能够一个一个得到列表中的值,而不是直接得到一整个列表
  • 这个时候yield就起作用了
  • 使用了yield的函数,也就是生成器,就可以返回一个迭代器,在每次迭代中返回下一个值
  • 下次迭代时,代码从会从 yield 的下一条语句继续执行
  • 而函数的状态是和上次中断执行前完全一样的
  • 于是函数继续执行,直到遇到 yield,再次中断

python 生成文件出现u_后端_04


这样吧,来看看例子:

就斐波那契数列的两段代码对比,较容易地看出区别:

🌱:不使用yield

python 生成文件出现u_python 生成文件出现u_05


🌱:使用yield

python 生成文件出现u_后端_06

或者使用for循环来访问:

python 生成文件出现u_生成器_07

甚至你想这样转换为列表也行:(意义不大)

python 生成文件出现u_python 生成文件出现u_08


3️⃣小结

生成器就是加了yield的函数

每次执行到有yield的时候,会返回yield后面的值,并且函数会暂停,直到下次调用才继续执行函数。最后迭代终止。

生成器的特点:

  • 生成器对象可以使用for循环或者__next__方法,next()函数进行遍历
  • 生成器对象可以转换为列表,元组
  • 需要注意的是,访问生成器对象的元素时,已经访问过的元素就无法再次访问。
  • 如果想要再次访问就得重新创建一个生成器对象

使用生成器的好处:

  • 节省内存空间
  • 提升代码运行速度

因此,一旦我们想要节约内存资源或者提升运行效率,可以考虑使用生成器!


好了,python生成器的小知识就看到这,希望对你有所帮助

python 生成文件出现u_学习_09