学完 Python 基础语法后,关键在于实战应用。本文分享 3 个适合入门的项目,涵盖交互逻辑、文件操作、数据统计,均使用 Python 内置库实现,包含完整代码与注释。
Python 入门实战:3 个练手小项目(含代码)
介绍三个 Python 入门实战项目:控制台计算器练习函数与异常处理;批量改文件名工具掌握文件操作模块;账单统计工具学习 CSV 数据处理。所有项目均使用 Python 内置库实现,包含完整代码与注释,适合巩固基础语法与实际应用能力。

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

学完 Python 基础语法后,关键在于实战应用。本文分享 3 个适合入门的项目,涵盖交互逻辑、文件操作、数据统计,均使用 Python 内置库实现,包含完整代码与注释。
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(" Python 控制台计算器")
print(" 支持 +、-、*、/ 运算,输入 q 退出")
print("=" * 30)
while True:
# 1. 获取用户输入(支持退出)
input_str = input("\n请按格式输入(例:3 + 5):")
if input_str.strip().lower() == 'q':
print("👋 程序退出,再见!")
break # 退出循环,结束程序
# 2. 解析输入(按空格分割成数字 1、运算符、数字 2)
parts = input_str.strip().split()
if len(parts) != 3:
print("❌ 输入格式错误!请按 '数字运算符数字' 格式输入(例:3 + 5)")
continue # 跳过本次循环,重新输入
num1_str, op, num2_str = parts
# 3. 转换数字(处理非数字输入)
try:
num1 = float(num1_str) # 支持小数输入
num2 = float(num2_str)
except ValueError:
print("❌ 错误:请输入有效的数字(例:3、5.2)")
continue
# 4. 调用计算函数并输出结果
result = calculate(num1, num2, op)
if result is not None: # 只有计算成功时才输出结果
print(f"✅ 结果:{num1} {op} {num2} = {result}")
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。")
先在代码同一目录下创建 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}%)")
这 3 个项目分别覆盖了 Python 入门的 3 个核心场景:
每个项目都能直接用在生活中,比如用批量改文件名整理照片,用账单统计管理开支。建议先跑通完整代码,再根据'拓展建议'自己修改功能 —— 比如给计算器加开方运算,给账单统计加图表,这样才能真正把知识变成技能。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online