Python中yield关键字及与return的区别详解

 更新时间:2023年08月21日 09:31:20   作者:十八水  
这篇文章主要介绍了Python中yield关键字及与return的区别详解,带有 yield 的函数在 Python 中被称之为 generator生成器,比如列表所有数据都在内存中,如果有海量数据的话将会非常耗内存,想要得到庞大的数据,又想让它占用空间少,那就用生成器,需要的朋友可以参考下

1. yield 基本概念

带有 yield 的函数在 Python 中被称之为 generator(生成器)

比如列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。

简单一句话:想要得到庞大的数据,又想让它占用空间少,那就用生成器!

因此生成器的主要优点是一边循环一边计算产生数据的机制,占用内存少,缺点就是只能遍历1次

2. 代码实现斐波那契数列

斐波那契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到。

数列形式: 1,1,2,3,5,8,13,…,

def f(n):
    res = []
    num,a,b = 1,0,1
    while num <= n:
        res.append(b)
        a,b = b,a+b
        num += 1
    return res
res = f(13)
for i,b in enumerate(res):
    print(f"斐波那契数列第 %2s 个元素值是 %s"%(i+1,b))

斐波那契数列第  1 个元素值是 1
斐波那契数列第  2 个元素值是 1
斐波那契数列第  3 个元素值是 2
斐波那契数列第  4 个元素值是 3
斐波那契数列第  5 个元素值是 5
斐波那契数列第  6 个元素值是 8
斐波那契数列第  7 个元素值是 13
斐波那契数列第  8 个元素值是 21
斐波那契数列第  9 个元素值是 34
斐波那契数列第 10 个元素值是 55
斐波那契数列第 11 个元素值是 89
斐波那契数列第 12 个元素值是 144
斐波那契数列第 13 个元素值是 233

该函数在运行中占用的内存会随着参数 n 的增大而增大,如果要控制内存占用,最好不要用 List 来保存中间结果,而是通过 iterable 对象来迭代。

def f(n):
    num,a,b = 1,0,1
    while num <= n:
        print("="*30)
        yield b
        print(f"斐波那契数列第 %2s 个元素值是 %s"%(num,b))
        a,b = b,a+b
        num += 1
for i in f(1):
    print(i)

yield before
1
yield after
斐波那契数列第  1 个元素值是 1

for i in f(2):
    print(i)

 ==============================
yield before
1
yield after
斐波那契数列第  1 个元素值是 1
==============================
yield before
1
yield after
斐波那契数列第  2 个元素值是 1

通过上面2个案例看出,当执行 __next__() 时,代码就会执行到 yield 处,然后返回 yield 后面的值,如果继续调用 __next__() ,你会发现,这次执行的开始位置,是上次 yield 结束的地方,并且它还保留了上一次执行的上下文,继续向后迭代。

这就是使用 yield 的作用,在迭代生成器时,每一次执行都可以保留上一次的状态,而不是像普通方法那样,遇到 return 就返回结果,下一次执行只能再次重复上一次的流程。

普通函数用 return 返回一个值,在 Python 中还有一种函数,用关键字 yield 来返回值,这种函数叫生成器函数,函数被调用时返回一个生成器对象(注意返回的不是yield后面的值)。

3.return 与 yield 的关系梳理

  • 共同点:return和yield都用来返回值;在一次性地返回所有值场景中return和yield的作用是一样的。
  • 不同点:如果要返回的数据是通过for等循环生成的迭代器类型数据(如列表、元组),return只能在循环外部一次性地返回,yield则可以在循环内部逐个元素返回。
    • 执行顺序的区别
      • yield: 是暂停函数, 即函数返回某个值时,会停留在某个位置,返回函数值后,会在前面停留的位置继续执行,直到程序结束
      • return: 是结束函数, return返回值后不再执行函数体内代码,彻底结束。
    • 输出对象的区别
      • yield 输出的是一个生成器对象,相当于是一个容器,想取什么数据就取出什么,每次调用只返回一个数值
      • return 返回的是一个元组(默认), 只会返回一个值
    • 占用资源不同
      • 使用return空间开销比较大,尤其是操作巨量数据的时候,操作一个大列表时间开销也会得不偿失
      • yield 生成器相比 return一次返回所有结果的优势:①反应更迅速 ②更节省空间 ③使用更灵活

到此这篇关于Python中yield关键字及与return的区别详解的文章就介绍到这了,更多相关Python的yield与return内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决pyinstaller打包运行程序时出现缺少plotly库问题

    解决pyinstaller打包运行程序时出现缺少plotly库问题

    这篇文章主要介绍了解决pyinstaller打包运行程序时出现缺少plotly库问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • python实现查询苹果手机维修进度

    python实现查询苹果手机维修进度

    这篇文章主要介绍了python实现查询苹果手机维修进度,这里用到了最重要的一个知识是python中如何设置cookie支持以及开启调试模式,需要的朋友可以参考下
    2015-03-03
  • python登录WeChat 实现自动回复实例详解

    python登录WeChat 实现自动回复实例详解

    在本篇内容里小编给大家整理的是关于python登录WeChat 实现自动回复的相关实例内容以及知识点总结,有兴趣的朋友们参考下。
    2019-05-05
  • Python实现Word文档样式批量处理

    Python实现Word文档样式批量处理

    这篇文章主要为大家详细介绍了如何利用Python中的python-docx非标准库实现word文档样式批量处理,文中示例代码讲解详细,感兴趣的可以了解一下
    2022-05-05
  • python sklearn数据预处理之正则化详解

    python sklearn数据预处理之正则化详解

    数据的预处理是数据分析,或者机器学习训练前的重要步骤,这篇文章主要为大家详细介绍了sklearn数据预处理中正则化的相关知识,需要的可以参考下
    2023-10-10
  • pymysql 开启调试模式的实现

    pymysql 开启调试模式的实现

    这篇文章主要介绍了pymysql 开启调试模式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 使用Python的OpenCV模块识别滑动验证码的缺口(推荐)

    使用Python的OpenCV模块识别滑动验证码的缺口(推荐)

    这篇文章主要介绍了使用Python的OpenCV模块识别滑动验证码的缺口,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Pycharm配置远程SSH服务器实现(切换不同虚拟环境)

    Pycharm配置远程SSH服务器实现(切换不同虚拟环境)

    本文主要介绍了Pycharm配置远程SSH服务器实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 详解python中flask_caching库的用法

    详解python中flask_caching库的用法

    这篇文章主要介绍了详解python中flask_caching库的用法,可以在一定的时间内直接返回结果而不是每次都需要计算或者从数据库中查找。flask_caching插件就是提供这种功能的神器,需要的朋友可以参考下
    2023-05-05
  • python经典100题之皮球掉落的几种解法

    python经典100题之皮球掉落的几种解法

    这篇文章主要给大家介绍了关于python经典100题之皮球掉落的几种解法,这个问题相信不少人都可以从网络上找到相对应的答案本文提供了3种解法,需要的朋友可以参考下
    2023-11-11

最新评论