我正在制作一个极其简单的计算器风格的应用程序,其中使用 5 个参数调用控制函数。第一个是设置计算器模式的字符串,其他 4 个是正在使用的数字。我使用了字典来促进各种模式之间的切换。
但是,应用程序似乎正在使用数字检查所有功能,而不仅仅是我想要的功能。例如,如果我另外使用负数,我会在平方根函数中得到数学域错误(显然不能使用负数)。使用正常的正数是没有问题的。
感谢您提供有关发生这种情况的原因以及解决方法的任何帮助或信息。
这是我的原始代码:
import math
def control(a, x, y, z, k):
return {
'ADDITION': addition(x, y),
'SUBTRACTION': subtraction(x, y),
'MULTIPLICATION': multiplication(x, y),
'DIVISION': division(x, y),
'MOD': modulo(x, y),
'SECONDPOWER': secondPower(x),
'POWER': power(x, y),
'SECONDRADIX': secondRadix(x),
'MAGIC': magic(x, y, z, k)
}[a]
def addition(x, y):
return float(x) + float(y)
def subtraction(x, y):
return float(x) - float(y)
def multiplication(x, y):
return float(x) * float(y)
def division(x, y):
return float(x) / float(y)
def modulo(x, y):
return float(x) % float(y)
def secondPower(x):
return math.pow(float(x),2.0)
def power(x, y):
return math.pow(float(x),float(y))
def secondRadix(x):
return math.sqrt(float(x))
def magic(x, y, z, k):
l = float(x) + float(k)
m = float(y) + float(z)
return (l / m) + 1.0
a = input()
x = input()
y = input()
z = input()
k = input()
try:
control(a, x, y, z, k)
except ValueError:
print("This operation is not supported for given input parameters")
out = control(a, x, y, z, k)
print(out)
这是日志:
C:\<path>\Python\Python35-32\python.exe C:/<path>/calculator.py
ADDITION
-6.0
5
3
2
This operation is not supported for given input parameters
Traceback (most recent call last):
File "C:/<path>/calculator.py", line 67, in <module>
out = control(a, x, y, z, k)
File "C:/<path>/calculator.py", line 13, in control
'SECONDRADIX': secondRadix(x),
File "C:/<path>/calculator.py", line 47, in secondRadix
return math.sqrt(float(x))
ValueError: math domain error
Process finished with exit code 1
最佳答案
您需要延迟评估您的功能:
from functools import partial
def control(a, x, y, z, k):
return {
'ADDITION': partial(addition, x, y),
'SUBTRACTION': partial(subtraction, x, y),
'MULTIPLICATION': partial(multiplication, x, y),
'DIVISION': partial(division, x, y),
'MOD': partial(modulo, x, y),
'SECONDPOWER': partial(secondPower, x),
'POWER': partial(power, x, y),
'SECONDRADIX': partial(secondRadix, x),
'MAGIC': partial(magic, x, y, z, k)
}[a]()
在每次调用 control
时创建柯里化(Currying)函数的效率很低,因此这是第二种方法,仅创建一次字典:
def control(a, x, y, z, k):
return control.funcs[a](x, y, z, k)
control.funcs = {
'ADDITION': (lambda x, y, z, k: addition(x, y)),
'SUBTRACTION': (lambda x, y, z, k: subtraction(x, y)),
'MULTIPLICATION': (lambda x, y, z, k: multiplication(x, y)),
'DIVISION': (lambda x, y, z, k: division(x, y)),
'MOD': (lambda x, y, z, k: modulo(x, y)),
'SECONDPOWER': (lambda x, y, z, k: secondPower(x)),
'POWER': (lambda x, y, z, k: power(x, y)),
'SECONDRADIX': (lambda x, y, z, k: secondRadix(x)),
'MAGIC': (lambda x, y, z, k: magic(x, y, z, k))
}
此时,去掉control
函数并直接使用字典可能会更简单。
关于Python字典切换通过其他函数而不仅仅是调用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33132132/