人体健康状态检测Python脚本
这是一个人体健康状态检测的Python脚本,输入基本身体数据后会自动生成健康报告。
```python
#!/usr/bin/env python3
"""
人体健康状态检测与报告生成系统
输入基本身体数据,自动输出健康评估报告
"""
import math
from datetime import datetime
from typing import Dict, Any, Optional, List, Tuple
class HealthReport:
"""健康报告生成器"""
# 健康范围参考标准(基于通用医学指南)
BMI_RANGES = {
"underweight": {"max": 18.4, "label": "偏瘦", "risk": "低体重风险,建议增加营养摄入"},
"normal": {"min": 18.5, "max": 24.9, "label": "正常", "risk": "体重正常,继续保持"},
"overweight": {"min": 25.0, "max": 29.9, "label": "超重", "risk": "超重风险,建议控制饮食和增加运动"},
"obese": {"min": 30.0, "label": "肥胖", "risk": "肥胖风险较高,建议咨询医生制定减重计划"}
}
BLOOD_PRESSURE_RANGES = {
"normal": {"systolic_min": 90, "systolic_max": 120, "diastolic_min": 60, "diastolic_max": 80,
"label": "正常", "risk": "血压正常,继续保持健康生活方式"},
"elevated": {"systolic_min": 120, "systolic_max": 129, "diastolic_min": 60, "diastolic_max": 80,
"label": "偏高", "risk": "血压偏高,建议减少盐分摄入,增加运动"},
"hypertension_stage1": {"systolic_min": 130, "systolic_max": 139, "diastolic_min": 80, "diastolic_max": 89,
"label": "一级高血压", "risk": "一级高血压,建议就医评估并调整生活方式"},
"hypertension_stage2": {"systolic_min": 140, "diastolic_min": 90,
"label": "二级高血压", "risk": "二级高血压,请尽快就医,需要药物干预"}
}
HEART_RATE_RANGES = {
"bradycardia": {"max": 59, "label": "心动过缓", "risk": "心率偏低,如有头晕乏力症状请就医"},
"normal": {"min": 60, "max": 100, "label": "正常", "risk": "心率正常"},
"tachycardia": {"min": 101, "label": "心动过速", "risk": "心率偏快,建议放松休息后重新测量"}
}
def __init__(self, name: str = "用户"):
self.name = name
self.data: Dict[str, Any] = {}
self.risks: List[str] = []
self.suggestions: List[str] = []
def input_data(self) -> None:
"""交互式输入身体数据"""
print("\n" + "=" * 50)
print(f" 欢迎 {self.name},进入人体健康状态检测系统")
print("=" * 50)
try:
self.data["gender"] = input("请输入性别 (男/女): ").strip()
self.data["age"] = float(input("请输入年龄 (岁): "))
self.data["height"] = float(input("请输入身高 (厘米): "))
self.data["weight"] = float(input("请输入体重 (公斤): "))
# 血压(可选)
bp_input = input("是否输入血压数据?(y/n,默认n): ").strip().lower()
if bp_input == 'y':
self.data["systolic"] = float(input("请输入收缩压 (mmHg): "))
self.data["diastolic"] = float(input("请输入舒张压 (mmHg): "))
else:
self.data["systolic"] = None
self.data["diastolic"] = None
# 心率(可选)
hr_input = input("是否输入心率数据?(y/n,默认n): ").strip().lower()
if hr_input == 'y':
self.data["heart_rate"] = float(input("请输入静息心率 (次/分钟): "))
else:
self.data["heart_rate"] = None
# 其他健康习惯(可选)
self.data["exercise"] = input("每周运动频率 (天/周,如0/3/5): ").strip() or "0"
self.data["sleep"] = input("平均睡眠时间 (小时/天): ").strip() or "7"
self.data["stress"] = input("自我评估压力水平 (1-10,1最低): ").strip() or "5"
except ValueError as e:
print(f"\n⚠️ 输入错误: {e},请确保输入有效数字")
raise
def set_data(self, data: Dict[str, Any]) -> None:
"""以字典方式设置数据(用于非交互模式)"""
self.data = data
def _calculate_bmi(self) -> float:
"""计算BMI"""
height_m = self.data["height"] / 100
return self.data["weight"] / (height_m ** 2)
def _assess_bmi(self) -> Tuple[str, str]:
"""评估BMI并返回状态和风险描述"""
bmi = self._calculate_bmi()
for key, range_info in self.BMI_RANGES.items():
if "min" in range_info and bmi < range_info["min"]:
continue
if "max" in range_info and bmi > range_info["max"]:
continue
return range_info["label"], range_info["risk"]
return "未知", "无法评估"
def _assess_blood_pressure(self) -> Tuple[Optional[str], Optional[str]]:
"""评估血压"""
sys = self.data.get("systolic")
dia = self.data.get("diastolic")
if sys is None or dia is None:
return None, None
for key, info in self.BLOOD_PRESSURE_RANGES.items():
sys_ok = ("systolic_min" not in info or sys >= info["systolic_min"]) and \
("systolic_max" not in info or sys <= info["systolic_max"])
dia_ok = ("diastolic_min" not in info or dia >= info["diastolic_min"]) and \
("diastolic_max" not in info or dia <= info["diastolic_max"])
if sys_ok and dia_ok:
return info["label"], info["risk"]
return "异常", "血压数值异常,请重新测量或就医"
def _assess_heart_rate(self) -> Tuple[Optional[str], Optional[str]]:
"""评估心率"""
hr = self.data.get("heart_rate")
if hr is None:
return None, None
for key, info in self.HEART_RATE_RANGES.items():
if "min" in info and hr < info["min"]:
continue
if "max" in info and hr > info["max"]:
continue
return info["label"], info["risk"]
return "异常", "心率数值异常,请重新测量"
def _assess_lifestyle(self) -> None:
"""评估生活方式相关风险"""
exercise = int(self.data.get("exercise", 0))
sleep = float(self.data.get("sleep", 7))
stress = int(self.data.get("stress", 5))
if exercise < 2:
self.risks.append("运动不足:每周运动少于2天,建议逐步增加活动量")
self.suggestions.append("🏃 每周至少进行150分钟中等强度有氧运动")
elif exercise < 4:
self.suggestions.append("✅ 运动频率良好,建议保持并增加力量训练")
if sleep < 6:
self.risks.append("睡眠不足:少于6小时/天,长期可能影响健康")
self.suggestions.append("😴 保证7-8小时优质睡眠,建立规律作息")
elif sleep > 9:
self.suggestions.append("⚠️ 睡眠时间较长,建议检查是否存在嗜睡问题")
if stress >= 8:
self.risks.append("压力水平较高(≥8/10),需要关注心理健康")
self.suggestions.append("🧘 尝试冥想、深呼吸或瑜伽等减压方式")
elif stress >= 6:
self.suggestions.append("⚖️ 注意调节压力,保持工作生活平衡")
# 根据性别添加特殊建议
if self.data.get("gender") == "女":
self.suggestions.append("🌸 建议定期进行妇科检查和乳腺自检")
elif self.data.get("gender") == "男":
self.suggestions.append("💪 建议定期进行前列腺检查和心血管筛查")
def _age_related_advice(self) -> None:
"""根据年龄给出建议"""
age = self.data.get("age", 30)
if age >= 60:
self.suggestions.append("👴 建议每年进行全面体检,关注骨密度和认知功能")
self.suggestions.append("🥦 注意补充钙质和维生素D,预防骨质疏松")
elif age >= 45:
self.suggestions.append("📋 建议每年进行心血管风险评估和肿瘤筛查")
elif age >= 30:
self.suggestions.append("🌱 建议每2年进行常规体检,关注代谢指标")
def generate_report(self) -> str:
"""生成完整的健康报告"""
# 核心指标
bmi = self._calculate_bmi()
bmi_label, bmi_risk = self._assess_bmi()
bp_label, bp_risk = self._assess_blood_pressure()
hr_label, hr_risk = self._assess_heart_rate()
# 收集风险和建议
self.risks = []
self.suggestions = []
if bmi_risk:
self.risks.append(bmi_risk)
if bp_risk:
self.risks.append(bp_risk)
if hr_risk:
self.risks.append(hr_risk)
self._assess_lifestyle()
self._age_related_advice()
# 构建报告
report = []
report.append("\n" + "=" * 60)
report.append(f" 🏥 个人健康状态检测报告")
report.append("=" * 60)
report.append(f" 姓名: {self.name}")
report.append(f" 性别: {self.data.get('gender', '未填')}")
report.append(f" 年龄: {self.data.get('age', '未填')} 岁")
report.append(f" 生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}")
report.append("-" * 60)
# 核心指标
report.append("\n📊 核心生理指标:")
report.append(f" • BMI: {bmi:.1f} → 状态: {bmi_label}")
if bp_label:
report.append(f" • 血压: {self.data.get('systolic', 'N/A')}/{self.data.get('diastolic', 'N/A')} mmHg → 状态: {bp_label}")
if hr_label:
report.append(f" • 静息心率: {self.data.get('heart_rate', 'N/A')} 次/分钟 → 状态: {hr_label}")
report.append(f" • 睡眠: {self.data.get('sleep', 'N/A')} 小时/天")
report.append(f" • 运动: {self.data.get('exercise', 'N/A')} 天/周")
report.append(f" • 压力自评: {self.data.get('stress', 'N/A')}/10")
# 风险评估
report.append("\n⚠️ 风险提示:")
if self.risks:
for i, risk in enumerate(self.risks, 1):
report.append(f" {i}. {risk}")
else:
report.append(" ✅ 未发现明显健康风险,请继续保持!")
# 建议部分
report.append("\n💡 健康建议:")
if self.suggestions:
for i, sug in enumerate(self.suggestions, 1):
report.append(f" {i}. {sug}")
else:
report.append(" ✅ 各项指标良好,建议定期复查")
# 总结
report.append("\n" + "-" * 60)
if len(self.risks) == 0:
report.append("🌟 总体评价: 健康状态良好,继续保持!")
elif len(self.risks) <= 2:
report.append("📌 总体评价: 存在部分风险因素,建议根据提示进行调整")
else:
report.append("🔴 总体评价: 存在多项风险,建议尽快就医进行全面检查")
report.append("=" * 60)
report.append(" *本报告仅供参考,不能替代专业医疗诊断*")
report.append("=" * 60 + "\n")
return "\n".join(report)
def save_report(self, filename: Optional[str] = None) -> str:
"""保存报告到文件"""
if filename is None:
filename = f"health_report_{self.name}_{datetime.now().strftime('%Y%m%d')}.txt"
content = self.generate_report()
with open(filename, "w", encoding="utf-8") as f:
f.write(content)
return filename
def main():
"""主函数 - 交互式运行"""
print("\n" + "🚀 人体健康状态检测系统 v1.0")
print("请按照提示输入您的身体数据...")
name = input("请输入您的姓名(默认:用户): ").strip() or "用户"
reporter = HealthReport(name)
try:
reporter.input_data()
report = reporter.generate_report()
print(report)
# 询问是否保存
save = input("是否保存报告到文件?(y/n,默认n): ").strip().lower()
if save == 'y':
filename = reporter.save_report()
print(f"✅ 报告已保存至: {filename}")
except KeyboardInterrupt:
print("\n\n👋 已取消检测")
except Exception as e:
print(f"\n❌ 发生错误: {e}")
if __name__ == "__main__":
main()
```
优化建议: 后续有需要可以根据需要调整代码开头的 BMI_RANGES、BLOOD_PRESSURE_RANGES 等字典中的阈值,以适配不同的健康标准或人群。