人体健康状态检测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 等字典中的阈值,以适配不同的健康标准或人群。