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二分法实现实例
Nov 21 Python
Django的session中对于用户验证的支持
Jul 23 Python
Python简单获取自身外网IP的方法
Sep 18 Python
python 判断网络连通的实现方法
Apr 22 Python
通过shell+python实现企业微信预警
Mar 07 Python
Python中常用的8种字符串操作方法
May 06 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
简单了解Python读取大文件代码实例
Dec 18 Python
Python龙贝格法求积分实例
Feb 29 Python
python关于变量名的基础知识点
Mar 03 Python
matplotlib教程——强大的python作图工具库
Oct 15 Python
图文详解matlab原始处理图像几何变换
Jul 09 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中MD5函数使用实例代码
2008/06/07 PHP
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
PHP遍历二维数组的代码
2011/04/22 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
js报$ is not a function 的问题的解决方法
2014/01/20 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)
2017/09/15 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
爬山算法简介和Python实现实例
2014/04/26 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
python文件写入write()的操作
2019/05/14 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
Python实现串口通信(pyserial)过程解析
2019/09/25 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
python创建学生成绩管理系统
2019/11/22 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
SQL Server面试题
2016/10/17 面试题
葡萄牙语专业个人求职信
2013/12/10 职场文书
法律专业学生的自我评价
2014/02/07 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
央视元宵晚会主持串词
2014/03/25 职场文书
合同协议书格式
2014/04/18 职场文书
三八妇女节寄语
2015/02/27 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书