立即学习:https://edu.csdn.net/course/play/19711/255579?utm_source=blogtoedu

1.yield = return + generator

yield是一个返回的是一个生成器对象,是通过next函数一次一次地进行函数地迭代来获取结果的,而return函数则是将结果返回后,不再与函数有关系了

# #单步生成
#
def gererator():#由于yield的存在,使得这个函数是一个生成器print('[gererator]yield执行前')yield 'iterm = 1'#执行到这行代码后,会将值返回,并且暂停在此,等待下一次next或者send函数的调用,再次从这里继续运行,注意最后一定需要将结果返回,否则会报错StopIteration,因为生成器本身就是一个迭代,停止了迭代就会报错print('[gererator]yield执行后')def main():res = gererator()#获取生成器对象print(res)#<generator object gererator at 0x0000018503A15930>print(next(res))#运行生成器函数,打印返回的数据if __name__ == '__main__':main()
'''
<generator object gererator at 0x0000016197635930>
[gererator]yield执行前
iterm = 1'''# #错误的示例
def gererator():#由于yield的存在,使得这个函数是一个生成器print('[gererator]yield执行前')yield 'iterm = 1'#执行到这行代码后,会将值返回,并且暂停在此,等待下一次next或者send函数的调用,再次从这里继续运行,注意最后一定需要将结果返回,否则会报错StopIteration,因为生成器本身就是一个迭代,停止了迭代就会报错print('[gererator]yield执行后')def main():res = gererator()#获取生成器对象print(res)#<generator object gererator at 0x0000018503A15930>print(next(res))#运行生成器函数,打印返回的数据print(next(res))#再次打印,会报错,因为上面一行代码已经将yield运行结束了,所以会使得这行再次运行时,没有返回,导致停止迭代,出错print('*****************')if __name__ == '__main__':main()'''从运行的结果可以看出,两次使用next函数,第一次运行函数,遇到yield停止,第二次继续在yield处开始运行,但是因为没有返回,所以代码停在了生成器中,即停止了迭代,进而在main函数中的 print('*****************')代码也没有执行就直接报错了<generator object gererator at 0x0000019059B95480>
Traceback (most recent call last):
[gererator]yield执行前File "C:/Users/jinlin/Desktop/python_further_study/基础回顾(生成器、迭代器等)/生成器(yield).py", line 39, in <module>
iterm = 1main()
[gererator]yield执行后File "C:/Users/jinlin/Desktop/python_further_study/基础回顾(生成器、迭代器等)/生成器(yield).py", line 35, in mainprint(next(res))#再次打印,会报错,因为上面一行代码已经将yield运行结束了,所以会使得这行再次运行时,没有返回,导致停止迭代,出错
StopIteration
'''# 错误的示例修正+send函数使用,send函数可以向生成器中发送数据,由yield接收
def gererator():#由于yield的存在,使得这个函数是一个生成器print('[gererator]yield执行前')res = yield 'iterm = 1'#执行到这行代码后,会将值返回,并且暂停在此,等待下一次next或者send函数的调用,再次从这里继续运行,注意最后一定需要将结果返回,否则会报错StopIteration,因为生成器本身就是一个迭代,停止了迭代就会报错print('[gererator]yield执行后')print('[generetor]%s'%res)yielddef main():res = gererator()#获取生成器对象print(res)#<generator object gererator at 0x0000018503A15930>print(next(res))#运行生成器函数,打印返回的数据res.send("【main】这是由send发送给生成器的数据")print('*****************')if __name__ == '__main__':main()'''
<generator object gererator at 0x0000021F62065480>
[gererator]yield执行前
iterm = 1
[gererator]yield执行后
[generetor]【main】这是由send发送给生成器的数据
*****************
'''import time
#指定迭代的最大次数,可以减少内存的占用
def gererator(maxnum):#由于yield的存在,使得这个函数是一个生成器for i in range(1,maxnum):print('************start*****************')yield ('迭代数据%s'%i)print('************end*****************\n\n')time.sleep(0.5)def main():for i in gererator(50):print(i)if __name__ == '__main__':main()
'''
************start*****************
迭代数据1
************end*****************************start*****************
迭代数据2
************end*****************************start*****************
迭代数据3
************end*****************************start*****************
迭代数据4
************end*****************************start*****************
迭代数据5
************end*****************************start*****************
迭代数据6
************end*****************************start*****************
迭代数据7
************end*****************************start*****************
迭代数据8
************end*****************************start*****************
迭代数据9
************end*****************************start*****************
迭代数据10
************end*****************
'''

2.yield from itermable:通过可迭代对象来构造生成器,可迭代对象一般有:列表、元组、生成器等

def iterator(n=101):#迭代器,生成一个列表,作为可迭代的对象a = []for i in range(1,n):a.append(i)return adef generator():#生成器,根据列表这个可迭代对象来创建生成器a_list = iterator()yield from a_listdef main():#从生成器中打印出数据for i in generator():print(i,end='、')if __name__ == '__main__':main()

学习笔记(37):Python实战编程-yield实现生成器相关推荐

  1. 学习笔记(53):Python实战编程-Checkbutton

    立即学习:https://edu.csdn.net/course/play/19711/343116?utm_source=blogtoedu 复选框Checkbutton:与单选框是相对的,一些用法 ...

  2. 学习笔记(58):Python实战编程-Combobox

    立即学习:https://edu.csdn.net/course/play/19711/343121?utm_source=blogtoedu 1.下拉列表Combobox:与Listbox相比,下拉 ...

  3. 学习笔记(57):Python实战编程-Treeview

    立即学习:https://edu.csdn.net/course/play/19711/343120?utm_source=blogtoedu 1.树状结构Treeview:分为树状折叠式列表和列表显 ...

  4. 学习笔记(55):Python实战编程-Scrollbar

    立即学习:https://edu.csdn.net/course/play/19711/343118?utm_source=blogtoedu 1.滚动条ScrollBar: 当列表内容项的内容过多时 ...

  5. 学习笔记(54):Python实战编程-Scale

    立即学习:https://edu.csdn.net/course/play/19711/343117?utm_source=blogtoedu 1.滑块组件Scale: 用于定义一定范围的区间,如音量 ...

  6. 学习笔记(52):Python实战编程-Radiobutton

    立即学习:https://edu.csdn.net/course/play/19711/343115?utm_source=blogtoedu 单选钮:Radiobutton 1)相对于大部分组件而言 ...

  7. 学习笔记(51):Python实战编程-ListBox

    立即学习:https://edu.csdn.net/course/play/19711/343113?utm_source=blogtoedu listbox 知识点: 1)创建listbox: se ...

  8. 学习笔记(49):Python实战编程-place布局

    立即学习:https://edu.csdn.net/course/play/19711/343111?utm_source=blogtoedu 1.place布局: 1)最灵活的布局方式,是根据坐标点 ...

  9. 学习笔记(48):Python实战编程-grid布局

    立即学习:https://edu.csdn.net/course/play/19711/343110?utm_source=blogtoedu grid布局:根据表结构进行的布局,索引为0行0列开始, ...

最新文章

  1. Error: unterminated string literal。通常原因是输出字符str中包含换行符导致的。
  2. 如何使用TSQL获取数据库中所有表的列表?
  3. JSP FORM 提交
  4. 考研英语一2011年真题模考总结
  5. 安装好机器学习环境的虚拟机_虚拟环境之外的数据科学是弄乱机器的好方法
  6. .NET5即至,你准备好了吗?
  7. LeetCode【119. 杨辉三角 II】
  8. python中使用Opencv进行人脸检测
  9. layedit-jfinal后台获取
  10. Microsoft SQL Server 自定义函数整理大全
  11. 使用ildasm获取源代码_有什么比ILDasm好? ILSpy和dnSpy是反编译.NET代码的工具
  12. 云计算分布式架构简介
  13. 熊出没之奇幻空间里面的机器人图片_《熊出没之奇幻空间》小铁COCO智能机器人玩具...
  14. 计算机垃圾清理指令,win7电脑清理垃圾的运行命令代码是什么
  15. 国际数棋(图形界面、网络版、AI)
  16. 京东一元抢宝系统的数据库架构优化
  17. jsp:session的跟踪方式
  18. 电商快递电子面单对接使用方法
  19. 联盟 (Alliances)
  20. 打卡记录根据排班表每人每日排班上下班时间自动获取结果打卡记录是属于那是区间

热门文章

  1. 启动tomcat出现too many connections的原因及解决方法
  2. 10-多写一个@Autowired导致程序崩了
  3. 几种链表的优缺点比较
  4. DataTable 转为ListT集合
  5. thinkphp5 内置接口开发与使用
  6. iOS微博项目(七)发微博和定位
  7. 深搜——数字划分问题
  8. [转贴]Cocos2d-x3.2与OpenGL渲染总结(一)Cocos2d-x3.2的渲染流程
  9. SeekBar和RatingBar
  10. 一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(9)--基于表单库的仪表板...