一、概述

  之前只是介绍生成器,那有些同学就说了,这个生成器除了能节省资源,提高工作效率,但是我们再哪些场景下可以用呢?在哪些地方可以体现出它的价值呢?下面我们来逐一解答这些疑问。

二、生成器执行原理

1、执行原理

def consumer(name):print("%s 准备吃包子啦!"%name)while True:baozi = yieldprint("包子[%s]来了,被[%s]吃了"%(baozi,name))c = consumer("zhangqigao")
c.__next__()#输出
zhangqigao 准备吃包子啦!

如果我再加一个__next__()方法会有什么效果?

def consumer(name):print("%s 准备吃包子啦!"%name)while True:baozi = yieldprint("包子[%s]来了,被[%s]吃了"%(baozi,name))c = consumer("zhangqigao")
c.__next__()
c.__next__()#输出
zhangqigao 准备吃包子啦!
包子[None]来了,被[zhangqigao]吃了

很明显,第一种情况没有执行"print("包子[%s]来了,被[%s]吃了"%(baozi,name))",这段代码,接下来我们就来调试一下。

2、调试

第一步:生成一个生成器

第二步:执行第一个__next__()方法进入函数,执行到yield时中断,把返回值返回给baozi这个变量:

第三步:开始执行下面的程序,也就执行到了第二个__next__()方法,直接跳转到yield这边,继续上一次的中断往下执行,这样就执行了yield下面的程序,当再次执行到yield关键字时,则继续中断,并且把返回值赋给baozi关键字,如果下面没有其他程序,则程序结束。

小结:

  1. 用yield做生成器,你想把什么返回到外面,你就把yield关键字放在那里。
  2. yield其实是保留了函数的中断状态,返回当前的值。
  3. 如果yield没有返回值,就返回一个空值None

三、send()和__next__()方法的区别

1、send()方法

def consumer(name):print("%s 准备吃包子啦!"%name)while True:baozi = yieldprint("包子[%s]来了,被[%s]吃了"%(baozi,name))c = consumer("zhangqigao")
c.__next__()  #不使用__next__()方法会报错
b1 = "肉松馅"
c.send(b1)   #调用yield,同时给yield传一个值
b2 = "韭菜馅"
c.send(b2)#输出
zhangqigao 准备吃包子啦!
包子[肉松馅]来了,被[zhangqigao]吃了
包子[韭菜馅]来了,被[zhangqigao]吃了

从上面可以看出send()和__next__()方法的区别:

  1. __next__()只是调用这个yield,也可以说成是唤醒yield,但是不不会给yield传值。
  2. send()调用这个yield或者说唤醒yield同时,也活给yield传一个值。
  3. 使用send()函数之前必须使用__next__(),因为先要中断,当第二次调用时,才可传值。

为什么给消费者传值时,必须先执行__next__()方法?

因为如果不执行一个__next__()方法,只是把函数变成一个生成器,你只有__next__()一下,才能走到第一个yield,然后就返回了,调用下一个send()传值时,才会发包子。

四、yield实现并行效果

yield还有一个更强大的功能,就是:单线程实现并发效果。

import timedef consumer(name):print("%s 准备吃包子啦!"%name)while True:baozi = yieldprint("包子[%s]来了,被[%s]吃了"%(baozi,name))def producer(name):c = consumer("A")c2 = consumer("B")c.__next__()c2.__next__()print("老子准备吃包子啦!")for i in range(10):time.sleep(1)print("做了一个包子,分两半")c.send(i)c2.send(i)producer("zhangqigao")

这个是生产者消费者模式,这个也就是后面协程的效果,这个我们后续再讲,先了解一下,生成器可以实现并发效果,极大的提高程序的运行效率。

转载于:https://www.cnblogs.com/zhangqigao/articles/6621910.html

