跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python 入门实战:3 个练手小项目(含代码)

介绍三个 Python 入门实战项目:控制台计算器练习函数与异常处理;批量改文件名工具掌握文件操作模块;账单统计工具学习 CSV 数据处理。所有项目均使用 Python 内置库实现,包含完整代码与注释,适合巩固基础语法与实际应用能力。

DataScient发布于 2026/3/22更新于 2026/5/3125K 浏览
Python 入门实战:3 个练手小项目(含代码)

学完 Python 基础语法后,关键在于实战应用。本文分享 3 个适合入门的项目,涵盖交互逻辑、文件操作、数据统计,均使用 Python 内置库实现,包含完整代码与注释。

项目 1:控制台计算器(巩固函数 + 异常处理)

1. 项目需求
  1. 支持加减乘除 4 种基本运算;
  2. 能连续计算(算完一次后可继续算,不用重启程序);
  3. 处理异常情况:输入不是数字、除法除数为 0、输入无效运算符。
2. 实现思路
  1. 用 while True 实现连续计算,按 q 退出;
  2. 用函数 calculate(num1, num2, op) 封装计算逻辑;
  3. 用 try-except 捕获输入错误(非数字、除数为 0);
  4. 先获取用户输入的两个数字和运算符,再调用计算函数,最后输出结果。
3. 完整代码
def calculate(num1, num2, op):
    """
    计算两个数的运算结果
    参数:
        num1: 第一个数字(float)
        num2: 第二个数字(float)
        op: 运算符(+、-、*、/)
    返回:
        运算结果(float),若运算符无效返回 None
    """
    if op == '+':
        return num1 + num2
    elif op == '-':
        return num1 - num2
    elif op == '*':
        return num1 * num2
    elif op == '/':
        # 处理除法除数为 0 的情况(这里先判断,也可在调用时用 try-except)
        if num2 == 0:
            print("❌ 错误:除数不能为 0!")
            return None
        return num1 / num2
    else:
        print(f"❌ 错误:无效运算符 '{op}',仅支持 +、-、*、/")
        return None

# 主程序:连续计算逻辑
print("=" * 30)
print()
()
( * )
 :
    
    input_str = ()
     input_str.strip().lower() == :
        ()
          
    
    parts = input_str.strip().split()
     (parts) != :
        ()
          
    num1_str, op, num2_str = parts
    
    :
        num1 = (num1_str)  
        num2 = (num2_str)
     ValueError:
        ()
        
    
    result = calculate(num1, num2, op)
     result   :  
        ()
" Python 控制台计算器"
print
" 支持 +、-、*、/ 运算,输入 q 退出"
print
"="
30
while
True
# 1. 获取用户输入(支持退出)
input
"\n请按格式输入(例:3 + 5):"
if
'q'
print
"👋 程序退出,再见!"
break
# 退出循环,结束程序
# 2. 解析输入(按空格分割成数字 1、运算符、数字 2)
if
len
3
print
"❌ 输入格式错误!请按 '数字运算符数字' 格式输入(例:3 + 5)"
continue
# 跳过本次循环,重新输入
# 3. 转换数字(处理非数字输入)
try
float
# 支持小数输入
float
except
print
"❌ 错误:请输入有效的数字(例:3、5.2)"
continue
# 4. 调用计算函数并输出结果
if
is
not
None
# 只有计算成功时才输出结果
print
f"✅ 结果:{num1} {op} {num2} = {result}"
4. 运行步骤
  1. 将代码保存为 .py 文件;
  2. 运行程序,按提示输入(例:10 - 5);
  3. 想退出时输入 q 即可。
5. 拓展建议
  1. 新增运算:比如平方(**)、开方(用 math.sqrt());
  2. 记忆功能:记录上一次的计算结果,下次可直接用 last 代表上一次结果。

项目 2:批量改文件名(掌握文件操作)

1. 项目需求
  1. 批量给文件夹里的文件加前缀 / 后缀(例:把'1.jpg'改成'旅行_1.jpg');
  2. 批量替换文件名中的字符(例:把'2024_照片.jpg'改成'2025_照片.jpg');
  3. 处理异常:目标文件夹不存在、文件夹为空、文件重名。
2. 实现思路
  1. 用 os 模块操作文件(os.listdir() 遍历文件、os.rename() 改文件名);
  2. 让用户选择'加前缀 / 后缀'或'替换字符'模式;
  3. 验证目标文件夹是否存在,避免路径错误;
  4. 遍历文件时跳过文件夹(只改文件,不改子文件夹)。
3. 完整代码
import os

