You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何传递公式而非计算结果?Python函数报错问题咨询

问题分析与解决方案

首先,咱们先拆解你遇到的两个核心问题:


1. 为什么提示sum()函数“不存在”?

你把自定义的sum()、substraccion()这些函数嵌套定义在了calculator函数的内部,这意味着这些函数的作用域只限于calculator函数内部——当你在外部的MAIN部分调用sum()时,Python找不到你自定义的这个函数,会默认调用内置的sum()函数,而内置sum()需要传入可迭代对象(比如列表),你无参调用自然会报错,看起来就像“函数不存在”一样。

另外还有个小拼写错误:calculator函数里的accion应该是action,不然会直接报NameError。


2. 如何传递“公式”而非计算结果?

你现在是直接把a+b的计算结果传给了calculator,如果想传递公式本身的逻辑(而不是预先算好的值),有两种安全且灵活的方式:

方案一:传递可调用的运算函数

把每个运算写成独立的函数,然后把函数本身作为参数传给calculator——这相当于传递了公式的逻辑,calculator可以在需要的时候执行这个运算:

def calculator(action, operation, a, b):
    print(f'I need two numbers to {action} them')
    try:
        result = operation(a, b)
        print(f'Calculation result: {result}')
    except ZeroDivisionError:
        print("Error: Can't divide by zero!")

# 定义各个运算函数(公式逻辑)
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def multiply(a, b):
    return a * b

def divide(a, b):
    return a / b

# --- MAIN ---
a = int(input('Enter the first term: '))
b = int(input('Enter the second term: '))

# 传递运算函数给calculator
calculator('add', add, a, b)
# 你也可以直接调用其他运算
# calculator('subtract', subtract, a, b)

方案二:用lambda简化(无需单独定义函数)

如果不想写一堆单独的运算函数,可以用lambda表达式直接传递公式逻辑,更简洁:

def calculator(action, operation, a, b):
    print(f'I need two numbers to {action} them')
    try:
        result = operation(a, b)
        print(f'Calculation result: {result}')
    except ZeroDivisionError:
        print("Error: Can't divide by zero!")

# --- MAIN ---
a = int(input('Enter the first term: '))
b = int(input('Enter the second term: '))

# 直接传递lambda作为公式
calculator('add', lambda x, y: x + y, a, b)
calculator('multiply', lambda x, y: x * y, a, b)

(不推荐)传递字符串公式(用eval)

如果你一定要传递类似"a+b"这样的字符串公式,可以用eval(),但注意:eval会执行任意代码,若公式来自不可信的用户输入,会有严重安全风险,仅用于学习场景:

def calculator(action, formula_str, a, b):
    print(f'I need two numbers to {action} them')
    try:
        # 把a、b作为局部变量传入eval,执行公式字符串
        result = eval(formula_str, {}, {'a': a, 'b': b})
        print(f'Formula "{formula_str}" result: {result}')
    except Exception as e:
        print(f'Error: {e}')

# --- MAIN ---
a = int(input('Enter the first term: '))
b = int(input('Enter the second term: '))
calculator('add', 'a + b', a, b)

总结

  • 先解决作用域问题:不要把自定义运算函数嵌套在calculator内部,否则外部无法访问;
  • 传递公式逻辑的最佳方式是用函数或lambda,安全又灵活;
  • 避免在生产环境使用eval处理用户输入的公式。

内容的提问来源于stack exchange,提问作者Lisandro Dalla Costa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:13:53