0

我在 python 中使用函数和切换器有一个问题:我有这个生产成本函数:

def fcostoproduccion (X,periodo):
if X > 0:
    switcher = {
            1:  200 + 15 * X,
            2:  100 + 20 * X,
            3:  100 + 4 * (X ** (1 / 2)),
            4:  100 + 3 * X,
            5:  150 + 6 * X,
            6:  200 + 12 * (X ** (1 / 2)),
            7:  200 + 15 * X,
            8:  100 + 10 * X,
            9:  100 + 6 * (X ** (1 / 2)),
            10: 200 + 5 * (X ** (1 / 2)),
            11: 100 + 10 * X,
            12: 150 + 6 * X

            }
return

最后我试图寻找价值:

  for l in range(j+1, k+1):
    Ordenar = O[l] 
    Produccion = fcostoproduccion(Demanda, l)

我知道我犯了一个错误,但不知道如何解决它。提前致谢。

4

2 回答 2

0

该功能的几件事fcostoproduccion

  1. 它总是返回None
  2. 它没有副作用
  3. 它只使用传递给它的第一个参数(即参数periodo在函数中未使用)。

很难用这个功能辨别你的意图,但我猜

  1. 你想计算一个基于X
  2. 计算所需返回值的公式因X字典的不同值而异switcher

基于以上假设,可以对函数fcostoproduccion进行如下修改:

def fcostoproduccion(X):
    switcher = {
    1:  200 + 15 * X,
    2:  100 + 20 * X,
    3:  100 + 4 * (X ** (1 / 2)),
    4:  100 + 3 * X,
    5:  150 + 6 * X,
    6:  200 + 12 * (X ** (1 / 2)),
    7:  200 + 15 * X,
    8:  100 + 10 * X,
    9:  100 + 6 * (X ** (1 / 2)),
    10: 200 + 5 * (X ** (1 / 2)),
    11: 100 + 10 * X,
    12: 150 + 6 * X
    }
    return switcher[X] if X in switcher else None #Handle cases where X switcher is not defined for X 

>>> [fcostoproduccion(i) for i in range(14)]
[None, 215, 140, 106.92820323027551, 112, 180, 229.39387691339815, 305, 180, 118.0, 215.81138830084188, 210, 222, None]
于 2017-11-10T03:20:29.103 回答
0

如果我理解正确,您需要一个好的旧开关盒的行为。不幸的是,python 中没有内置的 switch case。首选方法是使用字典。因此,你真的很亲近。尝试替换您的退货声明:

return switcher[X]

请注意,您只想在X > 1. 因此,请确保缩进您的return陈述并else根据需要处理案例。

请注意,在这种情况下,您的第二个论点似乎完全没用。所以你可能想删除periodo.

于 2017-11-10T03:11:53.367 回答