def batch_rename_files(folder_path, mode=1, prefix="", suffix="", old_char="", new_char=""):
    """
    批量修改文件名
    参数:
        folder_path: 目标文件夹路径(例:"C:/Photos" 或 "./my_files")
        mode: 操作模式(1=加前缀/后缀,2=替换字符)
        prefix: 前缀(mode=1 时用)
        suffix: 后缀(mode=1 时用,加在文件名和扩展名之间)
        old_char: 要替换的旧字符(mode=2 时用)
        new_char: 替换后的新字符(mode=2 时用)
    """
    # 1. 验证文件夹是否存在
    if not os.path.exists(folder_path):
        print(f"❌ 错误:文件夹 '{folder_path}' 不存在!")
        return
    if not os.path.isdir(folder_path):
        print(f"❌ 错误:'{folder_path}' 不是文件夹!")
        return
    # 2. 遍历文件夹中的所有文件/文件夹
    file_list = os.listdir(folder_path)
    if len(file_list) == 0:
        print(f"ℹ️ 提示:文件夹 '{folder_path}' 为空,无需修改。")
        return
    modified_count = 0  # 记录修改成功的文件数
    for filename in file_list:
        # 跳过子文件夹(只处理文件)
        file_path = os.path.join(folder_path, filename)
        if os.path.isdir(file_path):
            continue  # 是文件夹,跳过
        # 分离文件名和扩展名(例:"1.jpg" → 文件名"1",扩展名".jpg")
        name, ext = os.path.splitext(filename)
        # 新文件名
        # 3. 根据模式生成新文件名
        if mode == 1:
            # 模式 1:加前缀和后缀(例:name=1, prefix=旅行_, suffix=_2024 → 旅行_1_2024.jpg)
            new_name = f"{prefix}{name}{suffix}{ext}"
        elif mode == 2:
            # 模式 2:替换字符(例:name=2024_照片 → 替换 2024 为 2025 → 2025_照片.jpg)
            if old_char not in name:
                print(f"ℹ️ 提示:文件 '{filename}' 中没有 '{old_char}',跳过。")
                continue
            new_name = f"{name.replace(old_char, new_char)}{ext}"
        else:
            print("❌ 错误:无效模式!仅支持 1(加前缀/后缀)或 2(替换字符)。")
            return
        # 4. 生成新旧文件的完整路径(避免路径错误)
        old_full_path = os.path.join(folder_path, filename)
        new_full_path = os.path.join(folder_path, new_name)
        # 5. 避免新文件名已存在(防止覆盖)
        if os.path.exists(new_full_path):
            print(f"❌ 错误:文件 '{new_name}' 已存在,跳过 '{filename}'。")
            continue
        # 6. 执行重命名
        try:
            os.rename(old_full_path, new_full_path)
            print(f"✅ 成功:{filename} → {new_name}")
            modified_count += 1
        except Exception as e:
            print(f"❌ 失败:修改 '{filename}' 时出错 → {e}")
    # 7. 输出最终结果
    print(f"\n✅ 批量修改完成!共处理 {len(file_list)} 个文件,成功修改 {modified_count} 个。")

# 主程序:用户交互
if __name__ == "__main__":
    print("=" * 30)
    print("    Python 批量改文件名工具")
    print("=" * 30)
    # 1. 获取目标文件夹路径(建议用相对路径,例:"./my_photos",表示当前文件夹下的 my_photos)
    folder = input("请输入目标文件夹路径:").strip()
    # 2. 选择操作模式
    print("\n请选择操作模式:")
    print("1. 给文件名加前缀/后缀(例:1.jpg → 旅行_1_2024.jpg)")
    print("2. 替换文件名中的字符(例:2024_照片.jpg → 2025_照片.jpg)")
    mode = input("输入模式编号(1/2):").strip()
    # 3. 根据模式获取参数并调用函数
    if mode == "1":
        prefix = input("请输入前缀(例:旅行_,无则按回车):").strip()
        suffix = input("请输入后缀(例:_2024,无则按回车):").strip()
        batch_rename_files(folder, mode=1, prefix=prefix, suffix=suffix)
    elif mode == "2":
        old_char = input("请输入要替换的旧字符(例:2024):").strip()
        new_char = input("请输入替换后的新字符(例:2025):").strip()
        if not old_char:
            print("❌ 错误:要替换的旧字符不能为空!")
        else:
            batch_rename_files(folder, mode=2, old_char=old_char, new_char=new_char)
    else:
        print("❌ 错误:无效模式!请输入 1 或 2。")
