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 相关文章推荐
Java多线程编程中ThreadLocal类的用法及深入
Jun 21 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
python导入csv文件出现SyntaxError问题分析
Dec 15 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
Jan 27 Python
python3调用R的示例代码
Feb 23 Python
PyCharm设置护眼背景色的方法
Oct 29 Python
Python使用sorted对字典的key或value排序
Nov 15 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
np.dot()函数的用法详解
Jan 17 Python
appium+python adb常用命令分享
Mar 06 Python
pytorch中的 .view()函数的用法介绍
Mar 17 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
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
Zend Framework实现将session存储在memcache中的方法
2016/03/22 PHP
实例讲解php数据访问
2016/05/09 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
JavaScript立即执行函数的三种不同写法
2014/09/05 Javascript
js实现多选项切换导航菜单的方法
2015/02/06 Javascript
AngularJS基础学习笔记之指令
2015/05/10 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
Angular通过指令动态添加组件问题
2018/07/09 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
Python随机数用法实例详解【基于random模块】
2017/04/18 Python
python实现图书管理系统
2018/03/12 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
尤为Wconcept中国官网:韩国设计师品牌服饰
2019/01/10 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
2013/07/30 面试题
Java里面StringBuilder和StringBuffer有什么区别
2016/06/06 面试题
党校培训思想汇报
2013/12/30 职场文书
办公室副主任职责范本
2014/03/08 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
七一建党节慰问信
2015/02/14 职场文书
求职自荐信该如何书写?
2019/06/24 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL