如何编写Python函数实现3天POS销售交易金额汇总与交易笔数统计
POS销售统计功能优化指导
你当前的代码逻辑已经能实现需求,但还有不少可以简化、提升可维护性的空间,以下是具体的优化方案和指导:
现有代码可优化点
- 冗余变量过多:你定义的
sun、sales、door、hdr等变量实际没有参与后续计算,完全可以删除 - 重复代码冗余:周五/周六/周日的统计逻辑完全一致,用3组独立变量存储会导致后续扩展(比如加周四统计)时需要重复加变量和判断逻辑
- 不必要的重复计算:总销售额和总笔数的计算放在了循环内,每次遍历都会重新算一次,实际只需要循环结束后算一次即可
- 缺少必要依赖导入:代码开头没有导入
csv模块,直接运行会报错 - 魔法数可读性差:代码里直接写的
row[11]、row[21],时间长了很容易忘记对应的列含义,维护成本高
优化后实现代码
import csv # 定义常量代替魔法数,修改列位置时只需要改这里 AMOUNT_COL = 11 WEEKDAY_COL = 21 # 定义需要统计的日期,后续加日期只需要修改这个字典 TARGET_DAYS = { "Friday": {"count": 0, "sales": 0.0}, "Saturday": {"count": 0, "sales": 0.0}, "Sunday": {"count": 0, "sales": 0.0} } def calculate_3day_pos_sales(csv_path: str = "POS.csv"): with open(csv_path, 'r', encoding='utf-8') as csvfile: reader = csv.reader(csvfile, delimiter=',') # 直接跳过表头,不需要额外的标志变量 next(reader) for row in reader: weekday = row[WEEKDAY_COL].strip() if weekday in TARGET_DAYS: TARGET_DAYS[weekday]["count"] += 1 TARGET_DAYS[weekday]["sales"] += float(row[AMOUNT_COL].strip()) # 循环结束后统一计算总数据 total_sales = sum(day_info["sales"] for day_info in TARGET_DAYS.values()) total_count = sum(day_info["count"] for day_info in TARGET_DAYS.values()) avg_sale = total_sales / total_count if total_count != 0 else 0.0 # 可按天输出明细 for day, info in TARGET_DAYS.items(): print(f"{day} 交易笔数:{info['count']},销售额:{info['sales']:.2f}") print(f"3天总销售额:{total_sales:.2f},3天单客平均消费:{avg_sale:.2f}") return total_sales, avg_sale if __name__ == "__main__": calculate_3day_pos_sales()
新手开发注意事项
- 可以额外加异常捕获逻辑,比如处理
FileNotFoundError(csv文件不存在)、ValueError(金额列转float失败)的情况,避免程序直接崩溃 - 如果后续需要处理更大的csv文件,也可以用
pandas库处理,代码会更简洁,不过新手阶段先把标准库csv的用法搞懂更合适 - 尽量把功能封装成函数,不要所有逻辑都写在全局,方便后续复用和调试
内容的提问来源于stack exchange,提问作者TheBeginner
相关产品推荐
相关产品推荐

