Lab 6
Q1: Bank Account
扩充Account类,添加属性transaction,即一个transaction列表实例,每一次调用都会创建一个该实例,记录每次调用deposit和withdraw前后的余额。另外,每个transaction有一个id属性,记录之前账户对deposit或withdraw的调用次数。id对于每个账户内是唯一的,而不是在所有transaction中的全局标识符
transaction有两个方法:
- changed:若在调用前后balance发生变化则返回True,否则返回False
- report:返回一个字符串用来描述该次transaction,以id开始,之后返回消息
1 | class Transaction: |
Q2: Email
一个邮箱系统包括三个类:Email, Server,
Client
Client类可以compose邮件,该邮件会被send到Server类中
Server类会把该邮件运到对应Client的inbox中,为了实现这个,一个Server类拥有一个字典clients,将Email中的recipient_name与拥有该名称的Client对象绑定
注意:client永远不会更改其使用的server
1 | class Email: |
这里的inbox存储的是每一个email实例,故传参时应传入self
Q3: Make Change
实现make_change函数,输入amount和coins字典
coins字典的键是一个正整数,表示面额;值也是一个正整数,表示硬币数量,如{1:4, 5:2}表示四个便士和两个五分
函数返回列表,其中元素是求和能达到amount数量的硬币列表,其中每种面额k最多使用coins[k]次
1 | def make_change(amount, coins): |
首先尝试使用最小面额的coin,但若无法实现则尝试使用更大面额
具体步骤:
进入函数默认使用一个最小面额硬币
若
amount==samllest:最小面额硬币即可满足需求,返回包含该值的列表否则,递归调用
make_change(amount-smallest, rest),减去一次最小面额若返回一个列表,则将该最小面额放入列表,并继续递归调用,将其返回的列表接在后面
若返回None,则表明使用最小面额无法实现,故递归调用
make_change(amount, rest),让函数把最小面额硬币去除后使用更大面额尝试
Q4: Change Machine
完成ChangeMachine类中的change方法,每个该类的实例包含了一些coins,一开始都是便士。change方法传入正整数coin,把他添加到coins中,并返回列表,其中的硬币面额之和要达到cin
该类倾向于使用尽可能多的最小面额硬币
1 | class ChangeMachine: |
- 将加入的coin放入coins字典,注意,这里的键为面额对应数量,而值为面额,故我们用get方法获取传入coin的键,并在此基础上+1(我们可以在第二个参数设置默认值,当没有对应面额时,get会返回设定值而非None)
- 之后调用
make_change方法,获得最小面额能实现达到coin数的硬币列表 - 使用
remove_one将类中已经用过的硬币移除 - 返回列表