day4-生成器并行运算相关推荐

  1. python学习笔记(装饰器、迭代器生成器、内置函数、软件目录开发规范)

    装饰器 定义:本质是函数,(功能:装饰其他函数):就是为其他函数添加附加功能 模拟场景一,在现有的函数中增加某个功能.现有的做法是定义新函数,并且加入函数中.需要修改源代码. def logger() ...

  2. python2.0 s12 day4

    python2.0 s12 day404 python s12 day4 TengLan回顾上节内容 05 python s12 day4 迭代器原理及使用 本节大纲介绍: 1.迭代器&生成器 ...

  3. Python基础day4 函数对象、生成器 、装饰器、迭代器、闭包函数

    一.函数对象 正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松 ...

  4. day4 高阶函数 嵌套函数 装饰器 内置函数 列表生成式 迭代器 生成器

    一.函数即变量 1.赋值效果图 a = 1  b = a def func(): print('hello') func 是函数名,相当于变量名,print('hello')是函数体,相当于变量的值, ...

  5. Day4 - 迭代器生成器、装饰器、Json pickle 数据序列化、软件目录结构规范

    ---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表 ...

  6. day4 匿名函数、装饰器、生成器、迭代器、内置函数、 json 与 pickle 模块

    文章目录 1.列表生成式 2.匿名函数 3.装饰器 4.生成器 5.迭代器 6.内置函数 7.json & pickle 序列化与反序列化 1.列表生成式 可通过特定语句便捷生成列表 list ...

  7. 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数(day4)

    一.三元表达式.列表推导式.生成器表达式 1.三元表达式name=input('姓名>>: ')res='SB' if name == 'alex' else 'NB'print(res) ...

  8. Python基础 day4 迭代器生成器 装饰器 Json pickle 数据序列化 软件目录结构规范 作业:ATM项目开发...

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 列表生成器 1.列表生成式,迭代器&生成器 列表生成式 孩子, ...

  9. 【Python百日刷题计划】Day4~各种数据类型用法以及函数和生成器使用

    目录

  10. python基础day4

    1.列表生成式,迭代器&生成器 列表生成式 将列表[0,1,2,3,4,5,6,7,8]中的每个值加1,如何实现?常用的几种方法 方法一: a=[0,1,2,3,4,5,6,7,8] for ...

最新文章

  1. python英语翻译-python制作英语翻译小工具代码实例
  2. git 常用命令使用
  3. RPC调用框架比较分析--转载
  4. CI/CD 最佳实践的基本原则
  5. java emptylist_Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方...
  6. 与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成...
  7. 基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统)
  8. %02 java_02_Java语法
  9. leetcode二叉树 找路径_LeetCode0257: 二叉树的所有路径
  10. KB/MB/GB/TB之间的换算是乘以1000还是1024?
  11. linux的shell类型_Linux中有哪些不同类型的Shell?
  12. 初始化Direct3D(2)
  13. Activiti6快速入门指南
  14. 拉普拉斯算子的疑惑--拉普拉斯算子作用于矢量和定义Hessian矩阵时遇到的问题
  15. 2022-2027年中国海洋功能性食品行业发展监测及投资战略研究报告
  16. Scikit-learn学习系列 | 4. sklearn特征降维方法汇总(方差过滤,卡方,F过滤,互信息,嵌入法)
  17. 网络加速器是干什么用的?
  18. 帖子回复评论点赞功能
  19. Android 替换原生输入法
  20. 北京车展直击:广汽新能源以AI打造“更聪明的陪伴”

热门文章

  1. b区计算机调剂学校,2021年b区研究生调剂院校有哪些
  2. vim之好用插件-ctrlp.vim
  3. anconda3安装虚拟环境
  4. linux安装Python36
  5. c++数据结构代码整理_抄代码对自己编程提高有用嘛
  6. java语言和www技术 阶段性测试一_2018春季【贵州电大】[JAVA语言与WWW技术(省)]04任务阶段性测验(答案)...
  7. java单链表节点翻转_单链表Java实现
  8. python csv文件写入失败_python解析csv文件失败
  9. antd option宽度自适应_网站自适应模板是什么
  10. Numpy常用函数的简单记录