一、生成器的创建及使用

生成器比迭代器更节省内存空间,使用生成器,可以生成一个值的序列用于迭代,并且这个值的序列不是一次生成的,而是使用一个,再生成一个,的确可以使程序节省大量的内存损耗

创建生成器,需带有yield的函数,带有yield关键字的函数,本质上就是一个生成器

示例:

# 这是一个生成器对象
def myYield(n): while n > 0:
print("开始生成...:")
yield n
print("完成一次...:")
n -= 1 # 实例化一个生成器对象,可以用变量进行直接引用
my_yield = myYield(3) print("第一次调用__next()__方法")
result = my_yield.__next__()
print("第一次调用后,返回的值是:",result)
print("第二次调用__next()__方法")
result = my_yield.__next__()
print("第二次调用后,返回的值是:",result)

输出结果:

第一次调用__next()__方法

开始生成...:

第一次调用后,返回的值是: 3

第二次调用__next()__方法

完成一次...:

开始生成...:

第二次调用后,返回的值是: 2

总结:

  • 每次调用__next()__方法,就会生成一次,同时返回n,执行到yield语句后,不会继续往下执行,且结束一次生成
  • 第二次调用__next()__方法,就会从上一次结束执行的地方继续执行,执行到yield语句后,同时返回n,不会继续往下执行

创建一个能够接收外部参数的生成器,使用send方法向generator生成器进行传值

示例:

def myYield(n):
while n > 0:
rcv = yield n
print("接收到外部的值:",rcv)
n -= 1
if rcv is not None:
n = rcv
if __name__ == "__main__":
my_yield = myYield(3)
print("第一次调用__next__()的值:")
print(my_yield.__next__())
print("第二次调用__next__()的值:")
print(my_yield.__next__())
print("传给生成器一个值,重新初始化生成器。")
print("第一次调用__send__()外部传值修改生成器")
print(my_yield.send(10))
print("第三次调用__next__()的值:")
print(my_yield.__next__())

输出结果:

第一次调用__next__()的值:

3

第二次调用__next__()的值:

接收到外部的值: None

2

传给生成器一个值,重新初始化生成器。

第一次调用__send__()外部传值修改生成器

接收到外部的值: 10

10

第三次调用__next__()的值:

接收到外部的值: None

9

总结:

  1. 调用send()方法向传值,且生成器能正常接收成功,语法:rcv = yield,rcv则是send方法传递过来的值,若无任何参数,返回None
  2. 每次调用send()方法,生成器也会生成一次对应的数值,返回n,且运行到yeild语句后,停止执行
  3. 每次调用一次send(10)方法,传递的值只能被接收到一次,rcv=10,再次调用__next__()方法,rcv=None

二、协程的介绍


# -*- coding:utf-8 -*- def consumer():
print("已经生成一个消费者")
while True:
print("消费者1号:等待接收处理任务...")
data = (yield)
print("消费者1号:收到任务:",data,"完成处理...") def producer():
c = consumer()
c.__next__()
for i in range(3):
print("生产者1号:发送一个任务...","任务%s" % i)
c.send("任务%d" % i) if __name__ == "__main__":
producer()

上述代码输出结果:

已经生成一个消费者

消费者1号:等待接收处理任务...

生产者1号:发送一个任务... 任务0

消费者1号:收到任务: 任务0 完成处理...

消费者1号:等待接收处理任务...

生产者1号:发送一个任务... 任务1

消费者1号:收到任务: 任务1 完成处理...

消费者1号:等待接收处理任务...

生产者1号:发送一个任务... 任务2

消费者1号:收到任务: 任务2 完成处理...

消费者1号:等待接收处理任务...

