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 ...
随机推荐
- 成为杰出Java开发人员的10个步骤
在优锐课的学习分享中,讨论了如果你是Java开发人员并且对技术充满热情,则可以按照以下十个步骤进行操作,这可以使你成为杰出的Java开发人员. 1.具有扎实的基础和对OO原理的理解 对于Java开发人 ...
- 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 2
23.1.3 接口的应用和优势 API是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无须访问源码,或理解内部工作机制的细节.接口应用的一些常见场景如下 ...
- C#如何用IL和Emit类通过Calli来实现实例函数与静态函数的调用
一. 介绍 最近充能看书,在书上看到函数调用可以 " 通过 ldftn 获得函数指针,然后使用 calli 指令 " 来进行调用,并说这种行为 " 类似 C 的函数指针, ...
- JQuery操作attr、prop、val()/text()/html()、class属性
1.1 arr操作 设置单个属性 // 第一个参数:需要设置的属性名 // 第二个参数:对应的属性值 // $obj.attr(name, value); // 用法举例. $('img').at ...
- 点击事件的坐标计算(client || offset) +(X || Width || Left) 各种排列组合别绕晕
结论: 1,X,Y的都是属于点击位置的,width.height.left.top都是属于DOM的. 2,涉及的所有位置只与document或DOM内部有关,与DOM如何定位,周围有没有其他占位HTM ...
- 自定义栈Stack 和 队列Queue
自定义栈 接口 package com.test.custom; public interface IStack<E> { E pop(); void push(E e); E peek( ...
- 关于es6及以上的js编译成es5
问题:es6及以上版本在IE浏览器上不能执行起来,但Chrome浏览器上轻松运行,解决兼容IE的问题就需要使用babel:这个可以去babel的官网去查看; 关于babel的简单使用,有两种方式: 1 ...
- FileZilla搭建FTP服务器
一.基础环境1.服务端机器:192.168.0.104 FillaZilla Server端下载2.客户端机器:192.168.0.100 FillaZilla客户端下载 !!!搭建FTP服务端的机器 ...
- BayaiM__SQLLDR 用法:
BayaiM__SQLLDR 用法: ===================================================================== C:\Users\Ad ...
- HiGV ui代码流程
在海思PDT_Init下有一个这样的函数HI_PDT_UI_Init(): 1. HI_PDT_UI_Init()函数: /*public, it should be called by main() ...