4. 运行步骤
  1. 准备一个文件夹(例:./my_photos,放在代码文件同一目录下),里面放几个测试文件(如图片、文档);
  2. 运行代码,输入文件夹路径(相对路径直接输 ./my_photos,绝对路径输 C:/Users/XXX/Desktop/my_photos);
  3. 选择模式:比如选 1,输入前缀'旅行_',后缀'_2024',即可批量修改。
5. 拓展建议
  1. 按文件类型筛选:只修改 .jpg 或 .txt 文件;
  2. 按顺序编号:把'文件 1.jpg''文件 2.jpg'改成'001.jpg''002.jpg'(补零对齐)。

项目 3:账单统计工具(处理实际数据)

1. 项目需求
  1. 读取 CSV 格式的账单文件(日常消费记录,含'日期、分类、金额、备注');
  2. 统计核心数据:总支出、平均每次支出、各分类支出(如餐饮、交通)及占比;
  3. 处理异常:账单文件不存在、文件格式错误、金额不是数字。
2. 实现思路
  1. 用 csv 模块读取 CSV 文件(Python 内置,无需装包);
  2. 用字典 category_total 统计各分类的总金额;
  3. 计算总支出、平均支出、分类占比;
  4. 用 try-except 处理文件读取和数据转换错误。
3. 完整代码
第一步:准备账单 CSV 文件

先在代码同一目录下创建 bill.csv 文件,内容如下(每行是一条消费记录):

日期,分类,金额,备注
2024-10-01,餐饮,35.5,早餐
2024-10-02,交通,8,地铁
2024-10-03,餐饮,68,晚餐
2024-10-05,购物,199,衣服
2024-10-07,交通,2,公交
2024-10-09,餐饮,45,午餐
2024-10-10,娱乐,80,电影
第二步:账单统计代码
import csv
import os

def analyze_bill(csv_file_path):
    """
    分析 CSV 格式的账单文件
    参数:
        csv_file_path: CSV 账单文件路径(例:"./bill.csv")
    返回:
        统计结果字典(总支出、平均支出、分类统计等),出错则返回 None
    """
    # 初始化统计变量
    total_amount = 0.0  # 总支出
    record_count = 0    # 消费记录条数
    category_total = {} # 分类统计:key=分类名,value=该分类总金额
    required_columns = ["日期", "分类", "金额"]  # 必须包含的列
    # 1. 验证文件是否存在
    if not os.path.exists(csv_file_path):
        print(f"❌ 错误:账单文件 '{csv_file_path}' 不存在!")
        return None
    if not csv_file_path.endswith(".csv"):
        print(f"❌ 错误:'{csv_file_path}' 不是 CSV 文件!")
        return None
    # 2. 读取 CSV 文件并统计
    try:
        with open(csv_file_path, mode='r', encoding='utf-8') as file:
            # 用 DictReader 读取,每行数据按列名存储(方便获取'分类''金额')
            reader = csv.DictReader(file)
            # 检查 CSV 文件是否包含必需的列
            for col in required_columns:
                if col not in reader.fieldnames:
                    print(f"❌ 错误:CSV 文件缺少必需的列 '{col}'!")
                    return None
            # 遍历每一条消费记录
            for row_num, row in enumerate(reader, start=2):  # row_num 从 2 开始(表头是 1 行)
                record_count += 1
                # 获取当前记录的分类和金额
                category = row["分类"].strip()
                amount_str = row["金额"].strip()
                # 3. 转换金额为数字(处理非数字金额)
                try:
                    amount = float(amount_str)
                    if amount < 0:
                        print(f"ℹ️ 提示:第{row_num}行金额为负数({amount}),按正数统计。")
                        amount = abs(amount)
                except ValueError:
                    print(f"❌ 错误:第{row_num}行金额 '{amount_str}' 不是有效数字,跳过该记录。")
                    record_count -= 1  # 跳过的记录不计入总数
                    continue
                # 4. 累加总金额和分类金额
                total_amount += amount
                # 更新分类统计:如果分类已存在,累加金额;否则新增分类
                if category in category_total:
                    category_total[category] += amount
                else:
                    category_total[category] = amount
        # 5. 计算衍生统计数据(避免除以零)
        avg_amount = total_amount / record_count if record_count > 0 else 0.0
        # 计算各分类占比(保留 2 位小数)
        category_ratio = {}
        for cat, amt in category_total.items():
            ratio = (amt / total_amount) * 100 if total_amount > 0 else 0.0
            category_ratio[cat] = round(ratio, 2)
        # 6. 整理统计结果
        result = {
            "总支出": round(total_amount, 2),
            "记录条数": record_count,
            "平均每次支出": round(avg_amount, 2),
            "分类支出": category_total,
            "分类占比 (%)": category_ratio
        }
        return result
    except Exception as e:
        print(f"❌ 读取账单文件时出错:{e}")
        return None

