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做网页
Nov 04 Python
python fabric实现远程操作和部署示例
Mar 25 Python
Python中字典的基本知识初步介绍
May 21 Python
Python 中开发pattern的string模板(template) 实例详解
Apr 01 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
Python利用正则表达式实现计算器算法思路解析
Apr 25 Python
浅谈Pandas:Series和DataFrame间的算术元素
Dec 22 Python
python中with用法讲解
Feb 07 Python
Python 可视化神器Plotly详解
Dec 26 Python
python实现MD5进行文件去重的示例代码
Jul 09 Python
详解Python中下划线的5种含义
Jul 15 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详解
2017/11/21 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
日期 时间js控件
2009/05/07 Javascript
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
2011/05/24 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
jquery和js实现对div的隐藏和显示方法
2014/09/26 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
javascript的几种写法总结
2016/09/30 Javascript
Javascript中this关键字指向问题的测试与详解
2017/08/11 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
Python中用max()方法求最大值的介绍
2015/05/15 Python
Python实现基本线性数据结构
2016/08/22 Python
python 实现return返回多个值
2019/11/19 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
高中生家长寄语大全
2014/04/03 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
mysql sock 文件解析及作用讲解
2022/07/15 MySQL