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中处理unchecked未捕获异常实例
Jan 17 Python
Python修改MP3文件的方法
Jun 15 Python
Python实现Sqlite将字段当做索引进行查询的方法
Jul 21 Python
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
Python实现的读取电脑硬件信息功能示例
May 30 Python
在Pycharm中使用GitHub的方法步骤
Jun 13 Python
解决Django一个表单对应多个按钮的问题
Jul 18 Python
如何使用Python破解ZIP或RAR压缩文件密码
Jan 09 Python
pycharm通过ssh连接远程服务器教程
Feb 12 Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 Python
Numpy数组的广播机制的实现
Nov 03 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_SELF,SCRIPT_NAME,REQUEST_URI区别
2014/12/24 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
php实现支付宝当面付(扫码支付)功能
2018/05/30 PHP
PHP7内核之Reference详解
2019/03/14 PHP
js setattribute批量设置css样式
2009/11/26 Javascript
jQuery EasyUI API 中文文档 - NumberBox数字框
2011/10/13 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
2017/02/27 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
python中的多线程实例教程
2014/08/27 Python
Python基于回溯法解决01背包问题实例
2017/12/06 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
python使用udp实现聊天器功能
2018/12/10 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
pycharm软件实现设置自动保存操作
2020/06/08 Python
Python Charles抓包配置实现流程图解
2020/09/29 Python
浅析Python的命名空间与作用域
2020/11/25 Python
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
西安启天科技有限公司网络工程师面试题笔试题
2016/06/12 面试题
大学校园毕业自我鉴定
2014/01/15 职场文书
施工安全责任书
2014/04/14 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android