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 网络编程起步(Socket发送消息)
Sep 06 Python
python进阶教程之词典、字典、dict
Aug 29 Python
Djang中静态文件配置方法
Jul 30 Python
Python+OpenCV图片局部区域像素值处理详解
Jan 23 Python
python列表使用实现名字管理系统
Jan 30 Python
使用Python创建简单的HTTP服务器的方法步骤
Apr 26 Python
python基于Selenium的web自动化框架
Jul 14 Python
python+rsync精确同步指定格式文件
Aug 29 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
python用TensorFlow做图像识别的实现
Apr 21 Python
Python中pass的作用与使用教程
Nov 13 Python
Django项目如何正确配置日志(logging)
Apr 29 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
自己前几天写的无限分类类
2007/02/14 PHP
php下载远程文件类(支持断点续传)
2008/11/14 PHP
PHP5中虚函数的实现方法分享
2011/04/20 PHP
PHP 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
JS 实现图片直接下载示例代码
2013/07/22 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
2016/12/27 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
vue3使用vue-count-to组件的实现
2020/12/25 Vue.js
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
Python 和 JS 有哪些相同之处
2017/11/23 Python
儿童学习python的一些小技巧
2018/05/27 Python
详解python做UI界面的方法
2019/02/27 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
酒店服务与管理毕业生求职信
2013/11/02 职场文书
中专毕业生自我鉴定
2014/02/02 职场文书
后备干部考察材料
2014/02/12 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
有趣的广告词
2014/03/18 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
机电系毕业生求职信
2014/07/11 职场文书
研究生简历自我评
2015/03/11 职场文书
谢师宴家长答谢词
2015/09/30 职场文书
理解python中装饰器的作用
2021/07/21 Python
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android