之前代码都是直接在函数级别使用yield,但封装class后如何使用yield很少遇到。

经过半天的学习,总算完成示例。代码没有什么特殊地方,仅仅作为一个工作项。

与生成器合作:

########################################################################
class Detail(object):
"""""" #----------------------------------------------------------------------
def __init__(self,qty):
"""Constructor"""
self.qty = qty ########################################################################
class Bill(object):
"""""" #----------------------------------------------------------------------
def __init__(self,no):
"""Constructor"""
self.no = no
self.detail_lst = list() def AddDetail(self,qty):
self.detail_lst.append(Detail(qty)) ########################################################################
class Account(object):
"""""" #----------------------------------------------------------------------
def __init__(self,total):
"""Constructor"""
self.total = total def doBuy(self,BllLst):
for objBll in BllLst:
self.total += 1
yield objBll ########################################################################
class Pay(object):
"""""" #----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
pass def doPay(self,bll):
for objBll in bll:
for (index,detail) in enumerate(objBll.detail_lst):
yield detail.qty acc = Account(0)
pay = Pay() bllLst = list() bll = Bill(1)
bll.AddDetail(5)
bll.AddDetail(10)
bllLst.append(bll) bll = Bill(2)
bll.AddDetail(15)
bll.AddDetail(20) bllLst.append(bll) rmtPay = pay.doPay(acc.doBuy(bllLst)) paySum = 0
for qty in rmtPay:
paySum += qty print('count: %d,sum : %d' % (acc.total, paySum))

  

与协程的合作:

def coroutine(func):
def start(*args,**kwargs):
g = func(*args,**kwargs)
g.__next__()
return g
return start ########################################################################
class Detail(object):
"""""" #----------------------------------------------------------------------
def __init__(self,qty):
"""Constructor"""
self.qty = qty ########################################################################
class Account(object):
"""""" #----------------------------------------------------------------------
def __init__(self,total):
"""Constructor"""
self.total = total @coroutine
def Buy(self):
while(True):
objDetail = (yield)
if(objDetail is None):
break
self.total += objDetail.qty ########################################################################
class Pay(object):
"""""" #----------------------------------------------------------------------
def __init__(self,nextStop):
"""Constructor"""
self.billCount = 0
self.nextStop = nextStop @coroutine
def doPay(self):
while(True):
objDetail = (yield)
if(objDetail is None):
break
self.billCount += 1
self.nextStop.send(objDetail) acc = Account(10)
pay = Pay(acc.Buy()) obj = pay.doPay()
bill_1 = Detail(10)
obj.send(bill_1)
bill_2 = Detail(20)
obj.send(bill_2) print('count : %d , sum : %d' % (pay.billCount,acc.total))

  

备忘录:python 3在class中使用yield的更多相关文章

  1. 关于Python中的yield

    关于Python中的yield   在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,f ...

  2. 关于Python中的yield(转载)

    您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield ...

  3. Python中的yield生成器的简单介绍

    Python yield 使用浅析(整理自:廖 雪峰, 软件工程师, HP 2012 年 11 月 22 日 ) 初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关 ...

  4. 深入理解Python中的yield和send

    send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互. 但是需要注意,在一个生成器对象没有执行next方法之前,由 ...

  5. python 中的 yield 究竟为何物?生成器和迭代器的区别?

    当你突然看到别人的代码中出现了一个好像见过但又没用过的关键词 比如 yield ,你是否会觉得这段代码真是高大上呢? 或许只有我这种小白才会这样子觉得,就在刚刚,我就看见了别人的代码中的yield,觉 ...

  6. 初次使用C#中的yield

    这几天在Python程序员的微信订阅号中总是见到yield的关键字,才想起来在C#中也是有yield,但是只是知道有,从来没有了解过他的用法,今天有时间就来看看是怎么使用的.刚开始肯定就是搜索一下用法 ...

  7. 【Python】迭代器、生成器、yield单线程异步并发实现详解

    转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...

  8. 使用Python在2M内存中排序一百万个32位整数

    译言网 | 使用Python在2M内存中排序一百万个32位整数 使用Python在2M内存中排序一百万个32位整数 译者:小鼠 发表时间:2008-11-13浏览量:6757评论数:2挑错数:0 作者 ...

  9. Python3中的yield from语法

    Python3中的yield from语法 by Kay Zheng Tags: python, 协程, generator 30 March 2014 2016-2-23 更新 這篇文章是兩年前寫的 ...

随机推荐

  1. 创建app前的环境配置/AppIcon/启动图片

    1.真机调试http://blog.csdn.net/tht2009/article/details/48580569 2.创建app前的环境配置

  2. uCareSystem:Ubuntu/Linux Mint的一体化系统更新和维护工具

    对于任何一款允许用户还原电脑到之前状态(包括文件系统,安装的应用,以及系统设置)的操作系统来说,系统还原功能都是必备功能,它可以恢复系统故障以及其他的问题. 有的时候安装一个程序或者驱动可能让你的系统 ...

  3. jQuery 引用地址(包括jquery和google提供的地址), 节省你不必要的流量

    转载自:http://www.cnblogs.com/henw/archive/2011/09/30/2196255.html 你可以使用这句代码读取jQuery的最新版本的代码文件. jquery官 ...

  4. CodeForces 1103D. Professional layer

    题目简述:给定$1 \leq n \leq 10^6$个正整数$1 \leq a_i \leq 10^{12}$,修改第$i$个正整数$a_i$的花费为$1 \leq e_i \leq 10^9$,以 ...

  5. (二十五)后台开发-分类信息的curd -展示所有实现

    案例1-分类信息的curd 步骤分析: 左边的dtree: 1.导入dtree.js 2.导入dtree.css 3.创建一个div 添加样式 class="dtree" 4.在d ...

  6. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时6

    课时6 线性分类器损失函数与最优化(上) 多类SVM损失:这是一个两分类支持向量机的泛化 SVM损失计算了所有不正确的例子,将所有不正确的类别的评分,与正确类别的评分之差加1,将得到的数值与0作比较, ...

  7. 浅谈Thrift内部实现原理

    http://dongxicheng.org/tag/thrift/ http://dongxicheng.org/search-engine/thrift-internals/ Thrift由两部分 ...

  8. CodeForces 687C【DP】

    题意: 给你n个数,然后让这些数相加组合,然后在这些组合的数里可以再相加组合搞出给定 k,输出这些组合的数. 思路: DP. //在枚举到第i个coin的时,dp[i][j],i 肯定能被a[i]组合 ...

  9. 跳马~~~HDU1372

    基础BFS,水过就好~手写队列优化~~ #include <iostream> #include <stdio.h> #include <string.h> #in ...

  10. mysqldump 工具使用详解——参数选项

    mysqldump 简介 mysqldump 是一种用于逻辑备份的客户端工具,它会产生一套能够重新构建数据库或表的SQL语句.所谓逻辑备份:是利用SQL语言从数据库中抽取数据并存于二进制文件的过程.逻 ...