Python中如何为列表内的变量表达式代入参数求值?
实现方案
问题原因
初始写法里g_combine列表直接存放算术表达式,会在列表定义的瞬间就完成计算,存的是固定数值,不是可重复代入参数运算的表达式结构,自然没法后续传入不同的g1、g2值得到新的计算结果。
推荐实现(无安全风险)
把每个表达式封装为接收g1、g2参数的可调用对象,调用计算函数时再传入实际值执行运算,不需要提前感知表达式的具体形式:
# 表达式列表元素为延迟计算的匿名函数,定义时不会执行运算 g_combine = [ lambda g1, g2: g1**4, lambda g1, g2: g1**3*g2, lambda g1, g2: g1**2 * g2**2, lambda g1, g2: g1 * g2**3, lambda g1, g2: g2**4 ] def get_combine(g_combine, g1, g2): # 遍历所有表达式,传入当前参数值计算后收集结果 return [expr(g1, g2) for expr in g_combine] # 测试验证 print(get_combine(g_combine, g1=1, g2=0)) # 输出:[1, 0, 0, 0, 0],符合预期
如果需要自定义其他g1、g2组合的表达式,只要按相同格式往g_combine里加lambda函数即可,不需要修改get_combine的逻辑。
支持字符串表达式输入的实现
如果需要接收用户以文本形式输入的表达式(比如命令行输入、页面传入的表达式字符串),可以用eval实现动态计算,必须做安全限制,禁止执行恶意代码:
def get_combine_from_str(expr_list, g1, g2): # 限制eval的访问权限,仅允许访问g1、g2变量,屏蔽所有内置方法 exec_globals = {"__builtins__": None} exec_locals = {"g1": g1, "g2": g2} result = [] for expr in expr_list: # 可按需增加输入校验:比如仅允许表达式包含g1、g2、数字、+/-/*/**/()等算术运算符 result.append(eval(expr, exec_globals, exec_locals)) return result # 测试 user_exprs = ["g1**4", "g1**3*g2", "g1**2 * g2**2", "g1 * g2**3", "g2**4"] print(get_combine_from_str(user_exprs, g1=1, g2=0)) # 输出:[1, 0, 0, 0, 0]
注意事项
- lambda封装的方案无安全隐患、性能更好,优先在表达式可控的场景使用
- 字符串+eval的方案仅适合完全可信的输入场景,必须做权限限制和输入校验,避免被注入恶意代码执行系统操作
内容的提问来源于stack exchange,提问作者Zhe Wang
相关产品推荐
相关产品推荐

