我正在尝试在python中创建一个非常简单的计算器。在使用函数之前我已经完成了一个工作,但是添加类证明是很难的。
def askuser():
global Question, x, y
Question = input("""Enter a word: ("Add", "Subtract", "Multiply", "Divise")""")
x = int(input("Enter first number: "))
y = int(input("Enter second number: "))
class calculating:
def __init__(self, x, y):
self.x = x
self.y = y
def add(self):
return self.x + self.y
def subtract(self):
return self.x - self.y
def multiplication(self):
return self.x * self.y
def division(self):
return self.x / self.y
math = calculating
def calc():
if Question == "Add":
t = math.add
print(t)
elif Question == "Subtract":
t = math.subtract
print(t)
elif Question == "Multiply":
t = math.multiplication
print(t)
elif Question == "Division":
t = math.division
print(t)
def final():
input("Press any key to exit:" )
def main():
askuser()
calc()
final()
main()
代码运行正常,但它给我一个“错误”而不是输出计算:
Enter a word: ("Add", "Subtract", "Multiply", "Divise")Add
Enter first number: 5
Enter second number: 5
function add at 0x02E4EC90
Press any key to exit:
为什么会这样?任何帮助都会很棒,谢谢。
答案 0 :(得分:2)
您正在打印函数本身,而不是调用它的结果。尝试:
def calc():
if Question == "Add":
t = math.add
elif Question == "Subtract":
t = math.subtract
elif Question == "Multiply":
t = math.multiplication
elif Question == "Division":
t = math.division
print t()
或更干净但更先进:
class UserInputCalculator(object):
operations = ["Add", "Subtract", "Multiply", "Divide"]
def __init__(self):
self.x = None
self.y = None
self.operation = None
def run(self):
self.prompt_for_operation()
self.prompt_for_x()
self.prompt_for_y()
if self.operation == 'Add':
return self.add()
elif self.operation == 'Subtract':
return self.subtract()
elif self.operation == 'Multiply':
return self.multiply()
elif self.operation = 'Divide':
return self.divide()
else:
raise ValueError('Unknown operation %s.' % operation)
def prompt_for_operation(self):
self.operation = input("Enter an operation: (%s)" % ', '.join(UserInputCalculator.operations))
if self.operation not in UserInputCalculator.operations:
raise ValueError('%s not a valid operation.' % self.operation)
return self.operation
def prompt_for_x(self):
try:
self.x = int(input("Enter first number: "))
except:
raise ValueError('Invalid value.')
return self.x
def prompt_for_y(self):
try:
self.y = int(input("Enter second number: "))
except:
raise ValueError('Invalid value.')
return self.y
def add(self):
return self.x + self.y
def subtract(self):
return self.x - self.y
def multiply(self):
return self.x * self.y
def divide(self):
return self.x / self.y
calculator = UserInputCalculator()
print calculator.run()
input("Press any key to exit:" )
答案 1 :(得分:1)
行:
t = math.multiplication
将函数对象math.multiplication
分配给t,然后使用下一行打印。您需要添加()
以使该函数实际执行:
t = math.multiplication()
答案 2 :(得分:0)
另外两个答案是正确的,说你在这里做的是打印函数本身,而不是调用它的结果。我认为你应该重新考虑这个程序的结构,并问问自己为什么你在这里使用类。一般而言,类应该是具有状态的东西,即与每个实例相关联的一个或多个变量。这需要实例化类;但是,您的代码不包含实例化(即使您定义了__init__
函数);第math = calculating
行只是将变量math
变为对类 calculating
的引用(不 的实例班级)。你使用全局变量而不是类变量,如果你以后想要将这个模块作为一个更大的程序的一部分导入(实际上,全局变量在大多数情况下通常不是一个好主意),这可能会有问题。 / p>
然后,我建议将函数视为采用特定变量集并返回其他一组变量的函数,而不是这种结构。这是不考虑函数的唯一方法,但在这个简单的计算器示例中,它可能是最好的方法。
让我们从上到下看。您的main
函数可能如下所示:
def main():
(q,x,y) = askuser()
ans = math[q](x,y)
final(ans)
请注意,我在这里所做的是将每个函数的结果传递给下一个函数。另请注意,我现在使用math
的语法不同;我将使用函数字典而不是一类函数。
让我们看一下如何实现main
调用的函数。首先,askuser
与您代码中的原始版本相同,但不包含global
声明的例外情况除外。
其次,math
将是一个字典,定义如下:
def add(x,y):
return x + y
def subtract(x,y):
return x - y
def multiply(x,y):
return x * y
def divide(x,y):
return x / y
math = {"Add" : add,
"Subtract" : subtract,
"Multiply" : multiply,
"Divide" : divide}
最后,final
应该打印出答案:
def final(ans):
print ans
input("Press any key to exit:" )
这通常比您的解决方案更清洁。但是,如果你想学习如何很好地使用类,那对你来说并不是很重要。那么想想你想要什么样的状态,然后以这种方式实现你的代码。例如,您可以通过以下方式添加类calculator
:
class calculator:
def compute(x,y):
print "No operation defined!"
def __init__(self,operation):
if operation in math:
self.compute = math[operation]
else:
print "%s is not a valid operation!"%operation
main
将如下所示:
def main():
(q,x,y) = askuser()
mycalc = calculator(q)
ans = mycalc(x,y)
final(ans)