You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求优化Python代码:将重复月份选择逻辑封装为函数

精简Python代码:消除重复的月份选择逻辑

你的代码核心问题是年份与CSV文件的绑定逻辑和月份选择逻辑大量重复,可通过以下方式彻底精简:

优化思路

  • 用字典建立年份到CSV路径的映射,替代冗长的if-elif分支
  • 将月份选择逻辑封装成独立函数,传入已读取的DataFrame即可,无需关心对应哪个CSV
  • 优化输入验证逻辑,减少重复判断

精简后的完整代码

import pandas as pd

# 年份对应的CSV路径映射,统一管理更易维护
YEAR_CSV_MAP = {
    2018: "C:\\Users\\seena\\OneDrive\\Desktop\\2022-11-18 20.55.00\\Project csv ETHERIUM2018.csv",
    2019: "C:\\Users\\seena\\OneDrive\\Desktop\\2022-11-18 20.55.00\\Project csv ETHERIUM Y(2).csv",
    2020: "C:\\Users\\seena\\OneDrive\\Desktop\\2022-11-18 20.55.00\\Project csv ETHERIUM Y(3).csv"
}

def show_year_options():
    print("输入'2018'选择2018年数据")
    print("输入'2019'选择2019年数据")
    print("输入'2020'选择2020年数据")
    print("输入'0'退出选择")

def select_month(df):
    """接收DataFrame,处理月份选择逻辑"""
    while True:
        try:
            month = int(input("请输入月份(仅数字,输入0退出):"))
            if month == 0:
                break
            elif 1 <= month <= 12:
                # 月份转索引:1月对应索引0,以此类推
                print(df.loc[month - 1])
            else:
                print("无效选项,请输入1-12之间的数字或0退出")
        except ValueError:
            print("请输入有效数字")

def select_etherium_data():
    show_year_options()
    while True:
        try:
            year_choice = int(input("选择年份:"))
            if year_choice == 0:
                break
            # 通过映射字典获取CSV路径,无需多个if判断
            csv_path = YEAR_CSV_MAP.get(year_choice)
            if csv_path:
                df = pd.read_csv(csv_path)
                select_month(df)
            else:
                print("无效选项,请输入2018/2019/2020或0退出")
        except ValueError:
            print("请输入有效数字")

select_etherium_data()

代码优势

  • 可维护性:新增年份只需在YEAR_CSV_MAP里添加键值对,无需修改业务逻辑
  • 无重复代码:月份选择逻辑只写一次,无论哪个年份的CSV都复用同一函数
  • 输入验证更健壮:捕获非数字输入异常,避免程序崩溃

内容的提问来源于stack exchange,提问作者Athul Tomy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:21:31