Python 生成器和协程使用示例的更多相关文章

  1. python 生成器与协程

    生成器在迭代中以某种方式生成下一个值并且返回和next()调用一样的东西. 挂起返回出中间值并多次继续的协同程序被称作生成器. 语法上讲,生成器是一个带yield语句的函数.一个函数或者子程序只返回一 ...

  2. Python 生成器和协程

    Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访 ...

  3. python入门20180717-迭代器、生成器和协程

    迭代器.生成器和协程 python中任意的对象,只要它定义了可以返回一个迭代器的__iter__方法,或者支持下标索引的_getitem_方法,那么它就是一个可迭代对象. 可迭代的对象不一定就是迭代器 ...

  4. python基础----迭代器、生成器、协程函数及应用(面向过程实例)

    一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...

  5. Python | 详解Python中的协程,为什么说它的底层是生成器?

    今天是Python专题的第26篇文章,我们来聊聊Python当中的协程. 我们曾经在golang关于goroutine的文章当中简单介绍过协程的概念,我们再来简单review一下.协程又称为是微线程, ...

  6. Python中的协程,为什么说它的底层是生成器?

    我们曾经在golang关于goroutine的文章当中简单介绍过 协程 的概念,我们再来简单review一下.协程又称为是微线程,英文名是Coroutine.它和线程一样可以调度,但是不同的是线程的启 ...

  7. python网络编程--协程

      1.协程 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的.. 需要强调的是: 1. pyt ...

  8. Python 进阶 之 协程

    协程的概念级描述(与线程对比):转自知乎 链接 线程有两个必须要处理的问题:一是碰着阻塞式I\O会导致整个进程被挂起: 二是由于缺乏时钟阻塞,进程需要自己拥有调度线程的能力. 如果一种实现使得每个线程 ...

  9. Python中异步协程的使用方法介绍

    1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后 ...

随机推荐

  1. PageProxy分页的实现

    PageProxy是Ext.Net实现的一种分页方式,PageProxy通过实现OnReadData事件来完成分页. <ext:Store runat=" OnReadData=&qu ...

  2. python -- 类中--内置方法

    isinstance 和  issubclass isinstance(obj,b)  检查是否obj是否是类b的对象 class A(object):pass class B(A):pass b=B ...

  3. ubuntu18.04 挂载ntfs硬盘无法写入解决办法

    win10和ubuntu18.04双系统,在ubuntu下通过/etc/fstab挂载ntfs硬盘无写入权限,尝试通过chmod修改写入权限和ntfs-config图形工具修改写入权限均失败.在ubu ...

  4. GPU选型

    1-基本概念 显存带宽     是指显示芯片与显存之间的数据传输速率,它以字节/秒为单位.显存带宽是决定显卡性能和速度最重要的因素之一. 2-常见GPU性能参数 GPU型号 单卡显存 cuda 计算能 ...

  5. centos 磁盘挂载

    1.更改磁盘格式 fdisk -l fdisk /dev/vdb mkfs.xfs /dev/vdb1 mkfs.xfs /dev/vdb1 -f 2.查看UUID blkid 3.挂载文件夹 vim ...

  6. 用diiv实现多个方块居中嵌套--padding

    文章地址 https://www.cnblogs.com/sandraryan/ 案例:用diiv嵌套多个正方形,配合盒模型相关知识,使每个div在他的父元素上居中.(每个div中心点对齐) 涉及到m ...

  7. 使用原生JS封装一个动画函数

    最近一直在忙项目,很少有时间回顾之前的知识,今天刚好要做一个轮播,因为对兼容性有一定的要求,使用了各种插件和库中的轮播,效果都不是很理想,一怒之下,使用原生JS封装了一个轮播组件,其中重要的功能就是一 ...

  8. P1031 栈的序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...

  9. linux 系统挂起

    尽管内核代码的大部分 bug 以 oops 消息结束, 有时候它们可能完全挂起系统. 如果系 统挂起, 没有消息打印. 例如, 如果代码进入一个无限循环, 内核停止调度,[15]15 并且系 统不会响 ...

  10. video视频标签一些设置,包括封面、播放结束后的封面、视频占满屏幕的方式、视频播放暂停、展示控制栏、触发全屏播放事件

    video视频标签一些设置,包括封面.播放结束后的封面.视频占满屏幕的方式.视频链接.视频播放暂停.展示控制栏.触发全屏播放事件 <video id="video" auto ...