1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| import ast import statistics import re
def safe_float_input(prompt: str, min_value: float = None, max_value: float = None) -> float: """安全获取浮点数输入。
Args: prompt (str): 提示信息 min_value (float, optional): 最小值限制,默认为None max_value (float, optional): 最大值限制,默认为None
Returns: float: 验证通过的浮点数值
Raises: ValueError: 如果输入验证失败 """ return validate_input( prompt, data_type=float, min_value=min_value, max_value=max_value )
def safe_list_input(prompt: str, element_type: type = int) -> list: """安全获取列表输入。
Args: prompt (str): 提示信息 element_type (type, optional): 列表元素类型,默认为int
Returns: list: 验证通过的列表
Raises: ValueError: 如果输入验证失败 """ while True: try: user_input = input(prompt).strip()
list_pattern = r"^\[(?:\s*" + re.escape(element_type.__name__) + r"\s*,?\s*)+\]$" if not re.fullmatch(list_pattern, user_input): print(f"输入格式不符合要求,应为类似 [1, 2, 3] 的{element_type.__name__}列表,请重新输入!") continue
value = ast.literal_eval(user_input)
if not isinstance(value, list): raise ValueError("输入不是列表类型")
if not all(isinstance(item, element_type) for item in value): raise ValueError(f"列表中包含非{element_type.__name__}类型元素")
return value
except (ValueError, SyntaxError) as e: print(f"输入无效:{e},请重新输入!")
def process_finances(): """财务数据处理工具。"""
print("\n=== 收入数据录入 ===") income_data = safe_list_input("请输入月收入数据(单位:元,如 [5000, 6000, 5500]):", float)
print("\n=== 支出数据录入 ===") expense_data = safe_list_input("请输入月支出数据(单位:元,如 [3000, 3500, 3200]):", float)
print("\n=== 财务分析 ===") print("正在计算财务指标...")
total_income = sum(income_data) avg_income = statistics.mean(income_data) max_income = max(income_data) min_income = min(income_data)
total_expense = sum(expense_data) avg_expense = statistics.mean(expense_data) max_expense = max(expense_data) min_expense = min(expense_data)
profit = [inc - exp for inc, exp in zip(income_data, expense_data)] total_profit = sum(profit) avg_profit = statistics.mean(profit) if any(p < 0 for p in profit): loss_months = [i+1 for i, p in enumerate(profit) if p < 0] print(f"注意:第 {', '.join(map(str, loss_months))} 个月出现亏损")
print("\n=== 财务报告 ===") print(f"月份:{len(income_data)}") print(f"总收入:{total_income:,.2f} 元") print(f"平均收入:{avg_income:,.2f} 元") print(f"最高收入:{max_income:,.2f} 元") print(f"最低收入:{min_income:,.2f} 元")
print(f"总支出:{total_expense:,.2f} 元") print(f"平均支出:{avg_expense:,.2f} 元") print(f"最高支出:{max_expense:,.2f} 元") print(f"最低支出:{min_expense:,.2f} 元")
print(f"总利润:{total_profit:,.2f} 元") print(f"平均利润:{avg_profit:,.2f} 元")
print("\n=== 详细财务数据 ===") print("月份\t收入\t支出\t利润")
for month, inc, exp, pro in enumerate(zip(income_data, expense_data, profit), 1): print(f"{month}\t{inc[0]:>9,.2f}\t{inc[1]:>9,.2f}\t{inc[2]:>9,.2f}")
print("\n=== 对比分析 ===") print("收入与支出对比:")
print("{:<10} {:>15} {:>15}".format("指标", "收入", "支出")) print("{:<10} {:>15,.2f} {:>15,.2f}".format("总和", total_income, total_expense)) print("{:<10} {:>15,.2f} {:>15,.2f}".format("平均", avg_income, avg_expense)) print("{:<10} {:>15,.2f} {:>15,.2f}".format("最高", max_income, max_expense)) print("{:<10} {:>15,.2f} {:>15,.2f}".format("最低", min_income, min_expense))
process_finances()
|