试图用python构建一个复杂的计算器

试图用python构建一个复杂的计算器,python,Python,我得到一个数字(num)和一个数学函数(func)的名称,(比如:log、sqrt、sin、cos等等) 我需要返回在数字上使用此函数的结果 这就是我得到的错误: def calc(): import math num=float(raw_input("Enter a number")) func=raw_input("Enter a function") result=math.func(num) return result a=calc() pri

我得到一个数字(num)和一个数学函数(func)的名称,(比如:log、sqrt、sin、cos等等) 我需要返回在数字上使用此函数的结果

这就是我得到的错误:

def calc():
    import math

    num=float(raw_input("Enter a number"))
    func=raw_input("Enter a function")
    result=math.func(num)
    return result

a=calc()
print a
回溯(最近一次呼叫最后一次):
文件“C:/Users/user/Desktop/try of 3”,第11行,在
a=计算量()
文件“C:/Users/user/Desktop/try of 3”,第8行,计算格式
结果=math.func(num)
AttributeError:“模块”对象没有属性“func”

请帮忙!如何修复它?

在数学模块中没有名为
func
的函数。 我想你想这么做,但我不确定

Traceback (most recent call last):
  File "C:/Users/user/Desktop/try of 3", line 11, in <module>
    a=calc()
  File "C:/Users/user/Desktop/try of 3", line 8, in calc
    result=math.func(num)
AttributeError: 'module' object has no attribute 'func'

问题是,当您执行此操作时:

return (num, func) 
您没有使用变量
func
,而是指的是显然不存在的名称
math.func
。要执行(我认为)您打算执行的操作,您必须按函数名称查找该函数:

result = math.func(...)

math.func
表示“从对象
math
获取名为
的属性”func“
(该对象没有)。如果要通过动态计算的名称获取属性,请使用:

或者,更安全:

result = getattr(math, func)(num)

我也会考虑保留函数的自定义字典:

func = getattr(math, funcname, None)
if func:
    return func(arg)
else:
    ... # unknown function, report error

这样,您就可以更轻松地扩展您的功能,使其超出标准
math
所提供的功能。

您应该使用
getattr

all_funcs = {'sin': math.sin,
             'cos': math.cos,
             'hex': hex}
...

func = all_funcs.get(funcname, None)
if func:
    return func(arg)
else:
    ... # unknown function, report error

这同样有效。对于要调用的每个函数,请使用如下所示的
if
/
elif
语句。例如,我只为
sqrt()
编写了一个语句。对其他函数也要这样做,然后写入
elif
语句

# place your import outside def
import math


def calc():

    num=float(raw_input("Enter a number"))
    func=raw_input("Enter a function")
    funcToCall = getattr(math, func)
    result=funcToCall(num)
    return result

a=calc()
print a

raw_input()
获取一个字符串,但
log()
sqrt()
是函数。你必须尝试另一种方式。也许他们否决了你在函数中放入
import
语句的投票。如果你解决了这个问题,我会投你一票……公平地说,我试图指出OP遗漏了什么。我已经进行了相应的编辑。感谢@PM2Ring指出
import
部分。显然我支付的钱不够注意代码别担心,Anzel,我意识到你只是对OP中的代码做了一点小小的更改。也许我过着一种庇护的生活,但在我加入Stackoverflow之前,我从未见过在正常函数中使用
import
。但这里似乎每一个新手都在这样做。:)这需要为您想从
math
使用的每个函数。至少,字典查找更像python:
{'sqrt':math.sqrt,…}
。是的!我完全同意!:)我认为这不值得投否决票,但为什么要在可以打印友好错误消息时引发异常?与其引发一般运行时错误,不如将
getattr()放在
调用一个
try…除了AttributeError
块。向上投票选择优雅的解决方案。字典允许程序同时提供来自不同模块的函数,这是一种简单的方法,将功能与源代码分离(您可以在不影响接口的情况下替换等效函数)让我们来决定函数的名称!
all_funcs = {'sin': math.sin,
             'cos': math.cos,
             'hex': hex}
...

func = all_funcs.get(funcname, None)
if func:
    return func(arg)
else:
    ... # unknown function, report error
# place your import outside def
import math


def calc():

    num=float(raw_input("Enter a number"))
    func=raw_input("Enter a function")
    funcToCall = getattr(math, func)
    result=funcToCall(num)
    return result

a=calc()
print a
def calc():
    import math

    num=float(raw_input("Enter a number"))
    func=raw_input("Enter a function")
    if func.lower() == "sqrt":
        result=math.sqrt(num)
    return result

a=calc()
print a