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中__call__用法实例
Aug 29 Python
Python控制多进程与多线程并发数总结
Oct 26 Python
在python3环境下的Django中使用MySQL数据库的实例
Aug 29 Python
代码讲解Python对Windows服务进行监控
Feb 11 Python
python 函数内部修改外部变量的方法
Dec 18 Python
python opencv摄像头的简单应用
Jun 06 Python
浅谈pyqt5在QMainWindow中布局的问题
Jun 21 Python
Django框架中序列化和反序列化的例子
Aug 06 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
Nov 21 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
Apr 19 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
Apr 20 Python
Python做图像处理及视频音频文件分离和合成功能
Nov 24 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
一个用于网络的工具函数库
2006/10/09 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
解析javascript 实用函数的使用详解
2013/05/10 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
2015/11/13 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
React Native日期时间选择组件的示例代码
2018/04/27 Javascript
详解各版本React路由的跳转的方法
2018/05/10 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
浅谈python日志的配置文件路径问题
2018/04/28 Python
python使用pygame框架实现推箱子游戏
2018/11/20 Python
Python字典的概念及常见应用实例详解
2019/10/30 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
物流管理专业应届生求职信
2013/11/21 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
2014年消防工作总结
2014/11/21 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python
Python中使用subprocess库创建附加进程
2021/05/11 Python
用python画城市轮播地图
2021/05/28 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python