一、生成器的创建及使用

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

创建生成器,需带有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. 2019-8-31-PowerShell-通过-WMI-获取系统服务

    title author date CreateTime categories PowerShell 通过 WMI 获取系统服务 lindexi 2019-08-31 16:55:58 +0800 2 ...

  2. JS拉平数组

    JS拉平数组 有时候会遇到一个数组里边有多个数组的情况(多维数组),然后你想把它拉平使其成为一个一维数组,其实最简单的一个方法就是ES6数组方法Array.prototype.flat.使用方法如下: ...

  3. ios9.3.3版本下 document.execCommand("copy") 失败

    copyText()安卓,ios11,ios12都可用 ,并且不弹起输入键盘 // 复制copyText function copyText(text) { var input = document. ...

  4. 读取Flex AIR应用程序设置

    说明: 本人之前做过一年的Flex AIR移动跨平台开发,在之前学习过程中,一直是将笔记记在了Evernote上,有的笔记是自己写的,也有的笔记是在网上看到,顺手记下了的. 所以在这里声明下,如果在网 ...

  5. tf.train.string_input_producer()

    处理从文件中读数据 官方说明 简单使用 示例中读取的是csv文件,如果要读tfrecord的文件,需要换成 tf.TFRecordReader import tensorflow as tf file ...

  6. Error与Exception的区别,Java常见异常Execption总结

    错误和异常的区别(Error vs Exception) 错误和异常的区别(Error vs Exception) 今天面试问了这样一个问题,"Error" 和 "Exc ...

  7. JS(JavaScript)的j进一步了解9(更新中···)

    1.动画 (1) Css样式提供了运动 过渡的属性transition  从一种情况到另一种情况叫过渡 Transition:attr  time  linear  delay: Attr 是变化的属 ...

  8. Linux 内核kobject 层次, kset, 和子系统

    kobject 结构常常用来连接对象到一个层级的结构中, 匹配正被建模的子系统的结构. 有 2 个分开的机制对于这个连接: parent 指针和 ksets. 在结构 kobject 中的 paren ...

  9. 【47.40%】【BZOJ 1875】[SDOI2009]HH去散步

    Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 1363  Solved: 646 [Submit][Status][Discuss] Descript ...

  10. [vue/no-parsing-error] Parsing error: x-invalid-end-tag.eslint-plugin-vue

    [vue/no-parsing-error] Parsing error: x-invalid-end-tag.eslint-plugin-vue   解决方案:vscode里面选择设置->搜索 ...