备忘录: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 更新 這篇文章是兩年前寫的 ...
随机推荐
- 安卓开发eclipse如何导出项目
安卓开发如何导出项目 方法/步骤 1 首先打开eclipse 2 选择file然后选择export 3 选择android application 4 点击next 5 选择项目browse可以更 ...
- bzoj1089严格n元树——DP+高精度
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1089 f[d]为深度小于等于d的树的个数: 从根节点出发,有n个子树,乘法原理可以得到 f[ ...
- LOG.ZS.0001.基于Freetype的游戏字体渲染优化思路
Total Utf8-ucs2 Html_parse Layout Render_string Init_texture Ft_load_glyph 原始 2293 1 26 708 1556 2 1 ...
- Crontab Build_setting的定期检查
一.脚本功能 (1)检查所有的builting_setting.h是否能够编译通过,并将编译结果写入 编译结果.h文件中. (2)将编译结果通过邮箱发送给相关负责人. (3)系统定期执行任务,检查bu ...
- idea类名下有红色波浪线
能编译通过说明SDK导入正确,但是为啥我们点击每一个Java文件会出现好多红色的下划线 ,并提示idea cant resolve symbol 原因就是可能没有清除原来的历史缓存,导致一些错误,解决 ...
- 获取服务器基本信息.sh
#获取linux服务器基本信息脚本 #!/bin/bash # #Name:system_info #Ver:1.0 #Author:lykyl # # #程序说明: #获取服务器基本信息脚本 # e ...
- 用 SDL2 平铺背景并显示前景
环境:SDL2 + VC++2015 下面的代码将打开background.bmp和image.bmp,将background平铺背景,将image作为前景呈现 #include <iostre ...
- E20170507-ts
prompt n. 提示; 提示符 object n. 物体; 目标; 宾语; asterisk * n. 星号,星状物; Ampersand & Slash n. 斜线; ...
- HDU 2063 过山车+poj 1469
//这是一个非常简单的匹配.其实满感觉这种算法讲道理是可以想到. //但是我们这种弱就只能先学了匈牙利算法,然后随便嗨这种题目了.没事结果都一样. //这就是匹配算法的DFS形式,有一个BFS形式的, ...
- bzoj 4403: 序列统计【lucas+组合数学】
首先,给一个单调不降序列的第i位+i,这样就变成了单调上升序列,设原来数据范围是(l,r),改过之后变成了(l+1,r+n) 在m个数里选长为n的一个单调上升序列的方案数为\( C_m^n \),也就 ...