Python生成器generator和yield关键字的使用

 更新时间:2024年09月12日 13:36:30   作者:江南野栀子  
生成器是一种特殊的迭代器,可以通过列表推导式的修改或者使用yield关键字来创建,生成器函数能够在迭代时动态产生值,而不是一次性生成所有值,这有助于节省内存,yield关键字使函数执行暂停并保存当前状态,下次调用时从停止处继续执行

Python生成器generator和yield关键字

生成器 generator 是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

实现生成器有两种方式:

第一:将列表推导式种的 [] 改成 ()

a=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
   ["a","b","c","d","e","f","g","h","i","j"],
  ["A","B","C","D","E","F","G","H","I","J"]]
res=(tmp for ele in a for tmp in ele )
type(res)

可以看出 res 已经是一个生成器了

那么使用生成器有什么用途呢?

1)迭代器能做的,它也能做,例如 next() 方法

2) 也可以使用 for 循环

3)最重要的是,它是随用随取的,不会像列表生成式 [] 那样一下子全生成,只是在迭代时候才会生成(虽然对于用户而言,遍历时候可能感受不到)。

第二:使用 yield 关键字

yield 关键字是很特殊的,一个函数里有了 yield 后,执行到 yield 就会停住,下载再次调用时继续从上一次中断的位置继续执行代码并返回值。所以生成器函数即使是有无限循环也没关系,它需要算到多少就会算多少,不需要就不往下算。

请注意,有 yield 关键字的函数不是生成器,是该函数的运行结果是一个生成器!

先说说最简单的情况

我先创建一个函数 f ,依次生成100以内的数, 使用 type 函数可以看到这是一个 function

def f():
    i=0
    yield i
    while(i<100):
        i+=1
        yield i

那么执行这个函数呢

res=f()type(res)

这个函数执行的结果是一个生成器!

对这个返回的生成器,可以使用 next() 方法

使用生成器解决实际问题,例如常见的斐波拉契数列。

斐波拉契数列:指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

1) 一个简单的无线循环的 fib 生成器

def fib():
    a=[0,1]
    yield a[0]
    yield a[1]
    while True:
        tmp=a[0]+a[1]
        a=[a[1],a[0]+a[1]]
        yield tmp

运行结果是

2)一个有限循环的(n 次数)的 fib 生成器

def fib(n):
    i=0
    a,b=0,1
    yield a
    while(i<n):
        a,b=b,a+b
        i+=1
        yield a

运行结果如下,当迭代次数小于等于 n 时候,可以输出相应的数列数,大于 n 时候则报错。

3)斐波拉契数列的一个变形,即返回包含前 n 个 数的列表

理论上1)2) 都可以实现,但是有一个额外要求,即不需要反复去从 1 计算起。

使用 1) 中无限循环函数

%%time
# 一个简单的无线循环的,生成fib 数列的生成器
def fib():
    a=[0,1]
    yield a[0]
    yield a[1]
    while True:
        tmp=a[0]+a[1]
        a=[a[1],a[0]+a[1]]
        yield tmp

# 只要前 n 个 fib 数字
i=0
n=10
res=[]
gen=fib()
# 简单的 while 循环 因为使用next 不需要重复计算
while(i<n):
    res.append(next(gen))
    i+=1
res

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python 给图像添加透明度(alpha通道)

    python 给图像添加透明度(alpha通道)

    这篇文章主要介绍了python 给图像添加透明度,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • python如何输入根号

    python如何输入根号

    这篇文章主要介绍了python如何输入根号,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Django的性能优化实现解析

    Django的性能优化实现解析

    这篇文章主要介绍了Django的性能优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python的进程及进程池详解

    Python的进程及进程池详解

    这篇文章主要为大家介绍了Python的进程及进程池,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • Python正则表达式常用函数总结

    Python正则表达式常用函数总结

    这篇文章主要介绍了Python正则表达式常用函数,结合实例形式总结分析了Python正则表达式常用函数功能、使用方法及相关注意事项,需要的朋友可以参考下
    2017-06-06
  • 遗传算法python版

    遗传算法python版

    这篇文章主要为大家详细介绍了python实现遗传算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 详解Python如何利用Pandas与NumPy进行数据清洗

    详解Python如何利用Pandas与NumPy进行数据清洗

    许多数据科学家认为获取和清理数据的初始步骤占工作的 80%,花费大量时间来清理数据集并将它们归结为可以使用的形式。本文将利用 Python 的 Pandas和 NumPy 库来清理数据,需要的可以参考一下
    2022-04-04
  • python实现Simhash算法

    python实现Simhash算法

    这篇文章主要介绍了python实现Simhash算法,simhash算法用来进行文本比对的,simhash包含分词、hash、加权、合并、降维五大步骤,下文围绕更多相关资料介绍,需要的小伙伴可以参考一下
    2022-02-02
  • Python实现Windows键盘鼠标自动化模拟器

    Python实现Windows键盘鼠标自动化模拟器

    这篇文章主要为大家详细介绍了一个基于Python的Windows键盘鼠标自动化模拟器,适合自动化测试、游戏辅助等场景,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-10-10
  • python灰色预测法的具体使用

    python灰色预测法的具体使用

    灰色系统理论认为对既含有已知信息又含有未知或非确定信息的系统进行预测,本文就介绍了python灰色预测法的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2022-03-03

最新评论