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用fork来创建子进程注意事项
Jul 03 Python
Python执行时间的计算方法小结
Mar 17 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
Python中optparser库用法实例详解
Jan 26 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 Python
TensorFlow实现Batch Normalization
Mar 08 Python
Python日期时间对象转换为字符串的实例
Jun 22 Python
对Python3中dict.keys()转换成list类型的方法详解
Feb 03 Python
python将pandas datarame保存为txt文件的实例
Feb 12 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
Mar 06 Python
python查询MySQL将数据写入Excel
Oct 29 Python
python des,aes,rsa加解密的实现
Jan 16 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
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
PHP教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
php判断字符串在另一个字符串位置的方法
2014/02/27 PHP
PHP中的插件机制原理和实例
2014/07/08 PHP
PHP会话控制:Session与Cookie详解
2014/09/27 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
让广告代码不再影响你的网页加载速度
2006/07/07 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
Javascript 实现计算器时间功能详解及实例(二)
2017/01/08 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
Openlayers实现距离面积测量
2020/09/28 Javascript
Python操作SQLite简明教程
2014/07/10 Python
Python中在for循环中嵌套使用if和else语句的技巧
2016/06/20 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
实习教师自我鉴定
2013/12/12 职场文书
职工运动会感言
2014/02/07 职场文书
坚定理想信念心得体会
2014/03/11 职场文书
2015年化验员工作总结
2015/04/10 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
PostgreSQL之连接失败的问题及解决
2023/05/08 PostgreSQL