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编写一个简单的Lisp解释器的教程
Apr 03 Python
python字符串过滤性能比较5种方法
Jun 22 Python
Python实现读写INI配置文件的方法示例
Jun 09 Python
python 剪切移动文件的实现代码
Aug 02 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
Oct 11 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
pyqt5、qtdesigner安装和环境设置教程
Sep 25 Python
Python中sorted()排序与字母大小写的问题
Jan 14 Python
TensorBoard 计算图的可视化实现
Feb 15 Python
Python ORM框架Peewee用法详解
Apr 29 Python
scrapy头部修改的方法详解
Dec 06 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 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 特殊字符处理函数
2008/09/05 PHP
php生成随机密码的三种方法小结
2010/09/04 PHP
php 抽象类的简单应用
2011/09/06 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
NodeJS框架Express的模板视图机制分析
2011/07/19 NodeJs
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
2016/02/01 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
浅谈JS的基础类型与引用类型
2016/09/13 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
python计算圆周率pi的方法
2015/07/11 Python
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python使用微信SDK实现的微信支付功能示例
2017/06/30 Python
Python+OpenCv制作证件图片生成器的操作方法
2019/08/21 Python
Python列表切片常用操作实例解析
2019/12/16 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
pandas 数据类型转换的实现
2020/12/29 Python
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
员工评语大全
2014/01/19 职场文书
社区工作感言
2014/02/21 职场文书
优质服务演讲稿
2014/05/14 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
运动会通讯稿600字
2015/07/20 职场文书