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使用Tkinter显示网络图片的方法
Apr 24 Python
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
Python的dict字典结构操作方法学习笔记
May 07 Python
pycharm远程调试openstack的图文教程
Nov 21 Python
使用numpy和PIL进行简单的图像处理方法
Jul 02 Python
Windows下PyCharm安装图文教程
Aug 27 Python
Python实现打砖块小游戏代码实例
May 18 Python
Python3实现汉语转换为汉语拼音
Jul 08 Python
Django调用百度AI接口实现人脸注册登录代码实例
Apr 23 Python
Python函数__new__及__init__作用及区别解析
Aug 31 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
Dec 08 Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Apr 24 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
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
php使用json_encode对变量json编码
2014/04/07 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
js表数据排序 sort table data
2009/02/18 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
jquery图片滚动放大代码分享(1)
2015/08/25 Javascript
google广告之另类js调用实现代码
2020/08/22 Javascript
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
python登录QQ邮箱发信的实现代码
2013/02/10 Python
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
解密Python中的描述符(descriptor)
2015/06/03 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
python3操作mysql数据库的方法
2017/06/23 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
Python内置模块hashlib、hmac与uuid用法分析
2018/02/12 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
python类中super() 的使用解析
2019/12/19 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
容易被忽略的Python内置类型
2020/09/03 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
入党介绍人意见2015
2015/06/01 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL