Python字典切换通过其他函数而不仅仅是调用的函数

标签 python function math dictionary switch-statement

我正在制作一个极其简单的计算器风格的应用程序,其中使用 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/

相关文章:

php - 使用外部 API 访问时,Python Bottle API 无 Json 响应

r - 将不同列和不同行的值粘贴到 R 中的新 df

bash - 如何在 bash 中获取多个参数并将它们传递给 awk?

java - 我想将总购买量显示为 11.10 而不是 11.1

python - 当 Pyunit 和 Nose 测试失败时,为什么 py.test 通过单元测试(如预期的那样)?

Python - 在 re.compile 开头使用 (?!...) 失败

Python 将变量日期传递给函数

python - 凸包的增量面积

java绘制与直线相切的圆弧

python - 如何优化基于调色板的图像重新着色算法