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 相关文章推荐
Flask框架实现给视图函数增加装饰器操作示例
Jul 16 Python
解决Python一行输出不显示的问题
Dec 03 Python
深入学习python多线程与GIL
Aug 26 Python
分享8点超级有用的Python编程建议(推荐)
Oct 13 Python
python中的Elasticsearch操作汇总
Oct 30 Python
python socket 聊天室实例代码详解
Nov 14 Python
Python autoescape标签用法解析
Jan 17 Python
Python @property装饰器原理解析
Jan 22 Python
PyTorch的torch.cat用法
Jun 28 Python
python -v 报错问题的解决方法
Sep 15 Python
python re的findall和finditer的区别详解
Nov 15 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 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
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
php设置session值和cookies的学习示例
2014/03/21 PHP
基于PHP生成简单的验证码
2016/06/01 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
javascript实现的listview效果
2007/04/28 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
2015/08/21 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
Python获取邮件地址的方法
2015/07/10 Python
Python的Django框架中的表单处理示例
2015/07/17 Python
Python Flask-web表单使用详解
2017/11/18 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
python画环形图的方法
2020/03/25 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
大学生冰淇淋店商业计划书
2014/01/14 职场文书
教育技术职业规划范文
2014/03/04 职场文书
大一新生期末自我评价
2014/09/12 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
商场营业员岗位职责
2015/04/14 职场文书
小学教师党员承诺书
2015/04/27 职场文书
升学宴家长答谢词
2015/09/29 职场文书
python中的装饰器该如何使用
2021/06/18 Python
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python