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的Django框架中的模版继承
Jul 16 Python
python删除文本中行数标签的方法
May 31 Python
python利用pandas将excel文件转换为txt文件的方法
Oct 23 Python
Python使用combinations实现排列组合的方法
Nov 13 Python
Django框架模板的使用方法示例
May 25 Python
python Pillow图像处理方法汇总
Oct 16 Python
解决tensorflow添加ptb库的问题
Feb 10 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
Jun 15 Python
python db类用法说明
Jul 07 Python
Python第三方库安装缓慢的解决方法
Feb 06 Python
基于python定位棋子位置及识别棋子颜色
Jul 26 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
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
PHP封装函数实现生成随机的字符串验证码
2017/01/24 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
用javascript连接access数据库的方法
2006/11/17 Javascript
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
可以文本显示的公告栏的js代码
2007/03/11 Javascript
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
原生JS实现手动轮播图效果实例代码
2018/11/22 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
python通过函数属性实现全局变量的方法
2015/05/16 Python
Python 详解基本语法_函数_返回值
2017/01/22 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
党校培训思想汇报
2013/12/30 职场文书
创建卫生先进单位实施方案
2014/03/10 职场文书
星级党支部申报材料
2014/05/31 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
军训新闻稿范文
2015/07/17 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL