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中mechanize库的简单使用示例
Jan 10 Python
Python 抓取动态网页内容方案详解
Dec 25 Python
python使用多线程不断刷新网页的方法
Mar 31 Python
在Python中使用全局日志时需要注意的问题
May 06 Python
Python在Console下显示文本进度条的方法
Feb 14 Python
Python django实现简单的邮件系统发送邮件功能
Jul 14 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
Dec 21 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
Mar 27 Python
Django-xadmin+rule对象级权限的实现方式
Mar 30 Python
Python实现动态循环输出文字功能
May 07 Python
深入理解Python 多线程
Jun 16 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
Sep 25 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
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
php array_merge下进行数组合并的代码
2008/07/22 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
2011/06/24 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
2018/05/28 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
javascript之学会吝啬 精简代码
2010/04/25 Javascript
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
轮播图组件js代码
2016/08/08 Javascript
微信开发 js实现tabs选项卡效果
2016/10/28 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
2019/02/18 Javascript
jQuery表单校验插件validator使用方法详解
2020/02/18 jQuery
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
python中单例常用的几种实现方法总结
2018/10/13 Python
对Python3中dict.keys()转换成list类型的方法详解
2019/02/03 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
2019/03/26 Python
pytorch 更改预训练模型网络结构的方法
2019/08/19 Python
pycharm下pyqt4安装及环境配置的教程
2020/04/24 Python
Python中Yield的基本用法
2020/10/18 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
2015年员工试用期工作总结
2015/05/28 职场文书
校长新学期致辞
2015/07/30 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS
springboot入门 之profile设置方式
2022/04/04 Java/Android