Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例


Posted in Python onOctober 12, 2019

本文实例讲述了Python 生成器,迭代,yield关键字,send()传参给yield语句操作。分享给大家供大家参考,具体如下:

demo.py(生成器,yield关键字):

# 生成器是一个特殊的迭代器。可以用for...in遍历。
# 带有yield关键字的函数,不再是一个函数,而是一个生成器模板。调用该模板会返回一个生成器对象。
def create_num(all_num):
  a, b = 0, 1
  current_num = 0
  while current_num < all_num:
    yield a  # 当遍历create_num返回的生成器时,会阻塞在yield的位置。每次遍历出的值都是yield后的值。
    a, b = b, a+b
    current_num += 1
  # return '返回值'  # 迭代结束后,继续调用next会抛StopIteration异常。 可以通过该异常来获取该返回值。 (异常.value 就是该返回值)
# create_num"函数"中有一个yield,那么create_num不再是一个函数。调用时,会返回一个生成器对象。
obj = create_num(10) # 只会返回一个生成器对象(可用于遍历)。并不会执行create_num中的代码,只有遍历(迭代)时才会执行create_num中的代码。
ret = next(obj) # 迭代的本质就是调用对象的__next__函数。 会返回yield后面的值,并阻塞代码,直到再次调用next(或迭代)才会解阻塞。
print(ret)  # 当create_num中的代码执行完后,迭代就会结束。
ret = next(obj) # 如果迭代结束后,继续调用next,那么会抛异常。 可以通过异常来获取create_num return的值。
print(ret)  # 可以通过异常来判断是否迭代结束。
obj2 = create_num(2) # obj2和obj的遍历迭代互不影响。
ret = next(obj2)
print(ret)
# for num in obj:
#  print(num)

运行结果:

0
1
0

demo.py(通过异常判断迭代是否结束):

def create_num(all_num):
  a, b = 0, 1
  current_num = 0
  while current_num < all_num:
    yield a 
    a, b = b, a+b
    current_num += 1
  return "ok...."  # 通过迭代结束后的异常来获取该返回值
obj = create_num(10) # 返回一个生成器对象。并不会执行create_num中的代码,只有遍历迭代obj时才会执行create_num中的代码
while True:
  try:
    ret = next(obj) # 迭代结束后继续调用next会抛异常。
    print(ret)
  except Exception as ret:
    print(ret.value) # 通过异常获取create_num return的值。
    break

运行结果:

0
1
1
2
3
5
8
13
21
34
ok....

demo.py(send()迭代生成器,传参给yield语句):

def create_num(all_num):
  a, b = 0, 1
  current_num = 0
  while current_num < all_num:
    ret = yield a  # send的参数就是yield语句的返回值。
    print(">>>ret>>>>", ret)  # hahahha
    a, b = b, a+b
    current_num += 1
obj = create_num(10)
# obj.send(None) # send一般不会放到第一次启动(迭代)生成器,如果非要这样做 那么传递None (否则会抛异常)
ret = next(obj) # 第一次遍历迭代生成器时,建议使用next函数。
print(ret)
# send与next作用相同,都是进行下一次迭代的意思。 (都会解阻塞yield关键字)
# send可以传递参数表示yield语句的返回值。 而next不能传递参数。
ret = obj.send("hahahha") # 会先将"hahahha"参数当做yield语句的返回值,然后再解阻塞yield 遍历。(因此不推荐第一次遍历时使用send传参) 
print(ret)

运行结果:

0
>>>ret>>>> hahahha
1

创建生成器的简单方式:

Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python生成日历实例解析
Aug 21 Python
python的paramiko模块实现远程控制和传输示例
Oct 13 Python
python多行字符串拼接使用小括号的方法
Mar 19 Python
解决pycharm运行时interpreter为空的问题
Oct 29 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
python自动识别文本编码格式代码
Dec 26 Python
python音频处理的示例详解
Dec 23 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 Python
matplotlib更改窗口图标的方法示例
Feb 03 Python
Python基于爬虫实现全网搜索并下载音乐
Feb 14 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
Oct 12 #Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 #Python
Python 迭代,for...in遍历,迭代原理与应用示例
Oct 12 #Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
Oct 12 #Python
Python Collatz序列实现过程解析
Oct 12 #Python
python logging日志模块原理及操作解析
Oct 12 #Python
Python爬虫之urllib基础用法教程
Oct 12 #Python
You might like
codeigniter数据库操作函数汇总
2014/06/12 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
JS焦点图切换,上下翻转
2011/05/12 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
jQuery中[attribute!=value]选择器用法实例
2014/12/31 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
2015/07/05 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
JQuery中解决重复动画的方法
2016/10/17 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
2017/02/20 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
python中readline判断文件读取结束的方法
2014/11/08 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
python字符串格式化方式解析
2019/10/19 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
舒适的豪华鞋:Taryn Rose
2018/05/03 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
2015年教师节感言
2015/08/03 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
python爬虫请求库httpx和parsel解析库的使用测评
2021/05/10 Python
httpclient调用远程接口的方法
2022/08/14 Java/Android