





















import pandas as pd
# 1. 定义一个统计类
class DataStats:
# 初始化:传入数据
def __init__(self, data):
self.df = pd.DataFrame(data)
# 函数1:计算总分
def calc_total(self):
self.df["总分"] = self.df["语文"] + self.df["数学"] + self.df["英语"]
# 函数2:计算平均分
def calc_avg(self):
self.df["平均分"] = self.df[["语文", "数学", "英语"]].mean(axis=1).round(2)
# 函数3:计算排名
def calc_rank(self):
self.df["排名"] = self.df["总分"].rank(ascending=False, method="min").astype(int)
# 函数4:一键输出所有统计
def show_all_stats(self):
print("===== 完整成绩表 =====")
print(self.df)
print("\n===== 整体统计指标 =====")
print(self.df.describe().round(2))
# ==============================
# 纯手写统计类:所有算法自己写
# ==============================
class DataStats:
"""
"""
def __init__(self, data):
# 直接接收你这种字典格式数据
self.names = data["姓名"]
self.chinese = data["语文"]
self.math = data["数学"]
self.english = data["英语"]
self.count = len(self.names)
# 1. 计算每个人总分(手写)
def calc_total(self):
total_list = []
for c, m, e in zip(self.chinese, self.math, self.english):
total_list.append(c + m + e)
return total_list
# 2. 计算每个人平均分(手写)
def calc_avg(self):
totals = self.calc_total()
avg_list = [round(t / 3, 2) for t in totals]
return avg_list
# 3. 排名(手写)
def calc_rank(self):
totals = self.calc_total()
sorted_totals = sorted(totals, reverse=True)
rank_list = [sorted_totals.index(t) + 1 for t in totals]
return rank_list
# 4. 求平均值(手写)
def get_mean(self, arr):
return sum(arr) / len(arr)
# 5. 求最大值(手写)
def get_max(self, arr):
max_val = arr[0]
for num in arr:
if num > max_val:
max_val = num
return max_val
# 6. 求最小值(手写)
def get_min(self, arr):
min_val = arr[0]
for num in arr:
if num < min_val:
min_val = num
return min_val
# 7. 求方差(手写)
def get_var(self, arr):
mean_val = self.get_mean(arr)
total = 0
for num in arr:
total += (num - mean_val) ** 2
return total / (len(arr) - 1)
# 8. 求标准差(手写)
def get_std(self, arr):
return self.get_var(arr) ** 0.5
# 显示所有结果
def show(self):
totals = self.calc_total()
avgs = self.calc_avg()
ranks = self.calc_rank()
print("===== 成绩统计结果 =====")
print(f"{'姓名':<6}{'语文':<6}{'数学':<6}{'英语':<6}{'总分':<6}{'平均分':<8}{'排名'}")
for i in range(self.count):
print(f"{self.names[i]:<6}{self.chinese[i]:<6}{self.math[i]:<6}{self.english[i]:<6}"
f"{totals[i]:<6}{avgs[i]:<8}{ranks[i]}")
print("\n===== 整体统计指标(纯手写) =====")
print("语文平均分:", round(self.get_mean(self.chinese), 2))
print("数学最高分:", self.get_max(self.math))
print("英语最低分:", self.get_min(self.english))
print("总分方差:", round(self.get_var(totals), 2))
print("总分标准差:", round(self.get_std(totals), 2))
import DataStats
import DataStatsCustomer
class Demo(object): # 类名首字母大写(PEP8规范)
"""
平均值计算类:包含4种输入方式计算平均值的方法,以及主程序入口
"""
def test1(self):
"""功能1:输入三个整数,计算平均值并格式化输出"""
# 输入三个整数(仅做一次异常校验,报错则返回主菜单)
try:
n1 = int(input("输入第一个整数:"))
n2 = int(input("输入第二个整数:"))
n3 = int(input("输入第三个整数:"))
except ValueError:
print("输入错误!请输入有效的整数,返回主菜单。")
print("="*50)
return # 直接返回,不再执行后续逻辑
c = input("输入填充字符:")
ave = (n1 + n2 + n3) / 3
print(f"{n1}+{n2}+{n3} \n平均值:{ave:{c}^30.2f}")
st = input("请输入一个字符串(可选,按回车跳过):")
print("="*50) # 分隔线,提升可读性
def test2(self):
"""功能2:输入三个浮点数,计算平均值并格式化输出"""
# 输入三个浮点数,仅做一次异常校验
try:
n1 = float(input("输入第一个数(浮点数):"))
n2 = float(input("输入第二个数(浮点数):"))
n3 = float(input("输入第三个数(浮点数):"))
except ValueError:
print("输入错误!请输入有效的数字,返回主菜单。")
print("="*50)
return
c = input("输入填充字符:")
ave = (n1 + n2 + n3) / 3
print(f"三个实数:{n1},{n2},{n3}\n平均值:{ave:{c}^30.2f}")
print("="*50)
def test3(self):
"""功能3:逐个输入任意类型数(eval解析),计算平均值并格式化输出"""
# 输入三个数,仅做一次异常校验
try:
n1 = eval(input("输入第一个数:"))
n2 = eval(input("输入第二个数:"))
n3 = eval(input("第三个数:"))
# 校验是否为数字类型
if not (isinstance(n1, (int, float)) and isinstance(n2, (int, float)) and isinstance(n3, (int, float))):
raise ValueError("输入的不是有效数字")
except:
print("输入错误!请输入有效的数字(如10、3.14),返回主菜单。")
print("="*50)
return
c = input("输入填充字符:")
ave = (n1 + n2 + n3) / 3
print(f"三个实数:{n1},{n2},{n3}\n平均值:{ave:{c}^30.2f}")
print("="*50)
def test4(self):
"""功能4:一次性输入三个数(逗号分隔),计算平均值并格式化输出"""
# 一次性输入三个数,仅做一次异常校验
try:
n1, n2, n3 = eval(input("输入三个数(用逗号分隔,如10,20,30):"))
# 校验是否为数字类型
if not (isinstance(n1, (int, float)) and isinstance(n2, (int, float)) and isinstance(n3, (int, float))):
raise ValueError("输入的不是有效数字")
except:
print("输入错误!请按格式输入(如10,20,30 或 1.5,2.5,3.0),返回主菜单。")
print("="*50)
return
c = input("输入填充字符:")
ave = (n1 + n2 + n3) / 3
print(f"三个实数:{n1},{n2},{n3} \n平均值:{ave:{c}^30.2f}")
print("="*50)
def datademo(self):
"""统计示例"""
# 准备数据
data = {
"姓名": ["张三", "李四", "王五", "赵六", "钱七"],
"语文": [85, 92, 78, 90, 88],
"数学": [90, 85, 92, 76, 89],
"英语": [88, 79, 95, 85, 92]
}
# 创建类的实例
#stats = DataStats.DataStats(data)
stats = DataStatsCustomer.DataStats(data)
# 调用类里的函数
stats.calc_total()
stats.calc_avg()
stats.calc_rank()
stats.show_all_stats()
def main(self): # 移出嵌套,作为类的独立方法
"""主程序:仅此处保留循环,控制整体流程"""
print("===== 平均值计算程序 =====")
print("功能说明:")
print("1 - 输入三个整数计算平均值")
print("2 - 输入三个浮点数计算平均值")
print("3 - 逐个输入任意数字计算平均值(支持整数/浮点数)")
print("4 - 一次性输入三个数(逗号分隔)计算平均值")
print("5 - pandas 统计实例")
print("0/q - 退出程序")
print("="*50)
while True: # 仅主程序保留循环
# 获取用户选择
choice = input("请输入功能编号(1/2/3/4),输入0/q退出:").strip().lower()
# 退出条件
if choice in ["0", "q"]:
print("程序已退出,感谢使用!")
break
# 执行对应功能(通过self调用类内方法)
if choice == "1":
self.test1() # 关键修正:类内方法调用必须加self
elif choice == "2":
self.test2()
elif choice == "3":
self.test3()
elif choice == "4":
self.test4()
elif choice == "5":
self.datademo()
else:
# 无效输入提示
print("输入错误!请输入1、2、3、4(退出请输入0或q)。")
print("="*50)
import pandas
import democlass
# 启动主程序:先实例化类,再调用main方法
if __name__ == "__main__":
calc_demo = democlass.Demo() # 创建类的实例
calc_demo.main() # 调用实例的main方法
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。