Python 生成器和协程使用示例
一、生成器的创建及使用
生成器比迭代器更节省内存空间,使用生成器,可以生成一个值的序列用于迭代,并且这个值的序列不是一次生成的,而是使用一个,再生成一个,的确可以使程序节省大量的内存损耗
创建生成器,需带有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
总结:
- 调用send()方法向传值,且生成器能正常接收成功,语法:rcv = yield,rcv则是send方法传递过来的值,若无任何参数,返回None
- 每次调用send()方法,生成器也会生成一次对应的数值,返回n,且运行到yeild语句后,停止执行
- 每次调用一次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 生成器和协程使用示例的更多相关文章
- python 生成器与协程
生成器在迭代中以某种方式生成下一个值并且返回和next()调用一样的东西. 挂起返回出中间值并多次继续的协同程序被称作生成器. 语法上讲,生成器是一个带yield语句的函数.一个函数或者子程序只返回一 ...
- Python 生成器和协程
Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访 ...
- python入门20180717-迭代器、生成器和协程
迭代器.生成器和协程 python中任意的对象,只要它定义了可以返回一个迭代器的__iter__方法,或者支持下标索引的_getitem_方法,那么它就是一个可迭代对象. 可迭代的对象不一定就是迭代器 ...
- python基础----迭代器、生成器、协程函数及应用(面向过程实例)
一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...
- Python | 详解Python中的协程,为什么说它的底层是生成器?
今天是Python专题的第26篇文章,我们来聊聊Python当中的协程. 我们曾经在golang关于goroutine的文章当中简单介绍过协程的概念,我们再来简单review一下.协程又称为是微线程, ...
- Python中的协程,为什么说它的底层是生成器?
我们曾经在golang关于goroutine的文章当中简单介绍过 协程 的概念,我们再来简单review一下.协程又称为是微线程,英文名是Coroutine.它和线程一样可以调度,但是不同的是线程的启 ...
- python网络编程--协程
1.协程 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的.. 需要强调的是: 1. pyt ...
- Python 进阶 之 协程
协程的概念级描述(与线程对比):转自知乎 链接 线程有两个必须要处理的问题:一是碰着阻塞式I\O会导致整个进程被挂起: 二是由于缺乏时钟阻塞,进程需要自己拥有调度线程的能力. 如果一种实现使得每个线程 ...
- Python中异步协程的使用方法介绍
1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后 ...
随机推荐
- 2019-8-31-PowerShell-通过-WMI-获取系统服务
title author date CreateTime categories PowerShell 通过 WMI 获取系统服务 lindexi 2019-08-31 16:55:58 +0800 2 ...
- JS拉平数组
JS拉平数组 有时候会遇到一个数组里边有多个数组的情况(多维数组),然后你想把它拉平使其成为一个一维数组,其实最简单的一个方法就是ES6数组方法Array.prototype.flat.使用方法如下: ...
- ios9.3.3版本下 document.execCommand("copy") 失败
copyText()安卓,ios11,ios12都可用 ,并且不弹起输入键盘 // 复制copyText function copyText(text) { var input = document. ...
- 读取Flex AIR应用程序设置
说明: 本人之前做过一年的Flex AIR移动跨平台开发,在之前学习过程中,一直是将笔记记在了Evernote上,有的笔记是自己写的,也有的笔记是在网上看到,顺手记下了的. 所以在这里声明下,如果在网 ...
- tf.train.string_input_producer()
处理从文件中读数据 官方说明 简单使用 示例中读取的是csv文件,如果要读tfrecord的文件,需要换成 tf.TFRecordReader import tensorflow as tf file ...
- Error与Exception的区别,Java常见异常Execption总结
错误和异常的区别(Error vs Exception) 错误和异常的区别(Error vs Exception) 今天面试问了这样一个问题,"Error" 和 "Exc ...
- JS(JavaScript)的j进一步了解9(更新中···)
1.动画 (1) Css样式提供了运动 过渡的属性transition 从一种情况到另一种情况叫过渡 Transition:attr time linear delay: Attr 是变化的属 ...
- Linux 内核kobject 层次, kset, 和子系统
kobject 结构常常用来连接对象到一个层级的结构中, 匹配正被建模的子系统的结构. 有 2 个分开的机制对于这个连接: parent 指针和 ksets. 在结构 kobject 中的 paren ...
- 【47.40%】【BZOJ 1875】[SDOI2009]HH去散步
Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1363 Solved: 646 [Submit][Status][Discuss] Descript ...
- [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里面选择设置->搜索 ...