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 安装virtualenv和virtualenvwrapper的方法
Jan 13 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
python实现求解列表中元素的排列和组合问题
Mar 15 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
Python OpenCV实现视频分帧
Jun 01 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
Django 开发调试工具 Django-debug-toolbar使用详解
Jul 23 Python
python实现桌面托盘气泡提示
Jul 29 Python
python web框架 django wsgi原理解析
Aug 20 Python
selenium中get_cookies()和add_cookie()的用法详解
Jan 06 Python
解决Python spyder显示不全df列和行的问题
Apr 20 Python
利用Python过滤相似文本的简单方法示例
Feb 03 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下使用iconv需要注意的问题
2010/11/20 PHP
解析thinkphp基本配置 convention.php
2013/06/18 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
ASP SQL防注入的方法
2008/12/25 Javascript
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
Angular的MVC和作用域
2016/12/26 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
2019/05/09 Javascript
了解重排与重绘
2019/05/29 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
2020/08/07 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
JavaScript 中的六种循环方法
2021/01/06 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
python实现bitmap数据结构详解
2014/02/17 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
Python3.5 创建文件的简单实例
2018/04/26 Python
python适合人工智能的理由和优势
2019/06/28 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
Python class的继承方法代码实例
2020/02/14 Python
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
进程的查看和调度分别使用什么命令
2015/03/25 面试题
市场开发与营销专业求职信
2013/12/31 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
反腐倡廉标语
2014/06/24 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
党课培训心得体会
2014/09/02 职场文书
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python
CSS link与@import的区别和用法解析
2023/05/07 HTML / CSS