备忘录: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 更新 這篇文章是兩年前寫的 ...
随机推荐
- linux oracle命令行窗口命令上下翻阅
1.上传rlwrap-0.37.tar.gz到/stage cd /stage/ 解压tar xzvf rlwrap-0.37.tar.gz cd rlwrap-0.37 ./configure ...
- java中wait和notify
在JAVA中,是没有类似于PV操作.进程互斥等相关的方法的.JAVA的进程同步是通过synchronized()来实现的,需要说明的是,JAVA的synchronized()方法类似于操作系统概念中的 ...
- 使用cocoaPods加载框架的具体步骤:
注意事项: 1.使用之前备份一下代码.因为pod更新很快,如果某个文件名有中文,pod install 一下.整个项目可能就要废掉了. 2.如果不把pod文件推动到远程服务器. 每一次用的时候在本地p ...
- 深入理解js里面的this
闲聊两句(可以忽略): 毕业有半年了,时间还过得真快,不过还好,感觉自己相对于刚毕业那会确实成长了很多:好久没有打游戏了(自己决心要戒掉的),消磨时光的时候就看看电影或者追追电视剧,再无聊就洗洗衣服. ...
- windows下安装RabbitMQ消息服务器 + 读写队列
RabbitMQ是什么 ? RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. 1:安装RabbitMQ需要先安装Erla ...
- 《高性能iOS 应用开发》之降低你 APP 的电量消耗
在编写高性能 代码时, 电量消耗是一个需要重点处理的重要因素, 就执行时间和 CPU 资源的利用而言, 我们不仅要实现高效的数据结构和算法, 还需要考虑其他的因素,如果某个应用是个电池黑洞,那么一定不 ...
- hdoj1074【A的无比爆炸】
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,一开始我就不知道怎么写,然后看了题解是状压DP,后来去看了看状压DP也就这样嘛,但是难点,可以说是不熟悉的地方吧...如下: 第一.我们能很快的知道状压DP的原理: ...
- 洛谷 P3711 仓鼠的数学题【伯努利数+多项式科技】
有个东西叫伯努利数--一开始直接·用第一类斯特林推到自闭 式子来源:https://www.luogu.org/blog/ShadowassIIXVIIIIV/solution-p3711 https ...
- bzoj4517[Sdoi2016]排列计数(组合数,错排)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1792 Solved: 1111[Submit][Stat ...
- 如何使用webstorm去操作git
0. 前言 在上一篇文章中,讲述了使用webstorm去调试node程序,最近研究了一下如何使用webstorm去操作git. 对于git的使用,大家的使用方式均有不同,最王道的方式非命令行莫属,基于 ...