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下singleton模式的实现方法
Jul 16 Python
Python 内置函数complex详解
Oct 23 Python
Python实现的基于优先等级分配糖果问题算法示例
Apr 25 Python
python中ASCII码字符与int之间的转换方法
Jul 09 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
python读取txt文件并取其某一列数据的示例
Feb 19 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
Feb 21 Python
Python常用数据类型之间的转换总结
Sep 06 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 Python
jupyter notebook参数化运行python方式
Apr 10 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
May 11 Python
深入了解Python enumerate和zip
Jul 16 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
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
Javascript 入门基础学习
2010/03/10 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
vue.js入门教程之计算属性
2016/09/01 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
javascript读取文本节点方法小结
2016/12/15 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
vue拦截器Vue.http.interceptors.push使用详解
2017/04/22 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
2018/05/03 Javascript
详解如何从零开始搭建Express+Vue开发环境
2018/07/17 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
2019/09/19 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
Python 面向对象 成员的访问约束
2008/12/23 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
Python 多线程Threading初学教程
2017/08/22 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
Python基于Faker假数据构造库
2020/11/30 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
Viking比利时:购买办公用品
2019/10/30 全球购物
工伤事故赔偿协议书范文
2014/09/24 职场文书
门卫岗位职责
2015/02/09 职场文书
校园广播站开场白
2015/06/01 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫
Hive常用日期格式转换语法
2022/06/25 数据库