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中stdout输出不缓存的设置方法
May 29 Python
Python获取文件ssdeep值的方法
Oct 05 Python
详解Python2.x中对Unicode编码的使用
Apr 03 Python
Python遍历目录并批量更换文件名和目录名的方法
Sep 19 Python
python中安装Scrapy模块依赖包汇总
Jul 02 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
python代码过长的换行方法
Jul 19 Python
强悍的Python读取大文件的解决方案
Feb 16 Python
pandas取出重复数据的方法
Jul 04 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 Python
在python中利用dict转json按输入顺序输出内容方式
Feb 27 Python
Pymysql实现往表中插入数据过程解析
Jun 02 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
用php过滤危险html代码的函数
2008/07/22 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
js实现文字滚动效果
2016/03/03 Javascript
JavaScript仿微博发布信息案例
2016/11/16 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
JS 事件机制完整示例分析
2020/01/15 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
2020/11/17 Vue.js
[06:36]吞吞映像top1
2014/06/20 DOTA
Python生成随机数组的方法小结
2017/04/15 Python
新手学python应该下哪个版本
2020/06/11 Python
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
法律工作求职自荐信
2013/10/31 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
励志演讲稿500字
2014/08/21 职场文书
住房抵押登记委托书
2014/09/27 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书