文章源自查看博客:python中yield的用法详解——最简单,最清晰的解释_冯爽朗的博客-CSDN博客_python yield

自己整理思路使用,希望大家去看原作者的博客,讲解超级清晰且易理解!!

目录

1 yield搭配next()使用

2 yield搭配send()使用

3 使用yield的优点


1 yield搭配next()使用

在调用包含yield的函数时,在第一次调用时可以将yield看作return,就是返回yield之后跟的值;

再次调用包含yield函数时,将函数看作是一个生成器,是接着上一次调用运行结束的地方执行的。

具体理解看代码:

def foo():print("starting...")while True:res = yield 4print("res:",res)g = foo()
print(next(g))
print("*"*20)
print(next(g))

第一步:定义foo()函数;

第二步:定义生成器g;-- 这里不会调用foo()函数,直到运行到next()时,才真正的调用函数;

第三步: 执行定义的生成器g, 首先执行print,输出 starting...,然后进入while循环,执行res = yield 4, 这是第一次调用该函数,因此yield在这里看作是 return, 然后返回4,相当于该函数执行完成;

第四步: 执行 print("*"*20);

第五步:再次执行定义的生成器,这次执行是接着上一次执行结束的地方开始执行,也就是从 res = yield 4的地方开始执行,此时是进行赋值操作,因为原本的4已经在上一步被返回出去,此时的赋值操作,res应该被赋值为None;

第六步,然后接着向下执行,返回res的值,然后再进行while循环,当作return 返回4,执行结束;

因此上述代码的执行结果为:

starting...
4
********************
res: None
4

2 yield搭配send()使用

send()是发送一个值到yield处;

具体代码:

def foo():print("starting...")while True:res = yield 4print("res:",res)g = foo()
print(next(g))
print("*"*20)
print(g.send(7))

与第一个例子不同的是,将最后一行换掉了;

执行步骤:

第一步:定义foo()函数;

第二步:定义生成器g;-- 这里不会调用foo()函数,直到运行到next()时,才真正的调用函数;

第三步: 执行定义的生成器g, 首先执行print,输出 starting...,然后进入while循环,执行res = yield 4, 这是第一次调用该函数,因此yield在这里看作是 return, 然后返回4,相当于该函数执行完成;

第四步: 执行 print("*"*20);

第五步:再次执行定义的生成器,这次执行是接着上一次执行结束的地方开始执行,也就是从 res = yield 4的地方开始执行,此时是进行赋值操作,因为这次使用的为send(7), 实际上是将7发送到yield处,因此res便被赋值为7;

第六步,然后接着向下执行,返回res的值,然后再进行while循环,当作return 返回4,执行结束;

执行结果:

starting...
4
********************
res: 7
4

3 使用yield的优点

节省内存;

具体列子:

for n in range(1000):a=n

使用 range(1000),会产生长度为1000的list,占用内存大;

使用yield实现上述方法:

def foo(num):print("starting...")while num<1000:num=num+1yield num
for n in foo(0):print(n)

此时占用内存便很小,不需要存1000个数;

python - yield详解相关推荐

  1. Python yield 详解(嚼碎了喂你,一篇精通,无需再看其他文章)

    Python yield详解 文章目录 Python yield详解 由"斐波那契"深入理解yield案例 第一个版本 第二个版本 问题的引出 第三个版本 第四个版本 总结 细化总 ...

  2. python yield 详解

    首先,如果你还没有对yield有个初步分认识,那么你先把yield看做"return",这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值, ...

  3. Python保留字详解

    python的保留字并不多,一共33个 ​ ​1.False if q=False:#Flase 2.None 表示该值是一个空对象,空值是Python里一个特殊的值,用None表示.None不能理解 ...

  4. python区块链开发_Fabric区块链Python开发详解

    Hyperledger Fabric是最流行的联盟区块链平台.Fabric区块链Python开发详解课程 涵盖Fabric区块链的核心概念.Fabric网络搭建.Node链码开发.Python应用开发 ...

  5. python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

  6. 【python】详解类class的继承、__init__初始化、super方法

    原文链接; https://blog.csdn.net/brucewong0516/article/details/79121179?utm_medium=distribute.pc_relevant ...

  7. python与golang_Golang与python线程详解及简单实例

    Golang与python线程详解及简单实例 在GO中,开启15个线程,每个线程把全局变量遍历增加100000次,因此预测结果是 15*100000=1500000. var sum int var ...

  8. python 最小二乘法_最小二乘法及其python实现详解

    最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出).它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可以简便地求得 ...

  9. 【python】详解multiprocessing多进程-Pool进程池模块(二)

    [python]详解multiprocessing多进程-process模块(一) [python]详解multiprocessing多进程-Pool进程池模块(二) [python]详解multip ...

最新文章

  1. 史上讲的最好的Java NIO与IO的区别与应用
  2. 逻辑模型设计步骤-粒度层次划分
  3. hadoop搭建在Ubuntu16.04上
  4. 使用antd UI组件有感
  5. frameset和iframe的区别
  6. 本周两场直播丨通过源码了解openGauss多线程架构;Oracle数据库索引分裂详解。...
  7. v540 检测的问题
  8. mysql binlog解析 c_解析MYSQL BINLOG二进制格式(9)--infobin解析binlog帮助文档
  9. Redis是单线程的以及Redis为什么这么快
  10. 英美安全机构称俄罗斯正在暴力攻击全球数百家组织机构
  11. 在mininet中测试TCP、UDP带宽并作图
  12. 全球编程厉害的14位大佬
  13. [MAC]用beamoff给VMware的Mac OS X 10.10.x加速
  14. 打开小米随身wifi的无线网卡功能
  15. 计算机网络按拓扑结构可以划分为,计算机网络按拓扑结构分为哪些
  16. 解决fatal: No configured push destination.
  17. 长治南垂驾校科目二经验总结
  18. 电子设计教程39:软启动电路-观察浪涌电流
  19. 四川职业技术学院linux,2019年四川交通职业技术学院单招中职(信息技术一类)专业技能测试大纲...
  20. H - Unloaded Die

热门文章

  1. 量化交易ctp接口是什么以及有什么用?
  2. 戴尔服务器R730内部结构评测
  3. 鸿蒙系统同心联盟UOS百科,困难重重,华为依然积极发展自主操作系统,同时布局鸿蒙和UOS...
  4. 数据分析二、pandas库数据处理
  5. 《内网安全攻防:渗透测试实战指南》读书笔记(五):域内横向移动分析及防御
  6. 思科模拟器实验4:静态路由,默认路由配置
  7. cpp 读写word的库
  8. 全球及中国装备制造产业投资战略及产销需求预测报告2021-2027年版
  9. 【博客园客户端】博客园Android客户端正式发布
  10. 【转贴】何人不起故园情