试图用python构建一个复杂的计算器
我得到一个数字(num)和一个数学函数(func)的名称,(比如:log、sqrt、sin、cos等等) 我需要返回在数字上使用此函数的结果 这就是我得到的错误:试图用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
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