大学python作业
·
题目要求:

python代码实现如下:
# -*- coding: utf-8 -*-
"""
Python 作业:利润表函数设计与类的应用
题目要求对应关系:
1. 函数设计:
- 编写计算主营业务利润、营业利润、净利润等指标的函数;
- 实现利润表各项目之间勾稽关系校验的函数。
2. 类的应用:
- 设计利润表类 ProfitStatement,包含数据属性和方法;
- 实现类的初始化方法,能加载利润表原始数据;
- 封装利润表自动生成、数据更新、指标计算等方法。
说明:题目给出的原始数据只有“收入、办公费、差旅费、招待费、预算”。
因此本程序默认将:
- 办公费 视为 管理费用;
- 差旅费 + 招待费 视为 销售费用;
- 主营业务成本、税金及附加、财务费用等在原始数据缺失时默认为 0;
- 所得税率默认为 25%,但只有利润总额大于 0 时才计算所得税。
如果后续数据中包含“主营业务成本”“税金及附加”“财务费用”等字段,程序也可以自动读取并参与计算。
"""
from __future__ import annotations
import csv
from copy import deepcopy
from typing import Dict, List, Any, Tuple
Number = float
FinanceRow = Dict[str, Any]
# ============================================================
# 一、函数设计部分
# ============================================================
def to_number(value: Any, default: Number = 0.0) -> Number:
"""将输入值安全转换为数字;无法转换时返回默认值。"""
try:
return float(value)
except (TypeError, ValueError):
return default
def calc_main_business_profit(
revenue: Number,
main_business_cost: Number = 0.0,
tax_and_surcharge: Number = 0.0,
) -> Number:
"""
计算主营业务利润。
主营业务利润 = 主营业务收入 - 主营业务成本 - 税金及附加
"""
return revenue - main_business_cost - tax_and_surcharge
def calc_operating_profit(
main_business_profit: Number,
selling_expense: Number = 0.0,
management_expense: Number = 0.0,
financial_expense: Number = 0.0,
other_business_profit: Number = 0.0,
investment_income: Number = 0.0,
) -> Number:
"""
计算营业利润。
简化公式:
营业利润 = 主营业务利润 + 其他业务利润 + 投资收益
- 销售费用 - 管理费用 - 财务费用
"""
return (
main_business_profit
+ other_business_profit
+ investment_income
- selling_expense
- management_expense
- financial_expense
)
def calc_total_profit(
operating_profit: Number,
non_operating_income: Number = 0.0,
non_operating_expense: Number = 0.0,
) -> Number:
"""
计算利润总额。
利润总额 = 营业利润 + 营业外收入 - 营业外支出
"""
return operating_profit + non_operating_income - non_operating_expense
def calc_net_profit(total_profit: Number, income_tax_expense: Number = 0.0) -> Number:
"""
计算净利润。
净利润 = 利润总额 - 所得税费用
"""
return total_profit - income_tax_expense
def check_profit_relations(statement: FinanceRow, tolerance: Number = 1e-6) -> Tuple[bool, List[str]]:
"""
校验利润表主要项目之间的勾稽关系。
返回:
- True/False:是否全部通过;
- messages:校验说明。
"""
messages: List[str] = []
department = statement.get("部门", "未知部门")
revenue = to_number(statement.get("收入"))
main_business_cost = to_number(statement.get("主营业务成本"))
tax_and_surcharge = to_number(statement.get("税金及附加"))
selling_expense = to_number(statement.get("销售费用"))
management_expense = to_number(statement.get("管理费用"))
financial_expense = to_number(statement.get("财务费用"))
other_business_profit = to_number(statement.get("其他业务利润"))
investment_income = to_number(statement.get("投资收益"))
non_operating_income = to_number(statement.get("营业外收入"))
non_operating_expense = to_number(statement.get("营业外支出"))
income_tax_expense = to_number(statement.get("所得税费用"))
expected_main_profit = calc_main_business_profit(
revenue, main_business_cost, tax_and_surcharge
)
expected_operating_profit = calc_operating_profit(
expected_main_profit,
selling_expense,
management_expense,
financial_expense,
other_business_profit,
investment_income,
)
expected_total_profit = calc_total_profit(
expected_operating_profit, non_operating_income, non_operating_expense
)
expected_net_profit = calc_net_profit(expected_total_profit, income_tax_expense)
checks = [
("主营业务利润", expected_main_profit),
("营业利润", expected_operating_profit),
("利润总额", expected_total_profit),
("净利润", expected_net_profit),
]
passed = True
for key, expected_value in checks:
actual_value = to_number(statement.get(key))
if abs(actual_value - expected_value) <= tolerance:
messages.append(f"[{department}] {key} 勾稽关系校验通过。")
else:
passed = False
messages.append(
f"[{department}] {key} 勾稽关系校验失败:"
f"表中数值={actual_value:.2f},按公式计算={expected_value:.2f}。"
)
return passed, messages
# ============================================================
# 二、类的应用部分
# ============================================================
class ProfitStatement:
"""利润表类:负责加载数据、生成利润表、更新数据、计算指标和校验勾稽关系。"""
def __init__(
self,
raw_data: List[FinanceRow],
income_tax_rate: Number = 0.25,
default_main_business_cost_rate: Number = 0.0,
default_tax_and_surcharge_rate: Number = 0.0,
) -> None:
"""
初始化利润表对象。
参数:
- raw_data:原始财务数据,格式为“列表嵌套字典”;
- income_tax_rate:所得税率,默认 25%;
- default_main_business_cost_rate:当原始数据没有主营业务成本时,按收入估算成本的比例;
- default_tax_and_surcharge_rate:当原始数据没有税金及附加时,按收入估算税金及附加的比例。
"""
self.raw_data = deepcopy(raw_data)
self.income_tax_rate = income_tax_rate
self.default_main_business_cost_rate = default_main_business_cost_rate
self.default_tax_and_surcharge_rate = default_tax_and_surcharge_rate
self.statement_data: List[FinanceRow] = []
def update_data(self, department: str, **kwargs: Any) -> None:
"""
更新某个部门的原始数据;若部门不存在,则新增一条记录。
示例:
ps.update_data("销售部", 收入=100000, 办公费=9000)
"""
for row in self.raw_data:
if row.get("部门") == department:
row.update(kwargs)
return
new_row: FinanceRow = {"部门": department}
new_row.update(kwargs)
self.raw_data.append(new_row)
def _build_one_statement(self, row: FinanceRow) -> FinanceRow:
"""根据单个部门原始数据生成单个部门利润表。"""
department = row.get("部门", "未知部门")
revenue = to_number(row.get("收入"))
budget = to_number(row.get("预算"))
office_expense = to_number(row.get("办公费"))
travel_expense = to_number(row.get("差旅费"))
entertainment_expense = to_number(row.get("招待费"))
# 题目数据没有给出销售费用、管理费用、财务费用等标准项目,
# 这里按照常见管理口径做简化映射。
selling_expense = to_number(row.get("销售费用"), travel_expense + entertainment_expense)
management_expense = to_number(row.get("管理费用"), office_expense)
financial_expense = to_number(row.get("财务费用"), 0.0)
main_business_cost = to_number(
row.get("主营业务成本"),
revenue * self.default_main_business_cost_rate,
)
tax_and_surcharge = to_number(
row.get("税金及附加"),
revenue * self.default_tax_and_surcharge_rate,
)
other_business_profit = to_number(row.get("其他业务利润"), 0.0)
investment_income = to_number(row.get("投资收益"), 0.0)
non_operating_income = to_number(row.get("营业外收入"), 0.0)
non_operating_expense = to_number(row.get("营业外支出"), 0.0)
main_profit = calc_main_business_profit(
revenue, main_business_cost, tax_and_surcharge
)
operating_profit = calc_operating_profit(
main_profit,
selling_expense,
management_expense,
financial_expense,
other_business_profit,
investment_income,
)
total_profit = calc_total_profit(
operating_profit, non_operating_income, non_operating_expense
)
# 若利润总额为负,通常不计所得税费用;这里按简化口径处理。
income_tax_expense = max(total_profit, 0.0) * self.income_tax_rate
net_profit = calc_net_profit(total_profit, income_tax_expense)
total_expense = office_expense + travel_expense + entertainment_expense
budget_difference = budget - total_expense
budget_usage_rate = total_expense / budget if budget else 0.0
net_profit_margin = net_profit / revenue if revenue else 0.0
return {
"部门": department,
"收入": revenue,
"预算": budget,
"办公费": office_expense,
"差旅费": travel_expense,
"招待费": entertainment_expense,
"费用合计": total_expense,
"预算差异": budget_difference,
"预算使用率": budget_usage_rate,
"主营业务成本": main_business_cost,
"税金及附加": tax_and_surcharge,
"主营业务利润": main_profit,
"销售费用": selling_expense,
"管理费用": management_expense,
"财务费用": financial_expense,
"其他业务利润": other_business_profit,
"投资收益": investment_income,
"营业利润": operating_profit,
"营业外收入": non_operating_income,
"营业外支出": non_operating_expense,
"利润总额": total_profit,
"所得税费用": income_tax_expense,
"净利润": net_profit,
"净利率": net_profit_margin,
}
def generate_statement(self) -> List[FinanceRow]:
"""自动生成各部门利润表。"""
self.statement_data = [self._build_one_statement(row) for row in self.raw_data]
return self.statement_data
def calculate_summary(self) -> FinanceRow:
"""计算企业整体汇总指标。"""
if not self.statement_data:
self.generate_statement()
numeric_keys = [
"收入", "预算", "办公费", "差旅费", "招待费", "费用合计", "预算差异",
"主营业务成本", "税金及附加", "主营业务利润", "销售费用", "管理费用",
"财务费用", "其他业务利润", "投资收益", "营业利润", "营业外收入",
"营业外支出", "利润总额", "所得税费用", "净利润",
]
summary: FinanceRow = {"部门": "合计"}
for key in numeric_keys:
summary[key] = sum(to_number(row.get(key)) for row in self.statement_data)
summary["预算使用率"] = (
summary["费用合计"] / summary["预算"] if summary["预算"] else 0.0
)
summary["净利率"] = summary["净利润"] / summary["收入"] if summary["收入"] else 0.0
return summary
def check_all_relations(self) -> Tuple[bool, List[str]]:
"""校验全部部门利润表的勾稽关系。"""
if not self.statement_data:
self.generate_statement()
all_passed = True
all_messages: List[str] = []
for statement in self.statement_data:
passed, messages = check_profit_relations(statement)
all_passed = all_passed and passed
all_messages.extend(messages)
summary = self.calculate_summary()
passed, messages = check_profit_relations(summary)
all_passed = all_passed and passed
all_messages.extend(messages)
return all_passed, all_messages
def print_statement(self) -> None:
"""在控制台打印利润表主要结果。"""
if not self.statement_data:
self.generate_statement()
rows = self.statement_data + [self.calculate_summary()]
columns = [
"部门", "收入", "费用合计", "预算", "预算差异", "主营业务利润",
"营业利润", "所得税费用", "净利润", "净利率",
]
print_table(rows, columns)
def export_csv(self, file_path: str) -> None:
"""将利润表结果导出为 CSV 文件。"""
if not self.statement_data:
self.generate_statement()
rows = self.statement_data + [self.calculate_summary()]
if not rows:
return
fieldnames = list(rows[0].keys())
with open(file_path, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(rows)
# ============================================================
# 三、辅助输出函数
# ============================================================
def format_value(value: Any) -> str:
"""格式化输出数值,使打印表格更清晰。"""
if isinstance(value, float):
return f"{value:.2%}" if -1 <= value <= 1 and value != 0 else f"{value:.2f}"
return str(value)
def print_table(rows: List[FinanceRow], columns: List[str]) -> None:
"""使用纯 Python 打印简单表格,不依赖第三方库。"""
table = []
table.append(columns)
for row in rows:
table.append([format_value(row.get(col, "")) for col in columns])
widths = [max(len(str(line[i])) for line in table) for i in range(len(columns))]
def print_line(items: List[Any]) -> None:
print(" | ".join(str(item).ljust(widths[i]) for i, item in enumerate(items)))
print_line(table[0])
print("-+-".join("-" * w for w in widths))
for line in table[1:]:
print_line(line)
# ============================================================
# 四、主程序:使用题目给出的模拟企业月度财务数据
# ============================================================
if __name__ == "__main__":
# 模拟企业月度财务数据(列表嵌套字典)
company_finance_data = [
{"部门": "销售部", "办公费": 8000, "差旅费": 12000, "招待费": 6000, "收入": 90000, "预算": 25000},
{"部门": "财务部", "办公费": 3000, "差旅费": 2000, "招待费": 1000, "收入": 12000, "预算": 8000},
{"部门": "人力资源部", "办公费": 4000, "差旅费": 3000, "招待费": 2000, "收入": 10000, "预算": 10000},
]
# 创建利润表对象
profit_statement = ProfitStatement(
company_finance_data,
income_tax_rate=0.25,
default_main_business_cost_rate=0.0,
default_tax_and_surcharge_rate=0.0,
)
# 生成利润表
profit_statement.generate_statement()
print("\n========== 企业月度利润表 ==========")
profit_statement.print_statement()
# 校验勾稽关系
print("\n========== 利润表勾稽关系校验 ==========")
passed, check_messages = profit_statement.check_all_relations()
for message in check_messages:
print(message)
print(f"\n最终校验结果:{'全部通过' if passed else '存在错误'}")
# 演示数据更新功能
print("\n========== 数据更新示例:将销售部收入更新为 100000 ==========")
profit_statement.update_data("销售部", 收入=100000)
profit_statement.generate_statement()
profit_statement.print_statement()
# 导出 CSV 文件
csv_path = "profit_statement_result.csv"
profit_statement.export_csv(csv_path)
print(f"\n利润表结果已导出:{csv_path}")
更多推荐


所有评论(0)