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 相关文章推荐
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
python实现将html表格转换成CSV文件的方法
Jun 28 Python
python冒泡排序简单实现方法
Jul 09 Python
详解在Python程序中自定义异常的方法
Oct 16 Python
Python装饰器基础详解
Mar 09 Python
Python实现的多进程和多线程功能示例
May 29 Python
Python地图绘制实操详解
Mar 04 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
Sep 06 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
python基础之类属性和实例属性
Oct 24 Python
Python 统计序列中元素的出现频度
Apr 26 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+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
教你如何使用php session
2013/10/28 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
javascript编程异常处理实例小结
2015/11/30 Javascript
javascript日期比较方法实例分析
2016/06/17 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
vue2.0 better-scroll 实现移动端滑动的示例代码
2018/01/25 Javascript
jQuery访问json文件中数据的方法示例
2019/01/28 jQuery
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
JS实现多功能计算器
2020/10/28 Javascript
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
python字符串与url编码的转换实例
2018/05/10 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
零基础学python应该从哪里入手
2020/08/11 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
strlen的几种不同实现方法
2013/05/31 面试题
迟到检讨书400字
2014/01/13 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
2014年团支书工作总结
2014/11/14 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
关于成立领导小组的通知
2015/04/23 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
Python爬取某拍短视频
2021/06/11 Python
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏
python中使用redis用法详解
2022/12/24 Redis