15分钟学Python 第26天 : Python标准库简易银行系统

Day 26: Python标准库 - 简易银行系统

课程目标

本节课旨在通过构建一个简易银行系统来介绍Python标准库的使用。学生将学习如何使用文件操作、异常处理以及数据结构等来管理银行账户信息,实现基本的银行操作。

学习大纲

  1. 系统需求分析
  2. 设计银行账户类
  3. 实现基本银行操作
  4. 文件操作与数据持久化
  5. 异常处理
  6. 系统测试与验证
  7. 总结与扩展

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__ 方法用于初始化账户信息。
  • depositwithdraw 方法用于处理存款和取款操作。
  • 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. 存款和取款操作
  3. 查询余额
  4. 文件读写操作

测试用例示例

测试用例序号测试内容预期结果
1创建新账户账户创建成功
2存款500余额应为500
3取款200余额应为300
4查询余额返回300
5存款-100抛出异常
6取款400抛出异常

7. 总结与扩展

本课小结

本次课程通过构建简易银行系统,深入了解了Python标准库在文件操作、数据结构和异常处理方面的应用。同时也学习了如何实现一个简单的命令行用户交互程序。

扩展思考

未来,我们可以将此系统扩展为一个支持多用户并发操作的应用程序。例如,通过引入数据库(如SQLite)来存储账户信息,或使用Flask等框架构建Web应用,提供更加灵活的用户界面。此外,还可以加入用户身份验证、交易记录等更复杂的功能。

结束语

希望同学们通过本节课的学习能够掌握Python标准库的使用,并能在实际项目中灵活应用这些知识。


练习题

  1. 请扩展银行系统,加入账户信息修改功能。
  2. 请实现账户交易记录功能,记录每次存取款的详细信息。
  3. 尝试将此系统封装为一个模块,以便在其他项目中重用。

怎么样今天的内容还满意吗?再次感谢观众老爷的观看。
最后,祝您早日实现财务自由,还请给个赞,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/53841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何禁止电脑上某个软件运行?电脑设置禁止运行软件的4个方法速成

在日常使用电脑的过程中&#xff0c;可能会遇到需要禁止某些软件运行的情况。 无论是为了防止员工随意使用与工作无关的软件&#xff0c;还是为了管理孩子的电脑使用时间&#xff0c;禁止特定软件运行都是有效的解决方案。 下面介绍4个速成方法&#xff0c;帮你轻松禁止电脑上…

QQ机器人搭建

使用QQ官方机器人Python SDK和三方框架搭建QQ群聊机器人 文章目录 使用QQ官方机器人Python SDK和三方框架搭建QQ群聊机器人前言编写机器人代码机器人监听群聊进行文字回复机器人监听群聊进行图片回复机器人监听群聊进行文件发送机器人监听群聊进行视频发送机器人监听群聊进行语…

3.js - 运动曲线

这个球&#xff0c;绕着这个红色的线圈转 代码 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlslet scene,camera,renderer,controls nulllet moon,earth null// 根据&#xff0c;一系列的点&#xff0c;创建曲线 le…

【全新课程】正点原子《基于GD32 ARM32单片机项目实战入门》培训课程上线!

正点原子《基于GD32 ARM32单片机项目实战入门》全新培训课程上线啦&#xff01;正点原子工程师手把手教你学&#xff01;彻底解决ARM32单片机项目入门难的问题&#xff01; 一、课程介绍 本课程专为ARM32单片机的入门学习者设计&#xff0c;涵盖了环境搭建、编程软件使用、模…

ML 系列:机器学习和深度学习的深层次总结(08)—欠拟合、过拟合,正确拟合

ML 系列赛&#xff1a;第 9 天 — Under、Over 和 Good Fit 文章目录 一、说明二、了解欠拟合、过拟合和实现正确的平衡三、关于泛化四、欠拟合五、过拟合六、适度拟合七、结论 一、说明 在有监督学习过程中&#xff0c;对于指定数据集进行训练&#xff0c;训练结果存在欠拟合…

微软Win11 22H2/23H2 九月可选更新KB5043145发布!

系统之家于9月27日发出最新报道&#xff0c;微软针对Windows11系统&#xff0c;发布了九月最新可选更新补丁KB5043145&#xff0c;22H2用户安装后&#xff0c;系统版本号升至22621.4249&#xff0c;23H2用户安装后升至22631.4249。本次更新修复了Edge使用IE模式有时会停止响应等…

本地部署开源在线PPT制作与演示应用PPTist并实现异地远程使用

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统环境本地部署开源在线演示文稿应用PPTist&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问与使用该项目。 PPTist …

远程访问软路由

远程访问软路由主要涉及通过互联网从远程位置访问和控制基于软件的路由器系统。以下是远程访问软路由的一般方法&#xff1a; 一、远程访问软路由的方法 通过Web管理界面访问&#xff1a; 适用于大多数支持Web管理的软路由系统。用户只需在浏览器中输入软路由的公网IP地址或域…

