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脚本暴力破解栅栏密码
Oct 19 Python
Django与JS交互的示例代码
Aug 23 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
Python里字典的基本用法(包括嵌套字典)
Feb 27 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 Python
详解Python 中sys.stdin.readline()的用法
Sep 12 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
Jan 14 Python
浅谈python中频繁的print到底能浪费多长时间
Feb 21 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
Mar 16 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
Python是怎样处理json模块的
Jul 16 Python
Python 微信公众号文章爬取的示例代码
Nov 30 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 XML操作的各种方法解析(比较详细)
2010/06/17 PHP
php4与php5的区别小结(配置异同)
2011/12/20 PHP
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
PHP实现的AES双向加密解密功能示例【128位】
2018/09/03 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
Javascript 面向对象特性
2009/12/28 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
2017/02/13 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
Laravel admin实现消息提醒、播放音频功能
2019/07/10 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
Python解决鸡兔同笼问题的方法
2014/12/20 Python
详解Python爬虫的基本写法
2016/01/08 Python
Python和Go语言的区别总结
2019/02/20 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
中国旅游网站:同程旅游
2016/09/11 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
Shell编程面试题
2012/05/30 面试题
家长会主持词
2014/03/26 职场文书
心理健康日活动总结
2014/05/08 职场文书
大型会议策划方案
2014/05/17 职场文书
材料成型及控制工程专业求职信
2014/06/19 职场文书
学习三严三实心得体会
2014/10/13 职场文书
关于学习的决心书
2015/02/05 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android