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标准库之随机数 (math包、random包)介绍
Nov 25 Python
讲解Python中for循环下的索引变量的作用域
Apr 15 Python
详解Python如何获取列表(List)的中位数
Aug 12 Python
Python连接DB2数据库
Aug 27 Python
python fabric实现远程部署
Jan 05 Python
关于Python面向对象编程的知识点总结
Feb 14 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
Python3模拟登录操作实例分析
Mar 12 Python
pandas DataFrame的修改方法(值、列、索引)
Aug 02 Python
Django Haystack 全文检索与关键词高亮的实现
Feb 17 Python
基于Python数据分析之pandas统计分析
Mar 03 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 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 array_flip() 删除重复数组元素专用函数
2010/05/16 PHP
php学习笔记 数组遍历实现代码
2011/06/09 PHP
php入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
PHP 时间日期操作实战
2011/08/26 PHP
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
总结JavaScript中布尔操作符||与&amp;&amp;的使用技巧
2015/11/17 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
JS实现旋转木马轮播图
2020/01/01 Javascript
[01:00:44]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第三局
2016/03/04 DOTA
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
简单解决Python文件中文编码问题
2015/11/22 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
深入浅析python继承问题
2016/05/29 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
python批量处理文件或文件夹
2020/07/28 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
html5 canvas绘制网络字体的常用方法
2019/08/26 HTML / CSS
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
国贸专业的职业规划范文
2014/01/23 职场文书
幼儿园大班教学反思
2014/02/10 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
2015年前台文员工作总结
2015/05/18 职场文书
python glom模块的使用简介
2021/04/13 Python
Python自然语言处理之切分算法详解
2021/04/25 Python
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
配置Kubernetes外网访问集群
2022/03/31 Servers