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

news2024/9/29 17:39:24

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_id
        self.owner = owner
        self.balance = balance
    
    def deposit(self, amount):
        if amount > 0:
            self.balance += amount
            return self.balance
        else:
            raise ValueError("存款金额必须大于0")

    def withdraw(self, amount):
        if 0 < amount <= self.balance:
            self.balance -= amount
            return self.balance
        else:
            raise ValueError("取款金额无效")

    def get_balance(self):
        return self.balance

    def __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("退出系统")
            break

        else:
            print("无效操作,请重试")

if __name__ == "__main__":
    main()

运行流程图

以下是系统操作的流程图,展示了不同操作的逻辑流程:

┌───────────────┐
│  开始         │
└─────┬─────────┘
      │
      ▼
┌───────────────┐
│  选择操作     │
└─────┬─────────┘
      │
 ┌────┴─────┐
 │          │
 ▼          ▼
创建账户   查询余额
 │          │
 │          ▼
 │       账户存在?
 ▼          │
存款操作   ┌─────┐
 │          │  是 │
 └─────────>│显示│
      │       └─────┘
取款操作      │
      │       ┌─────┐
      │       │  否 │
      │       └─────┘
      │          │ 
 ┌────▼────┐    │
 │获取余额 │<───┘
 └─────────┘
      │
 ┌────▼────┐
 │   退出  │
 └─────────┘

4. 文件操作与数据持久化

为了实现数据的持久化,我们需要将账户信息写入文件。我们可以使用Python的 csv 模块来完成这一功能。

示例代码 - 文件操作

import csv

