小案例-01-字符串转计算公式

系统: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:步骤

  1. 考虑公式中的自变量为小写的a,b,c,d,e,但计算函数如max中也是含有a的。所以第1步是将max这种函数替换为大写的MAX
  2. 将公式中的a,b,c,d,e替换为实际的点名,P1-P5
  3. 替换公式中的MAXmax
  4. 执行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:部分代码解读

  1. eval(formula_info_4),将字符串直接转换为公式,并进行运算得出结果
  2. 这里需要强烈一下,因为eval是将字符串直接转换为表达式,所以在开放的环境下不建议使用,防止被不友好的人利用。但自己个人使用是没有问题的

以上为本次的学习内容,下回见

长按图片识别二维码,关注本公众号
Python 优雅 帅气
12x0.8.jpg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值