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文件夹与文件的操作实现代码
Jul 13 Python
python非递归全排列实现方法
Apr 10 Python
Python排序搜索基本算法之归并排序实例分析
Dec 08 Python
利用pyinstaller将py文件打包为exe的方法
May 14 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
对python 调用类属性的方法详解
Jul 02 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
Python中*args和**kwargs的区别详解
Sep 17 Python
Jupyter notebook快速入门教程(推荐)
May 18 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
Jan 05 Python
Opencv 图片的OCR识别的实战示例
Mar 02 Python
Python中异常处理用法
Nov 27 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
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
linux下安装php的memcached客户端
2014/08/03 PHP
php header函数的常用http头设置
2015/06/25 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
Prototype的Class.create函数解析
2011/09/22 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
使用jQuery UI库开发Web界面的简单入门指引
2016/04/22 Javascript
JavaScript实现打开链接页面的方式汇总
2016/06/02 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
Angular工具方法学习
2016/12/26 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
详解Nodejs内存治理
2018/05/13 NodeJs
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
BootStrap前端框架使用方法详解
2020/02/26 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
Python常用的日期时间处理方法示例
2015/02/08 Python
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
安装python及pycharm的教程图解
2019/10/10 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
Chemist Warehouse官方海外旗舰店:澳洲第一连锁大药房
2017/08/25 全球购物
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
日期和时间问题
2015/01/04 面试题
绩效专员岗位职责
2013/12/02 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
大学活动总结格式
2014/04/29 职场文书
一体化教学实施方案
2014/05/10 职场文书
副处级干部考察材料
2014/05/17 职场文书
教师师德承诺书2016
2016/03/25 职场文书