01-生化指标单位换算
第二章 案例1:生化指标单位换算
通过一个小栗子,来熟悉一下python中的常用操作吧,包括分支结构、循环结构、函数定义调用以及匿名函数等。
其中的数值参考见:https://www.douban.com/note/690319695/
一、 案例 - 生化指标单位换算1.0
1. 案例描述
在临床中,生化指标等常用不同的单位表示,有时用mg/dl,有时用mmol/L,因此,常会涉及单位之间的转换。设计一个单位转换程序,其功能是实现不同生化指标之间的单位互相转换。
如:
(1) 血脂项目测定数值的表达单位按国家标准为mmol/L,国际上有些国家用mg/dl,其转换系数如下:
胆固醇 TC、HDL-C、LDL-C:1 mg/dl=0.0259 mmol/L;
甘油三酯 TG:1 mg/dl=0.0113 mmol/L
(2) 肌酐(Cr):1mg/dL=0.01131 umol/L
(3) 血糖:1mmol/L=18mg/dL
2. 案例分析
分析问题:分析问题的计算部分,即简单的乘除法实现
确定问题:将问题划分为输入、处理及输出部分,及之前讲过的IPO
设计算法:计算部分的核心
3. 实现
(1) 利用PyCharm新建project和python file
(2) 代码
# 三引号"""多行注释,加入关于整个程序的描述
"""
Author: hucy
Function: 生化指标的单位转换
Version: 1.0
Date: 2019/08/13
"""# 1. 输入
MOL_cho_str_value = input('请输入胆固醇的含量值(mmol/L):') # 标准输入,即键盘输入
MOL_cho_value = eval(MOL_cho_str_value) # 把字符型数字文本转换成数字
print(MOL_cho_value) # 用于查看代码# 转换系数,重要的常量一般不做改变,用大写的变量名表示
G_VS_MOL = 0.0259# 2. 处理
G_value = MOL_cho_value / G_VS_MOL # 计算# 3. 输出
print('转换单位后的胆固醇的含量(mg/dl)是:', G_value)
1. 案例描述
设计一个转换程序,实现不同单位间的换算,为使程序简单,依然只考虑胆固醇。
2.0新增功能:根据输入判断单位类型,进行相应的换算。
2. 案例分析
3. 实现代码
"""
Author: hucy
Function: 生化指标的单位转换
AddFunction: 根据输入实现单位间的互换
字符串切片操作 & 字符串格式化输出 & 选择结构学习 if : elif : else:
Version: 2.0
Date: 2018/08/13
"""
# 转换系数,重要的常量一般不做改变,用大写的变量名表示
G_VS_MOL = 0.0259# 带单位的胆固醇输入
cho_str_value = input('请输入带单位的胆固醇的含量(单位mmol/L或mg/dl):')
print(cho_str_value)# 注意Python没有分号等分隔符,但要注意缩进
# Python中的占位符:pass
if cho_str_value[-6:] == 'mmol/L':
# pass
g_value = eval(cho_str_value[:-6])/G_VS_MOL
print('转换单位后的胆固醇的含量是{} mg/dl!'.format(g_value))
elif cho_str_value[-5:] == 'mg/dl':
mol_value = eval(cho_str_value[:-5])*G_VS_MOL
print('转换单位后的胆固醇的含量是{} mmol/L!'.format(mol_value))
else:
print('该程序版本暂不支持该转换操作!')
三、案例 - 生化指标单位换算3.0
1. 案例描述
设计一个转换程序,实现不同单位间的换算,为使程序简单,依然只考虑胆固醇。
2.0新增功能:根据输入判断单位类型,进行相应的换算。
3.0新增功能:程序可以一直运行,直到用户选择退出
2. 案例分析
3. 实现代码
"""
Author: hucy
Version: 3.0
Function: 生化指标的单位转换
2.0新增功能:根据输入判断单位类型,进行相应的换算。
字符串切片操作 & 字符串格式化输出 & 选择结构 if : elif : else:
3.0新增功能:程序可以一直运行,直到用户选择退出
while循环
Date: 2018/08/13
"""# 转换系数,重要的常量一般不做改变,用大写的变量名表示
G_VS_MOL = 0.0259# 带单位的胆固醇输入
cho_str_value = input('请输入带单位的胆固醇的含量(单位mmol/L或mg/dl),退出程序请输入Q:')
print(cho_str_value)# 避免死循环
i = 0 # 设置循环变量,查看循环次数,作调试用,用户无需知道
while cho_str_value != 'Q': # 循环体内没有给用户提供再次输入的机会
i = i + 1
print('循环次数:', i)if cho_str_value[-6:] == 'mmol/L':
g_value = eval(cho_str_value[:-6]) / G_VS_MOL
print('转换单位后的胆固醇的含量是{} mg/dl!'.format(g_value))
elif cho_str_value[-5:] == 'mg/dl':
mol_value = eval(cho_str_value[:-5]) * G_VS_MOL
print('转换单位后的胆固醇的含量是{} mmol/L!'.format(mol_value))
else:
print('该程序版本暂不支持该转换操作!')print('****************************************************') # 为了使结果输出更友好
# 带单位的货币输入
cho_str_value = input('请输入带单位的胆固醇的含量(单位mmol/L或mg/dl),退出程序请输入Q:') #给用户提供再次输入的机会print("程序已退出!")
四、案例 - 生化指标单位换算4.0
1. 案例描述
设计一个转换程序,实现不同单位间的换算,为使程序简单,依然只考虑胆固醇。
2.0新增功能:根据输入判断单位类型,进行相应的换算。
3.0新增功能:程序可以一直运行,直到用户选择退出
4.0新增功能:将计算部分封装到函数中
2. 案例分析
3. 实现代码
"""
Author: hucy
Version: 3.0
Function: 生化指标的单位转换
2.0新增功能:根据输入判断单位类型,进行相应的换算。
字符串切片操作 & 字符串格式化输出 & 选择结构 if : elif : else:
3.0新增功能:程序可以一直运行,直到用户选择退出
while循环
4.0新增功能:计算部分封装到函数中
Date: 2018/08/13
"""# 建议定义的函数前后有两个空行,建议整体代码块和函数的注释都用3个引号(""")
# 定义函数:一般预先定义好函数
# 输入:1) 胆固醇含量;2) 转换系数def convert_unit(val, coef):
"""
Function:单位转换
:param im:
:param er:
"""
out = val * coef # 形式参数
return out# main()函数:程序执行入口
def main():
# 转换系数,重要的常量一般不做改变,用大写的变量名表示
G_VS_MOL = 0.0259# 带单位的胆固醇含量输入
cho_str_value = input('请输入带单位的胆固醇的含量(单位mmol/L或mg/dl):')if cho_str_value[-6:] == 'mmol/L':
exchange_coef = 1 / G_VS_MOL
in_val = eval(cho_str_value[:-6])
elif cho_str_value[-5:] == 'mg/dl':
exchange_coef = 1 * G_VS_MOL
in_val = eval(cho_str_value[:-5])
else:
exchange_coef = -1if exchange_coef != -1:
# 调用函数
out_result = convert_unit(in_val, exchange_coef) # 实际参数
print('转换单位后的胆固醇含量是:', out_result)
else:
print('不支持该单位类型的转换!')# 调用main()函数,固定写法
if __name__ == '__main__': # 该判断语句是永远为TRUE的
main()
五、案例 - 生化指标单位换算5.0
1. 案例描述
设计一个转换程序,实现不同单位间的换算,为使程序简单,依然只考虑胆固醇。
2.0新增功能:根据输入判断单位类型,进行相应的换算。
3.0新增功能:程序可以一直运行,直到用户选择退出
4.0新增功能:将计算部分封装到函数中
5.0新增功能:将简单的函数改造成lambda函数
2. 案例分析
3. 实现代码
"""
Author: hucy
Version: 5.0
Function: 生化指标的单位转换
2.0新增功能:根据输入判断单位类型,进行相应的换算。
字符串切片操作 & 字符串格式化输出 & 选择结构 if : elif : else:
3.0新增功能:程序可以一直运行,直到用户选择退出
while循环
4.0新增功能:计算部分封装到函数中,使程序模块化,便于阅读和复用
5.0新增功能:(1)使程序更加结构化;(2) 简单函数的定义 lambda 在一行内表示表达函数
Date: 2018/08/13
"""def main():
# 转换系数,重要的常量一般不做改变,用大写的变量名表示
G_VS_MOL = 0.0259# 带单位的胆固醇含量输入
cho_str_value = input('请输入带单位的胆固醇的含量(单位mmol/L或mg/dl):')if cho_str_value[-6:] == 'mmol/L':
exchange_coef = 1 / G_VS_MOL
in_val = eval(cho_str_value[:-6])
elif cho_str_value[-5:] == 'mg/dl':
exchange_coef = 1 * G_VS_MOL
in_val = eval(cho_str_value[:-5])
else:
exchange_coef = -1if exchange_coef != -1:
# 使用lambda定义函数
convert_unit = lambda x: x*exchange_coef # x形式参数
# 调用lambda函数
out_result = convert_unit(in_val) # in_val实际参数
print('转换单位后的胆固醇含量是:', out_result)else:
print('不支持该单位类型的转换!')# 调用main()函数,固定写法
if __name__ == '__main__': # 该判断语句是永远为TRUE的
main()
六、思考
能否保存多种生化指标的转换系数,而不是单一指标?
"""
Author: hucy
Version: 思考
Function: 多个生化指标的单位转换
功能基本实现了,但是代码巨难看
Date: 2018/08/13
"""def convert_unit_cho():
# 转换系数,重要的常量一般不做改变,用大写的变量名表示
G_VS_MOL = 0.0259# 带单位的胆固醇含量输入
cho_str_value = input('请输入带单位的胆固醇含量(单位mmol/L或mg/dl):')if cho_str_value[-6:] == 'mmol/L':
exchange_coef = 1 / G_VS_MOL
in_val = eval(cho_str_value[:-6])
elif cho_str_value[-5:] == 'mg/dl':
exchange_coef = 1 * G_VS_MOL
in_val = eval(cho_str_value[:-5])
else:
exchange_coef = -1if exchange_coef != -1:
# 使用lambda定义函数
convert_unit = lambda x: x * exchange_coef # x形式参数
# 调用lambda函数
out_result = convert_unit(in_val) # in_val实际参数else:
print('不支持该单位类型的转换!')return out_result
def convert_unit_tg():
# 转换系数,重要的常量一般不做改变,用大写的变量名表示
G_VS_MOL = 0.0113# 带单位的胆固醇含量输入
tg_str_value = input('请输入带单位的甘油三酯含量(单位mmol/L或mg/dl):')if tg_str_value[-6:] == 'mmol/L':
exchange_coef = 1 / G_VS_MOL
in_val = eval(tg_str_value[:-6])
elif tg_str_value[-5:] == 'mg/dl':
exchange_coef = 1 * G_VS_MOL
in_val = eval(tg_str_value[:-5])
else:
exchange_coef = -1if exchange_coef != -1:
# 使用lambda定义函数
convert_unit = lambda x: x * exchange_coef # x形式参数
# 调用lambda函数
out_result = convert_unit(in_val) # in_val实际参数else:
print('不支持该单位类型的转换!')return out_result
def convert_unit_glu():
# 转换系数,重要的常量一般不做改变,用大写的变量名表示
G_VS_MOL = 1/18# 带单位的胆固醇含量输入
glu_str_value = input('请输入带单位的血糖含量(单位mmol/L或mg/dl):')if glu_str_value[-6:] == 'mmol/L':
exchange_coef = 1 / G_VS_MOL
in_val = eval(glu_str_value[:-6])
elif glu_str_value[-5:] == 'mg/dl':
exchange_coef = 1 * G_VS_MOL
in_val = eval(glu_str_value[:-5])
else:
exchange_coef = -1if exchange_coef != -1:
# 使用lambda定义函数
convert_unit = lambda x: x * exchange_coef # x形式参数
# 调用lambda函数
out_result = convert_unit(in_val) # in_val实际参数else:
print('不支持该单位类型的转换!')return out_result
def convert_unit_cre():
# 转换系数,重要的常量一般不做改变,用大写的变量名表示
G_VS_MOL = 0.01131# 带单位的胆固醇含量输入
cre_str_value = input('请输入带单位的肌酐含量(单位umol/L或mg/dl):')if cre_str_value[-6:] == 'umol/L':
exchange_coef = 1 / G_VS_MOL
in_val = eval(cre_str_value[:-6])
elif cre_str_value[-5:] == 'mg/dl':
exchange_coef = 1 * G_VS_MOL
in_val = eval(cre_str_value[:-5])
else:
exchange_coef = -1if exchange_coef != -1:
# 使用lambda定义函数
convert_unit = lambda x: x * exchange_coef # x形式参数
# 调用lambda函数
out_result = convert_unit(in_val) # in_val实际参数else:
print('不支持该单位类型的转换!')return out_result
def main():
input_str_idx = input('请输入您想进行单位转换的生化指标(如:cho、tg、glu、cre):')
if input_str_idx == 'cho':
out_val = convert_unit_cho()
print('胆固醇进行单位转换后的值为', out_val)
elif input_str_idx == 'tg':
out_val = convert_unit_tg()
print('甘油三酯进行单位转换后的值为', out_val)
elif input_str_idx == 'glu':
out_val = convert_unit_glu()
print('血糖进行单位转换后的值为', out_val)
elif input_str_idx == 'cre':
out_val = convert_unit_cre()
print('肌酐进行单位转换后的值为', out_val)
else:
print('暂不支持该指标的单位转换!')if __name__ == '__main__':
main()
七、总结