【问题标题】:IF ... Elif...Else flowIF ... Elif...Else 流
【发布时间】:2012-07-30 08:04:31
【问题描述】:

我创建了一个带有 if 流控制的函数,我想知道一些关于它的事情。

class Supplier(Process):

    def weeklySupply(self):
        global D1Vals
        xMeet = D1Vals[0]
        lead = 0
        capac = 150.0
        supply = 0
        if stocked.amount >= 15000:
            supply = 0
            yield put, self, stocked, supply
            S1Vals.append(0)
        elif supply >= capac:
            supply = capac
            yield put, self, stocked, supply
            S1Vals.append(capac)
        else:
            supply = random.triangular(.70 * xMeet , xMeet , xMeet * 1.05)
            yield put, self, stocked, supply
            print ('Week:'+'%6.0f:Supplied: %6.0f units. CurSupply = %6.0f' %
                   (now() + 1., supply, stocked.amount))
            yield hold, self, lead
            S1Vals.append(supply)
            del D1Vals[0]

虽然我编码的是:

  • 如果库存对象中的数量 >= 15000,则该对象生成零供应 或者如果生成的供应值大于预定义的“capac”数量,则供应值 = 'capac'。

  • 如果上述情况均不成立,则供应值生成为随机分布。但是,当我得到输出时,供应值确实超过了 'capac' 值 150。

我是否误解了如何进行流程?

【问题讨论】:

  • stocked.amount 定义在哪里?
  • 我猜你的random.triangular(.70 * xMeet , xMeet , xMeet * 1.05) 计算仍然可以高于capac..
  • 此外,您通常会产生 4 个值 (put, self, stocked, supply),但在 else 分支中,您会产生 3 个值 (hold, self, lead)。确保使用此生成器的任何内容都考虑到这一点,而不是“弥补”第四个参数的值,这恰好是 supply
  • elif supply >= capac 条件将永远不会被输入,因为 supplycapac 在此时具有固定值。
  • @manengstudent:使用min(supply, capac) 操作?这将限制产能的供应。

标签: python flow


【解决方案1】:

不要像您在问题中所做的那样将if elif 结构与某种or 混淆。仅当if 条件为False 时,才会评估elif 条件。 我想,你真正想要的是:

if stocked.amount >= 15000:
    if supply >= capac:
        supply = capac
        yield put, self, stocked, supply
        S1Vals.append(capac)
     else:
        supply = 0
        yield put, self, stocked, supply
        S1Vals.append(0)
else:
    supply = random.triangular(.70 * xMeet , xMeet , xMeet * 1.05)
    ...

但这只有在 supply 没有在函数开头用 0 初始化时才有效。

【讨论】:

  • 我的S1Vals.append(0) 停止在这个结构中运行,它似乎没有附加到列表中
【解决方案2】:

似乎是一种享受,还有一些值得我思考的好东西。我能看到的唯一问题是现在我的 S1Vals 列表已停止将零供应附加到列表中。我可以在我的输出图上看到这一点,也可以在我执行 len(S1Vals) 时看到这一点。最终代码与您的建议是:

if stocked.amount >= 15000:
        if supply >= capac:
            supply = capac
            S1Vals.append(capac)
            yield put, self, stocked, supply
        else: 
            supply = 0.0
            yield put, self, stocked, supply
            S1Vals.append(supply)
    else:
        supply = min(capac, random.triangular(.70 * xMeet , xMeet , xMeet * 1.05))
        yield put, self, stocked, supply
        print ('Week:'+'%6.0f:Supplied: %6.0f units. CurSupply = %6.0f' %
               (now() + 1., supply, stocked.amount))
        yield hold, self, lead
        S1Vals.append(supply)
        del D1Vals[0]

为了到达这里,我使用了上面来自 MaxPower 的流量建议,也是 min(supply,capac),并声明了 global supply。最后一个问题似乎supply = 0.0 从来没有出现过,但它真的应该吗?

【讨论】:

  • 您必须考虑您的条件之间的关系。在您的模型中,哪个条件更强?
  • @MaxPowers 。我理解它是主要的if..elsestocked.amount >= 15000 然后内部if...else 需要决定,否则'外部'else: 开始。当我阅读时我的要求是:supply = 0stocked.amount 超过 15000 supply`` can never be greater than capac` 任何其他情况都适合外部else: 声明。