备忘录: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 更新 這篇文章是兩年前寫的 ...
随机推荐
- 书写优雅的shell脚本(一)- if语句
使用unix/linux的程序人员几乎都写过shell脚本,但这其中很多人都是为了完成功能而在网上找代码段,这样写出来的shell脚本在功能方面当然是没有什么问题,但是这样的方式不能写出优雅的shel ...
- [Selenium] 使用自定义的FirefoxProfile
FirefoxProfile 用于定制待测试的Firefox 浏览器的特定属性,其中包括所存储的密码.书签.历史信息.Cookies等.某些测试用例需要用到特定的用户信息,因此可通过定制当前Firef ...
- Autolayout UIScrollView
http://www.cocoachina.com/ios/20141011/9871.html Xcode6中如何对scrollview进行自动布局(autolayout) Xcode6中极大的 ...
- 编写hadoop程序并打成jar包上传到hadoop集群运行
准备工作: 1. hadoop集群(我用的是hadoop-2.7.3版本),这里hadoop有两种:1是编译好的hadoop-2.7.3:2是源代码hadoop-2.7.3-src: 2. 自己的机器 ...
- E20180404-hm
reject vt. 拒绝; 排斥; 抛弃,扔掉; 吐出或呕吐; conditioner n. 调节器,调节装置 fabric n. 织物; 布; 构造; (建筑物的) 结构(如墙.地面.屋顶):质 ...
- Thirft 客户端等待时间
thrift框架使用C++ thrift shows CLOSE_WAIL error thrift中TNonblockingServer的简单用法
- poj 2960 S-Nim【SG函数】
预处理出SG函数,然后像普通nim一样做即可 #include<iostream> #include<cstdio> using namespace std; const in ...
- 洛谷P2219 [HAOI2007]修筑绿化带(单调队列)
传送门 啧……明明以前做到过这种类型的题结果全忘了…… 这种矩阵的,一般都是先枚举行,然后对列进行一遍单调队列,搞出右下角在每一行中合法位置时的最小权值 再枚举列,对行做一遍单调队列,用之前搞出来的最 ...
- 函数和代码复用 --Python
1.关于递归函数的描述,以下选项中正确的是 A.包含一个循环结构 B.函数比较复杂 C.函数内部包含对本函数的再次调用 D.函数名称作为返回值 答案:D 答案解析:递归函数是指函数内部包含对本函数的再 ...
- 1391:局域网(net)
[题目描述] 某个局域网内有n(n≤100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象.因为连接计 ...