# 主程序:输出统计报告
if __name__ == "__main__":
    print("=" * 30)
    print("    Python 账单统计工具")
    print("=" * 30)
    # 账单文件路径(和代码同一目录,直接用文件名)
    bill_file = "./bill.csv"
    # 调用统计函数
    stats_result = analyze_bill(bill_file)
    # 输出统计结果
    if stats_result:
        print("\n📊 账单统计报告")
        print("-" * 20)
        print(f"总支出:{stats_result['总支出']} 元")
        print(f"消费记录条数:{stats_result['记录条数']} 条")
        print(f"平均每次支出:{stats_result['平均每次支出']} 元")
        print("\n📋 各分类支出统计:")
        # 按支出金额从大到小排序输出分类
        sorted_categories = sorted(stats_result['分类支出'].items(), key=lambda x: x[1], reverse=True)
        for cat, amt in sorted_categories:
            ratio = stats_result['分类占比 (%)'][cat]
            print(f"  {cat}:{amt} 元(占比 {ratio}%)")
4. 运行步骤
  1. 按上面的格式创建 bill.csv 文件(或用自己的账单,确保列名包含'日期、分类、金额');
  2. 把 bill.csv 和代码文件放在同一目录;
  3. 运行代码,即可看到统计报告(总支出、各分类占比等)。
5. 拓展建议
  1. 按日期筛选:统计'10 月份餐饮支出'或'每周支出';
  2. 生成可视化图表:用 matplotlib 库画分类支出饼图(需安装:pip install matplotlib);
  3. 写入统计结果:把统计报告保存到 bill_report.txt 文件中。

总结:实战项目的核心价值

这 3 个项目分别覆盖了 Python 入门的 3 个核心场景:

  1. 计算器:巩固函数、循环、异常处理(基础逻辑);
  2. 批量改文件名:掌握 os 模块(文件操作,实用工具);
  3. 账单统计:学会 csv 模块(数据处理,贴近实际需求)。

每个项目都能直接用在生活中,比如用批量改文件名整理照片,用账单统计管理开支。建议先跑通完整代码,再根据'拓展建议'自己修改功能 —— 比如给计算器加开方运算,给账单统计加图表,这样才能真正把知识变成技能。

目录

  1. 项目 1:控制台计算器(巩固函数 + 异常处理)
  2. 1. 项目需求
  3. 2. 实现思路
  4. 3. 完整代码
  5. 主程序:连续计算逻辑
  6. 4. 运行步骤
  7. 5. 拓展建议
  8. 项目 2:批量改文件名(掌握文件操作)
  9. 1. 项目需求
  10. 2. 实现思路
  11. 3. 完整代码
  12. 主程序:用户交互
  13. 4. 运行步骤
  14. 5. 拓展建议
  15. 项目 3:账单统计工具(处理实际数据)
  16. 1. 项目需求
  17. 2. 实现思路
  18. 3. 完整代码
  19. 第一步:准备账单 CSV 文件
  20. 第二步:账单统计代码
  21. 主程序:输出统计报告
  22. 4. 运行步骤
  23. 5. 拓展建议
  24. 总结:实战项目的核心价值
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 前端 Vue 项目打包及部署详解
  • LeetCode 141 题:环形链表检测算法
  • 计算机技能如何助力职业拓展与转型
  • 数据结构基础:树与二叉树定义及遍历算法
  • BILIVE 部署与运行常见问题排查指南
  • AI 编程助手横向评测:GitHub Copilot vs CodeWhisperer vs Cursor
  • AI 入门系列:常见术语解释与误区澄清
  • 数据结构基础:顺序表的定义与实现
  • RetinaFace+CurricularFace 人脸识别推理脚本调试与避坑指南
  • FastAPI:Python 高性能 Web 框架核心解析
  • 从 Webhook 到 AI Agent:钉钉周报机器人演进实践
  • VS Code 搭配 GitHub Copilot 如何节省高级模型额度
  • 利用 ChatGPT 提升文案创作与私域运营效率指南
  • 分布式文件系统 HDFS 存储原理
  • Flutter 三方库 anthropic_sdk_dart 在鸿蒙系统的适配指南
  • 苹果 AI 应用布局与产业生态优势分析
  • WSL2 Ubuntu 24.04 下 OpenGL 无法调用 NVIDIA 显卡的解决方法
  • 大模型 Agent 核心解析:Prompt、架构与挑战
  • OpenClaw Web Search 配置与渠道选择指南
  • Linux 系统安装与部署 Miniconda 详细教程

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online