Python生成器next方法和send方法区别详解


Posted in Python onMay 30, 2020

yield的语法规则是:

在yield这里暂停函数执行,并返回yield后面表达式的值(默认为None),直到被next()再次调用时,从上次暂停的yield代码处继续往下执行。当没有可继续next()时,抛出异常,该异常可被for循环处理。

def fib(n):

def fib(n):
  a, b = 0, 1
  i = 0
  while i < n:
    yield b
    a, b = b, a+b
    i += 1

if __name__ == '__main__':
  f = fib(10)
  for item in f:
    print(item)

python中,含有yield关键字的对象就是一个生成器,每次调用next方法时会执行到yield后面的语句,然后返回yield后面代码块的执行结果

def foo():
  bar_a = yield 1     # bar_a是语句块(yield 1)的返回值,默认为None
  bar_b = yield bar_a
  yield "最后一个值,再迭代就要报StopIteration了"

f = foo()          # 创建生成器,此时没有执行foo()里的任何语句
print(next(f))       # 从foo()里进入,一直执行到(yield 1)处,此时变量bar_a还没有创建
print(next(f))       # 先将语句块(yield 1)的返回值赋值个bar_a,此时bar_a的值是None。
              # 然后执行到语句块(yield bar_a),bar_b也还没有被创建
print(next(f)

>>>1
>>>None
>>>最后一个值,再迭代就要报StopIteration了

send()

def foo():
  bar_a = yield 1
  bar_b = yield bar_a
  yield "最后一个值,再迭代就要报StopIteration了"

f = foo()
print(f.send(None))    # 和next(f)的效果一模一样
print(f.send("my lover")) # 覆盖yield 1语句的返回值
print(next(f))

>>>1
>>>my lover
>>>最后一个值,再迭代就要报StopIteration了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
python实现百度关键词排名查询
Mar 30 Python
python下os模块强大的重命名方法renames详解
Mar 07 Python
Selenium元素的常用操作方法分析
Aug 10 Python
Python异步操作MySQL示例【使用aiomysql】
May 16 Python
Pyqt QImage 与 np array 转换方法
Jun 27 Python
Python使用sklearn库实现的各种分类算法简单应用小结
Jul 04 Python
python实现文件的分割与合并
Aug 29 Python
python实现大战外星人小游戏实例代码
Dec 26 Python
基于Python测试程序是否有错误
May 16 Python
Python Matplotlib简易教程(小白教程)
Jul 28 Python
Python安装并操作redis实现流程详解
Oct 13 Python
Python新手学习标准库模块命名
May 29 #Python
Django Path转换器自定义及正则代码实例
May 29 #Python
Python新手如何理解循环加载模块
May 29 #Python
Python新手如何进行闭包时绑定变量操作
May 29 #Python
如何理解python中数字列表
May 29 #Python
Django实现前台上传并显示图片功能
May 29 #Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
May 29 #Python
You might like
php设计模式 Facade(外观模式)
2011/06/26 PHP
PHP中session变量的销毁
2014/02/27 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
微信支付开发订单查询实例
2016/07/12 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
2011/11/30 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
Vue-Router模式和钩子的用法
2018/02/28 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
2020/05/27 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
Python脚本实现网卡流量监控
2015/02/14 Python
基于python指定包的安装路径方法
2018/10/27 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
你对IPv6了解程度
2016/02/09 面试题
高职助产应届生自荐信
2013/09/24 职场文书
银行介绍信范文
2014/01/10 职场文书
2014元旦晚会策划方案
2014/02/19 职场文书
爬山的活动方案
2014/08/16 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
劳资员岗位职责
2015/02/13 职场文书
自我推荐信怎么写
2015/03/24 职场文书
运动会表扬稿范文
2015/05/05 职场文书
Java无向树分析 实现最小高度树
2022/04/09 Javascript