<python学习笔记>:生成器

181 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

1️⃣生成器

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

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

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

  • 也就是说生成器一定是迭代器,它也一定可迭代。

那么问题来了:什么是yield

简单的说,在生成器中:

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

2️⃣为什么要用yield

我们为什么要用yield

简单来说:

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

来看看一个例子:

就斐波那契数列的两段代码对比,可以看出区别在哪:

🌱:不使用yield

image.png

🌱:使用yield

image.png

或者使用for循环来访问:

image.png

甚至你想这样转换为列表也行:

image.png


3️⃣小结

生成器就是加了yield的函数

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

生成器的特点:

  • 生成器对象可以使用for循环或者__next__方法next()函数进行遍历

  • 生成器对象可以转换为列表,元组

  • 需要注意的是,访问生成器对象的元素时,已经访问过的元素就无法再次访问。

  • 如果想要再次访问就得重新创建一个生成器对象

使用生成器的好处:

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

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


写在最后,今天的笔记就到这里,欢迎大家到评论区一起讨论!

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