[Linux#58][HTTP] 自己构建服务器 | 实现网页分离 | 设计思路

目录 一. 最简单的HTTP服务器 二.服务器 2.0 Protocol.hpp httpServer.hpp 子进程的创建和退出 子进程退出的意义 父进程关闭连接套接字 httpServer.cc argc (argument count) argv (argument vector) 三.服务器和网页分离 思考与补充&#xff1a; 一. 最简单的HTT…

ONFI 5.1:定义、缩写语和约定

address 该地址由一个行地址和一个列地址组成。行地址标识要访问的page、block和LUN。列地址标识要访问的page中的byte或word。 asynchronous 异步是指数据用WE_n信号进行写&#xff0c;RE_n信号进行读。 block 由多个page组成&#xff0c;是擦除操作的最小可寻址单元。 column…

安卓开发板_MTK开发板_联发科开发评估套件Demo板接口介绍

开发板是一种功能丰富的电路平台&#xff0c;专为开发人员设计&#xff0c;集成了多种传感器、扩展接口和通信模块。这使得开发者能够高效进行原型设计和功能验证&#xff0c;极大地简化了软硬件开发的过程。 此次介绍的安卓开发板由MT8788核心板与底板构成&#xff0c;特别之处…

OpenCV视频I/O(5)视频采集类VideoCapture之从视频流中获取下一帧的函数grab()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从视频文件或捕获设备中抓取下一帧。 grab() 函数是 OpenCV 中 VideoCapture 类的一个成员函数&#xff0c;用于从视频流中获取下一帧而不立即检…

AB plc设备数据 转profinet IO项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集AB PLC数据 2 5 用PROFINET IO协议转发数据 4 6 案例总结 7 1 案例说明 设置网关采集AB PLC数据把采集的数据转成profinet IO协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX网关是协议转换网关&#xff0…

Vue.js与Flask/Django全栈开发实战:从零搭建前后端分离的高效Web应用,打造现代化全栈开发体验!

将Vue.js与Flask或Django等后端框架配合使用&#xff0c;可以构建一个全栈的Web应用。以下是一个简要的指南&#xff0c;介绍如何将Vue.js与Flask或Django结合使用。 1. 准备工作 确保你已经安装了Node.js、npm&#xff08;或yarn&#xff09;以及Python和相应的包管理工具&am…

【系统交付资料】软件文档交付清单整理套用原件(Word,PPT,Excel)

软件文档交付清单是指在软件开发项目完成后&#xff0c;开发团队需要准备的一份详细清单&#xff0c;用于确保交付的软件产品符合客户需求并达到预期的质量标准。以下是软件文档交付清单中可能包含的一些关键要素 软件资料清单列表部分文档清单&#xff1a;工作安排任务书&…

CSS的弹性盒子模型(Flex box)

弹性盒子模型是CSS3的一种新的布局模式&#xff0c;弹性盒是一种当页面需要适应不同的屏幕大小以及设备类型时确保拥有合适的布局方式&#xff0c;引入弹性盒子模型的目的时提供更加有效的方式来对一个容器中的子元素进行排列&#xff0c;对齐和分配空白空间。 弹性盒子由弹性容…

高密度EEG人脑成像:技术与应用

摘要 EEG是一种非侵入性的人脑神经活动测量技术。随着数字技术的进步&#xff0c;EEG分析已从定性分析幅值和频率调制发展到全面分析记录信号的复杂时空特征。EEG能够在亚秒级的时间范围内测量神经过程&#xff0c;但其空间分辨率较低&#xff0c;这使得难以准确可靠地定位EEG…

unix中父进程如何获取子进程的终止状态

一、前言 本文将介绍在unix系统中&#xff0c;父进程如何获取子进程的终止状态。本文主要围绕如下函数展开&#xff1a; 1.wait 2.waitpid 3.waitid 4.wait3、wait4 在讨论这些函数前&#xff0c;先介绍一个进程从创建到释放子进程的过程。 二、子进程的创建以及终止 在unix…

【JAVA开源】基于Vue和SpringBoot的师生健康管理系统

博主说明&#xff1a;本文项目编号 T 052 &#xff0c;文末自助获取源码 \color{red}{T052&#xff0c;文末自助获取源码} T052&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

InfluxDB数据库在Windows中的部署与运行

本文介绍在Windows电脑中&#xff0c;下载、安装、部署并运行InfluxDB数据库服务的方法。 InfluxDB是一个开源的时间序列数据库&#xff0c;专为处理时间序列数据而设计。它最初发布于2013年&#xff0c;目前已被广泛应用于监控、日志记录、物联网、实时分析等领域&#xff0c;…