备忘录:python 3在class中使用yield
之前代码都是直接在函数级别使用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的更多相关文章
- 关于Python中的yield
关于Python中的yield 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,f ...
- 关于Python中的yield(转载)
您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield ...
- Python中的yield生成器的简单介绍
Python yield 使用浅析(整理自:廖 雪峰, 软件工程师, HP 2012 年 11 月 22 日 ) 初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关 ...
- 深入理解Python中的yield和send
send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互. 但是需要注意,在一个生成器对象没有执行next方法之前,由 ...
- python 中的 yield 究竟为何物?生成器和迭代器的区别?
当你突然看到别人的代码中出现了一个好像见过但又没用过的关键词 比如 yield ,你是否会觉得这段代码真是高大上呢? 或许只有我这种小白才会这样子觉得,就在刚刚,我就看见了别人的代码中的yield,觉 ...
- 初次使用C#中的yield
这几天在Python程序员的微信订阅号中总是见到yield的关键字,才想起来在C#中也是有yield,但是只是知道有,从来没有了解过他的用法,今天有时间就来看看是怎么使用的.刚开始肯定就是搜索一下用法 ...
- 【Python】迭代器、生成器、yield单线程异步并发实现详解
转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...
- 使用Python在2M内存中排序一百万个32位整数
译言网 | 使用Python在2M内存中排序一百万个32位整数 使用Python在2M内存中排序一百万个32位整数 译者:小鼠 发表时间:2008-11-13浏览量:6757评论数:2挑错数:0 作者 ...
- Python3中的yield from语法
Python3中的yield from语法 by Kay Zheng Tags: python, 协程, generator 30 March 2014 2016-2-23 更新 這篇文章是兩年前寫的 ...
随机推荐
- windows下编译调试nginx
typora-copy-images-to: image windows下编译调试nginx linux使用gdb跟踪代码效率不高,在通过跟踪代码进行源码分析,与定位复杂逻辑问题时,如果有一个简单易用 ...
- CClientDC类 CWindowDC类
CClientDC类 CClientDC类也是CDC类的派生类.它只能在窗口的客户区(即窗口中除了边框.标题栏.菜单栏以及状态栏外的中间部分)中进行绘图,坐标点(0,0)通常指的是客户区的左上角.它的 ...
- 常用的Ant风格书写
原文地址 Ant风格,为请求路径的一种匹配方式 通配符 说明 ? 匹配任意一个字符 * 匹配任意字符(包括0个) ** 匹配任意层路径(包括0个) 支持Ant风格 1.spring资源加载 clas ...
- python int对象的方法
1.求绝对值 >>> a = -10 >>> a.__abs__() 10 >>> abs(10) 10 2.加法 >>> a ...
- bzoj 4259 4259: 残缺的字符串【FFT】
和bzoj 4503 https://www.cnblogs.com/lokiii/p/10032311.html 差不多,就是再乘上一个原串字符 有点卡常,先在点值下算最后一起IDFT #inclu ...
- 学习Mahout(一)
Mahout 官方下载地址:http://apache.fayea.com/apache-mirror/mahout/ 环境ubuntu 12.04, hadoop1.2.1 ,mahout 0.9 ...
- nginx媒体压缩
1 gzip模块 参考:http://nginx.org/en/docs/http/ngx_http_gzip_module.html 浏览器的请求头里会表明Accept-Encoding 方式.服务 ...
- BZOJ4653(区间离散化+线段树+决策单调尺取)
写得很好的题解 一眼过去很像是:排序,然后从前向后扫,有这个区间时插到树里,过去以后再删除.然后事实也是这样做的…… 具体起来: 1.如果考虑暴力的话,一种想法是枚举左端和右端要选取的区间(如果我们按 ...
- 洛谷 P3312 [SDOI2014]数表
式子化出来是$\sum_{T=1}^m{\lfloor}\frac{n}{T}{\rfloor}{\lfloor}\frac{m}{T}{\rfloor}\sum_{k|T}\mu(\frac{T}{ ...
- BFS Codeforces Round #297 (Div. 2) D. Arthur and Walls
题目传送门 /* 题意:问最少替换'*'为'.',使得'.'连通的都是矩形 BFS:搜索想法很奇妙,先把'.'的入队,然后对于每个'.'八个方向寻找 在2*2的方格里,若只有一个是'*',那么它一定要 ...