def 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 = row
                accounts[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 -= amount
    return 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.coloradmin.cn/o/2177447.html

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

相关文章

打造高业绩朋友圈:策略与实践

在数字化时代&#xff0c;朋友圈不仅是个人生活的展示窗口&#xff0c;更是商业变现的有力平台。许多人通过精心经营朋友圈&#xff0c;实现了财富的增长&#xff0c;甚至达到了年入百万的惊人业绩。朋友圈已成为普通人实现逆袭的重要战场。 要打造一个业绩过万的朋友圈&#…

微积分入门(真的很入门)

前置知识 前置知识&#xff1a;极限 我们要求 lim ⁡ x → 1 x 2 − 1 x − 1 \lim\limits_{x \to 1}\dfrac{x^2-1}{x-1} x→1lim​x−1x2−1​。 右边我们都知道是什么意思&#xff0c;那左边是什么呢&#xff1f; 意思就是&#xff0c;当 x x x 无限接近 1 1 1 时&…

Java IO 和 NIO

在 Java 编程中&#xff0c;输入输出&#xff08;IO&#xff09;是不可或缺的部分&#xff0c;随着技术的发展&#xff0c;Java 的 IO 系统也经历了显著的变化。本文将深入探讨 Java IO 和 NIO 的历史、优缺点以及适用场景。 1. Java IO 的历史 Java IO 包&#xff08;java.i…

JVM和GC监控技术

一、监控技术简介 JVM是什么&#xff1f;项目里面有JVM吗&#xff1f;JVM跟Tomcat有什么关系&#xff1f;为什么需要去分析JVM&#xff1f; 1. JVM(全称&#xff1a;Java Virtual Machine)&#xff0c;Java虚拟机 是Java程序运行的环境&#xff0c;它是一个虚构的计算机&…

盛世欢歌,共庆华诞!祝大家国庆节快乐!

举国同庆 盛世中华 盛世欢歌&#xff0c;共庆华诞&#xff01;在这美好的时光里&#xff0c;让我们一起欢庆国庆&#xff0c;感受祖国的强大和美好。数图祝大家国庆快乐&#xff01; 国庆来临之际&#xff0c;根据国家有关规定&#xff0c;现将2024年国庆放假安排通知如下&…

JVM(HotSpot):虚拟机栈(JVM Stacks)与本地方法栈(Native Method Stacks)

文章目录 一、内存结构图二、数据结构-栈三、JVM栈四、本地方法栈五、问题辨析1、垃圾回收是否涉及栈内存&#xff1f;2、栈内存越大越好吗&#xff1f;3、方法内的局部变量是否线程安全&#xff1f;4、栈内存溢出问题 一、内存结构图 二、数据结构-栈 数据结构中&#xff0c;…

windows 系统服务在注册表中的位置

计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services 此注册表项下是系统服务安装信息 利用此注册表项可以获取服务详细信息

新版Android Studio Koala 导入github第三方依赖 maven仓库的处理方法 (java版)

以下是依赖的处理 这是由于Android Studio 构建项目模式发生改变了。 旧版项目构造 创建新的项目采用build.gradle.kts配置。 先看旧版同样的配置是什么样的。 再来查看新版带.kts后缀文件官方自带的库是怎么配置&#xff0c;模拟配置就OK。 先看libs文件这个库的写法。 …

隐藏SpringBoot自动生成的文件

第一种方法——删除 第二种方法——Settings——Editor——fail types

题库系统平台开发功能解析

题库系统开发功能介绍可以从多个方面进行阐述&#xff0c;以下是一些核心功能及其详细解释 1. 题库管理系统 题目录入与编辑&#xff1a;提供灵活的题目录入方式&#xff0c;支持手动输入、批量导入&#xff08;如从Excel、Word等文件中导入&#xff09;以及从其他题库中复制试…

HuggingChat macOS版正式发布!文章内附体验地址!我国打造糖尿病专用AI模型|AI日报

文章推荐 全新豆包AI视频模型发布&#xff01;实测下的可灵与豆包&#xff01;原来它们的差距不止一点点... 今日热点 我国团队打造糖尿病专用AI模型 上海交通大学清源研究院MIFA实验室携手复旦大学附属中山医院内分泌科&#xff0c;组建专家团队&#xff0c;联手开发一款名…

Spring Boot项目连接Oracle数据库启动报错:Undefined Error

描述&#xff1a;远程拉下来的代码&#xff0c;配置了maven仓库后&#xff0c;未进行其他修改&#xff0c;自己本地启动报错。 报错现状&#xff1a; 解决&#xff1a;添加参数-Duser.nameuser后&#xff0c;启动成功。 原因分析&#xff1a; 分析一&#xff1a; maven仓…

Altium Designer脚本系统内置函数汇总(2417个)

Altium Designer脚本系统内置函数汇总(2417个) ↑↑↑点击上方蓝字&#xff0c;关注我们&#xff01; Altium Designer 2013脚本系统内置函数&#xff0c;一共2417个。 这些函数名称复制到Altium Designer 2013脚本编辑器中会自动变为褐红色(#800000)&#xff0c;内部函数大部分…

跨境必备:3个必不可少的低预算营销渠道

不管是跨境电商卖家还是外贸从业人员&#xff0c;从个体到企业或品牌&#xff0c;流量都是宣传营销领域的重点。有流量才能让更多的消费者看到自己的产品&#xff0c;从而有机会了解产品并促成转化。 各大跨境电商平台、社交媒体平台和搜索引擎等平台都提供了付费营销功能&…

16.网络编程(下篇)

目录 1.网络编程概述 2.应用软件架构 3.网络编程三要素-IP地址 4.网络编程三要素-端口与协议 5.UDP通信程序 6.TCP通信程序 1.网络编程概述 1.1计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系…

【问题解决】win10日志错误:创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013

背景 最近win10死机了一次&#xff0c;查看事件管理器发现有大量的报错&#xff1a;“创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013”&#xff0c;如图&#xff1a; 解决 win键搜索internet选项 确定。 原因 参考错误&#xff1a;“ 创建 TLS 客户端凭据…

C++基础知识9 模版进阶

模版进阶 1. 非类型模板参数2. 模板的特化2.1 概念2.2 函数模板特化2.3 类模板特化2.3.1 全特化2.3.2 偏特化2.3.3 类模板特化应用示例 3 模板分离编译3.1 什么是分离编译3.2 模板的分离编译3.3 解决方法 4. 模板总结 1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类…

有些硬盘录像机接入视频汇聚平台EasyCVR后通道不显示/显示不全,该如何处理?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。该平台不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能&#xff0c;还支持多种主流标准协议&#xff0c;如GB28181、RTSP/Onvif、RTMP、部标JT808、GA/T 1400协…

C#获取变量的数据类型_C#获取对象的数据类型

C#中的数据类型用 Type 类描述&#xff0c;具体的类型是 Type的对象 一、object.GetType() 对象.GetType()-----对象不能为null,否则运行报错&#xff1b; 通用的获取类型方式 底层对象获取类型,所有的对象&#xff0c;变量获取类型&#xff0c;GetType()&#xff1b; 返回的…

JAVA打造全球商品集散地国际版多商户商城系统小程序源码

打造全球商品集散地 —— 国际版多商户商城系统 &#x1f30d;【开篇&#xff1a;连接世界&#xff0c;触手可及】&#x1f30d; 在这个全球化的时代&#xff0c;购物不再受地域限制&#xff0c;每一个消费者都渴望能轻松买到来自世界各地的优质商品。而“打造全球商品集散地”…