Python连载41-yield from详解、委派生成器
一、
1.yield from
(1)调用协程为了得到返回值,协程必须正常终止
(2)生成器正常终止会发出StopIteration异常,异常对象的value属性保存返回值。
(3)yield from从内部捕获StopIteration异常
我们举个例子
def gen():
for c in "AB":
yield c
#list直接用生成器作为参数
print(list(gen()))
def gen_new():
yield from "AB"
print(list(gen_new())
解释:我们从中可以看出,两个函数最后返回的结果是一致的,可以用下面的图片来解释它们的运行过程,第二个函数增加了一个管道层,使得这个函数更加灵活;第一个函数中,list向迭代器逐一要值,然后一起输出出来;第二个函数,向管道要值,然后管道收集到所有的迭代数,然后再一并返回给list函数

2.委派生成器
(1)包含yield from表达式的生成器函数
(2)委派生成器在yield from表达式暂停,调用方可以直接把数据发给自生成器
(3)子生成器再把产出的值发给调用方
(4)子生成器在最后,解释器会抛出StopIteration,并且把返回值附加到异常对象上
举个例子:
from collections import namedtuple
ResClass = namedtuple("Res","count average")
#子生成器
def average():
total = 0.0
count = 0
average = None
while True:
term = yield
#None是哨兵值
if term is None:
break
total += term
count += 1
average = total/count
return ResClass(count,average)
#委派生成器
def grouper(storages,key):
while True:
#获取averager()返回的值
storages[key] = yield from average()
#客户端代码
def abc():
process_data = {
"boys_2":[39.0,40.8,43.2,43.1,38.6,41.4,40.6,36.3],
"boys_1":[1.38,1.5,1.32,1.25,1.37,1.48,1.25,1.49,1.46]
}
storages = {}
for k,v in process_data.items():
#获取协程
coroutine = grouper(storages,k)
#预激协程
next(coroutine)
#发送数据到协程
for dt in v:
coroutine.send(dt)
#终止协程
coroutine.send(None)
print(storages)
#run
if __name__ == "__main__":
abc()

#解释:
#1.外层for循环每次迭代会新建一个grouper实例,赋值给coroutine变量;grouper是委派生成器生成
#2.调用next(coroutine),预激委派生成器grouper,此时进入while True循环,调用子生成器average
#3.内层for循环调用coroutine.send(value),直接把值传给子生成器average,同时,当前的grouper
#4.内层循环结束后,grouper实例依旧在yield from表达式处暂停,因此,grouper函数定义体中
#5.coroutine.send(None)终止averager子生成器,子生成器抛出StopIteration异常并将返回数组
二、源码
d27_4_yield_from_and_delegate_generator.py
https://github.com/ruigege66/Python_learning/blob/master/d27_4_yield_from_and_delegate_generator.py
2.CSDN:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)
3.博客园:https://www.cnblogs.com/ruigege0000/
4.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

Python连载41-yield from详解、委派生成器的更多相关文章
- [转]使用python来操作redis用法详解
转自:使用python来操作redis用法详解 class CommRedisBase(): def __init__(self): REDIS_CONF = {} connection_pool = ...
- Python安装、配置图文详解(转载)
Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...
- 【和我一起学python吧】Python安装、配置图文详解
Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境( ...
- Python中的高级数据结构详解
这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...
- Python中格式化format()方法详解
Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...
- “全栈2019”Java多线程第八章:放弃执行权yield()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- Python调用windows下DLL详解
Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...
- Python操作redis字符串(String)详解 (三)
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...
- 【Python】Python内置函数dir详解
1.命令介绍 最近学习并使用了一个python的内置函数dir,首先help一下: 复制代码代码如下: >>> help(dir)Help on built-in function ...
随机推荐
- 11-scrapy(递归解析,post请求,日志等级,请求传参)
一.递归解析: 需求:将投诉_阳光热线问政平台中的投诉标题和状态网友以及时间爬取下来永久储存在数据库中 url:http://wz.sun0769.com/index.php/question/que ...
- 【广州.NET社区推荐】.NET Core Q&A - ORM
Object/Relational Mapping(ORM) 作为开发工作中非常重要的组件,重量级.轻量级.简单的.复杂的 各种各样有很多种适应不同的业务场景,但这些组件分散在网络世界的各个角落,寻找 ...
- CSV文件数据如何读取、导入、导出到新的CSV文件中以及CSV文件的创建
CSV文件数据如何读取.导入.导出到新的CSV文件中以及CSV文件的创建 一.csv文件的创建 (1)新建一个文本文档: 打开新建文本文档,进行编辑. 注意:关键字与关键字之间用英文半角逗号隔开.第一 ...
- 练手WPF(三)——扫雷小游戏的简易实现(下)
十四.响应鼠标点击事件 (1)设置对应坐标位置为相应的前景状态 /// <summary> /// 设置单元格图样 /// </summary> /// <para ...
- .NET MVC5简介(五)管道处理模型IHttpModule
https://www.cnblogs.com/JimmyZhang/archive/2007/09/04/880967.html IHttpModule HTTPRuntime(运行时).在一个控制 ...
- TreeMap源码分析,看了都说好
概述 TreeMap也是Map接口的实现类,它最大的特点是迭代有序,默认是按照key值升序迭代(当然也可以设置成降序).在前面的文章中讲过LinkedHashMap也是迭代有序的,不过是按插入顺序或访 ...
- Java生鲜电商平台-IntelliJ IDEA 最新注册码,亲测可用
2019年IntelliJ IDEA 最新注册码(截止到2020年3月11日) 操作步骤: 第一步: 修改 hosts 文件 ~~~ 在hosts文件中,添加以下映射关系: 0.0.0.0 acco ...
- PLC与外接按钮开关接线方法图解
一个电机控制电路如图1所示,电路中使用常开按钮启动电机,用常闭按钮停止电机运行,图1中KM是控制电机电源的继电器.这样的电路若是使用PLC时的外接线图如图2所示.同时为使PLC运行,在PLC中输入由图 ...
- C++ 赋值运算符'='的重载(浅拷贝、深拷贝)
01 赋值运算符重载的需求 有时候希望赋值运算符两边的类型可以不匹配,比如:把一个 int 类型变量赋值给一个Complex(复数)对象,或把一个 char* 类型的字符串赋值给一个字符串对象,此时就 ...
- 在 VS Code 中遇到的一些问题
1.在安装时未配置右键快捷菜单,想重新添加 最简单的就是重新安装一遍,在安装过程中选择好. 其次可以通过以下注册表脚本导入(保存为 .reg 文件),注意因为有中文字符,需要使用记事本保存为 ANSI ...