系统:Windows 10
语言版本:Anaconda3-5.1.0-Windows-x86_64
编辑器:JetBrains PyCharm Community Edition 2018.2.2 x64
Python:3.6.4
- 本系列介绍一些小案例,综合运用所学,但又不会很复杂
- 今天介绍字符串转计算公式
Part 1:示例
- 已知一个已字符串存储的公式
'max(a,b,c,d,e)'
- 其中
a,b,c,d,e
分别表示P1-P5点,{'a': 'P1', 'b': 'P2', 'c': 'P3', 'd': 'P4', 'e': 'P5'}
- 已知
P1-P5
的取值,求这个公式得到的结果 - 本示例的应用示例是,计算公式是由用户自由输入,然后写入数据库。定期更新公式求得的结果
Part 2:步骤
- 考虑公式中的自变量为小写的a,b,c,d,e,但计算函数如max中也是含有
a
的。所以第1步是将max
这种函数替换为大写的MAX
- 将公式中的a,b,c,d,e替换为实际的点名,P1-P5
- 替换公式中的
MAX
为max
- 执行
eval
函数
结果
Part 3:代码
dict_input_1 = {'P1': 1, 'P2': 2, 'P3': 3, 'P4': 4, 'P5': 15}
dict_input_2 = {'P1': 3, 'P2': 2, 'P3': 3, 'P4': 4, 'P5': 5}
dict_input_3 = {'P1': 9, 'P2': 2, 'P3': 3, 'P4': 4, 'P5': 5}
def replace_with_upper(formula_info):
dict_number_info = {"abs": "ABS", "max": "MAX", "min": "MIN"}
for ky in dict_number_info:
val = str(dict_number_info[ky])
formula_info = formula_info.replace(ky, val)
return formula_info
def replace_with_lower(formula_info):
dict_number_info = {"ABS": "abs", "MAX": "max", "MIN": "min"}
for ky in dict_number_info:
val = str(dict_number_info[ky])
formula_info = formula_info.replace(ky, val)
return formula_info
def replace_with_dict(formula_info, dict_number_info):
for ky in dict_number_info:
val = str(dict_number_info[ky])
formula_info = formula_info.replace(ky, val)
return formula_info
def get_max(dict_input):
# 已知条件
formula_info = 'max(a,b,c,d,e)'
dict_map = {'a': 'P1', 'b': 'P2', 'c': 'P3', 'd': 'P4', 'e': 'P5'}
# 第1步:替换关键函数,因为除关键函数的因变量中含有与max等相同的字母
formula_info_1 = replace_with_upper(formula_info)
print('formula_info_1=', formula_info_1)
# 第2步:替换各变量
formula_info_2 = replace_with_dict(formula_info_1, dict_map)
print('formula_info_2=', formula_info_2)
# 第3步:替换回关键函数
formula_info_3 = replace_with_lower(formula_info_2)
print('formula_info_3=', formula_info_3)
# 第4步:替换值
formula_info_4 = replace_with_dict(formula_info_3, dict_input)
print('formula_info_4=', formula_info_4)
result = eval(formula_info_4)
return result
# 计算1
print('\n', '计算1')
result_1 = get_max(dict_input_1)
print('结果是', result_1)
# 计算2
print('\n', '计算2')
result_2 = get_max(dict_input_2)
print('结果是', result_2)
# 计算3
print('\n', '计算3')
result_3 = get_max(dict_input_3)
print('结果是', result_3)
代码截图
Part 4:部分代码解读
eval(formula_info_4)
,将字符串直接转换为公式,并进行运算得出结果- 这里需要强烈一下,因为
eval
是将字符串直接转换为表达式,所以在开放的环境下不建议使用,防止被不友好的人利用。但自己个人使用是没有问题的
以上为本次的学习内容,下回见
长按图片识别二维码,关注本公众号
Python 优雅 帅气