Day 26: Python标准库 - 简易银行系统
课程目标
本节课旨在通过构建一个简易银行系统来介绍Python标准库的使用。学生将学习如何使用文件操作、异常处理以及数据结构等来管理银行账户信息,实现基本的银行操作。
学习大纲
- 系统需求分析
- 设计银行账户类
- 实现基本银行操作
- 文件操作与数据持久化
- 异常处理
- 系统测试与验证
- 总结与扩展
1. 系统需求分析
我们的简易银行系统需要实现以下功能:
功能 | 描述 |
---|---|
创建账户 | 用户可以创建新的银行账户 |
查询余额 | 用户可以查询账户的余额 |
存款 | 用户可以向账户存款 |
取款 | 用户可以从账户取款 |
账户信息管理 | 存储和读取账户信息 |
需求分析示例
我们将通过一个Python类 BankAccount
来实现账户功能,每个账户具有一个唯一的账户ID、账户持有人姓名和账户余额。
2. 设计银行账户类
首先我们定义银行账户类的基本结构:
class BankAccount:def __init__(self, account_id, owner, balance=0):self.account_id = account_idself.owner = ownerself.balance = balancedef deposit(self, amount):if amount > 0:self.balance += amountreturn self.balanceelse:raise ValueError("存款金额必须大于0")def withdraw(self, amount):if 0 < amount <= self.balance:self.balance -= amountreturn self.balanceelse:raise ValueError("取款金额无效")def get_balance(self):return self.balancedef __str__(self):return f"账户ID: {self.account_id}, 持有人: {self.owner}, 余额: {self.balance}"
解释代码
__init__
方法用于初始化账户信息。deposit
和withdraw
方法用于处理存款和取款操作。get_balance
方法用于查询余额。__str__
方法用于打印账户信息,方便调试。
3. 实现基本银行操作
我们可以实现一个简单的用户界面来与系统交互。以下是一个示例:
def main():accounts = {}while True:action = input("请选择操作: 1. 创建账户 2. 存款 3. 取款 4. 查询余额 5. 退出\n")if action == '1':account_id = input("请输入账户ID: ")owner = input("请输入持有人姓名: ")accounts[account_id] = BankAccount(account_id, owner)print(f"账户创建成功: {accounts[account_id]}")elif action == '2':account_id = input("请输入账户ID: ")amount = float(input("请输入存款金额: "))if account_id in accounts:new_balance = accounts[account_id].deposit(amount)print(f"存款成功, 新余额: {new_balance}")else:print("账户不存在")elif action == '3':account_id = input("请输入账户ID: ")amount = float(input("请输入取款金额: "))if account_id in accounts:try:new_balance = accounts[account_id].withdraw(amount)print(f"取款成功, 新余额: {new_balance}")except ValueError as e:print(e)else:print("账户不存在")elif action == '4':account_id = input("请输入账户ID: ")if account_id in accounts:print(f"当前余额: {accounts[account_id].get_balance()}")else:print("账户不存在")elif action == '5':print("退出系统")breakelse:print("无效操作,请重试")if __name__ == "__main__":main()
运行流程图
以下是系统操作的流程图,展示了不同操作的逻辑流程:
┌───────────────┐
│ 开始 │
└─────┬─────────┘│▼
┌───────────────┐
│ 选择操作 │
└─────┬─────────┘│┌────┴─────┐│ │▼ ▼
创建账户 查询余额│ ││ ▼│ 账户存在?▼ │
存款操作 ┌─────┐│ │ 是 │└─────────>│显示││ └─────┘
取款操作 ││ ┌─────┐│ │ 否 ││ └─────┘│ │ ┌────▼────┐ ││获取余额 │<───┘└─────────┘│┌────▼────┐│ 退出 │└─────────┘
4. 文件操作与数据持久化
为了实现数据的持久化,我们需要将账户信息写入文件。我们可以使用Python的 csv
模块来完成这一功能。
示例代码 - 文件操作
import csvdef save_accounts(accounts):with open('accounts.csv', mode='w', newline='') as file:writer = csv.writer(file)for account in accounts.values():writer.writerow([account.account_id, account.owner, account.balance])def load_accounts():accounts = {}try:with open('accounts.csv', mode='r') as file:reader = csv.reader(file)for row in reader:account_id, owner, balance = rowaccounts[account_id] = BankAccount(account_id, owner, float(balance))except FileNotFoundError:pass # 文件不存在时返回空字典return accounts
解释代码
save_accounts
方法将现有账户信息写入accounts.csv
文件。load_accounts
方法从文件读取账户信息并重新创建BankAccount
对象。
在主程序中调用
在 main
函数开始时,我们可以调用 load_accounts()
加载之前保存的账户数据,在退出前调用 save_accounts(accounts)
保存账户数据。
def main():accounts = load_accounts()# 其余代码...
5. 异常处理
我们在程序中开设了一些异常处理机制,以确保程序的健壮性。例如,在存款和取款时,我们检查金额的有效性;在读取账户信息时,我们捕获文件未找到的异常。
完善异常处理的示例
def withdraw(self, amount):if amount <= 0:raise ValueError("取款金额必须大于0")if amount > self.balance:raise ValueError("余额不足")self.balance -= amountreturn self.balance
6. 系统测试与验证
在完成系统的实现后,我们需要进行测试以确保各个功能模块的正确性。测试包括:
- 创建账户
- 存款和取款操作
- 查询余额
- 文件读写操作
测试用例示例
测试用例序号 | 测试内容 | 预期结果 |
---|---|---|
1 | 创建新账户 | 账户创建成功 |
2 | 存款500 | 余额应为500 |
3 | 取款200 | 余额应为300 |
4 | 查询余额 | 返回300 |
5 | 存款-100 | 抛出异常 |
6 | 取款400 | 抛出异常 |
7. 总结与扩展
本课小结
本次课程通过构建简易银行系统,深入了解了Python标准库在文件操作、数据结构和异常处理方面的应用。同时也学习了如何实现一个简单的命令行用户交互程序。
扩展思考
未来,我们可以将此系统扩展为一个支持多用户并发操作的应用程序。例如,通过引入数据库(如SQLite)来存储账户信息,或使用Flask等框架构建Web应用,提供更加灵活的用户界面。此外,还可以加入用户身份验证、交易记录等更复杂的功能。
结束语
希望同学们通过本节课的学习能够掌握Python标准库的使用,并能在实际项目中灵活应用这些知识。
练习题
- 请扩展银行系统,加入账户信息修改功能。
- 请实现账户交易记录功能,记录每次存取款的详细信息。
- 尝试将此系统封装为一个模块,以便在其他项目中重用。
怎么样今天的内容还满意吗?再次感谢观众老爷的观看。
最后,祝您早日实现财务自由,还请给个赞,谢谢!