如何阻止值返回“无”?

时间:2018-01-30 10:33:09

标签: python for-loop break

我正在尝试从我正在学习python的书中完成一个练习项目,我仍然坚持练习的第二部分,我应该编写一个代码,将一个列表添加到字典中。

为此我试图编写以下代码:

 def addToInventory(inventory, addedItems):
    for a in addedItems:
                   if a not in inventory:
                       inventory.setdefault(a, 1)

inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
inv = addToInventory(inv, dragonLoot)

然而,在最后一个for循环库存之后,它将返回none,因为它已到达列表的末尾,但这将导致inv为None并返回错误。

我在想,当返回的值为none时我可以停止代码,我试着编写一个elif语句,但它没有用。

任何想法如何做到这一点?

P.S:即使很明显,请不要发布上述完整的代码,我想自己做,我只是在寻找这个问题的答案:)。

3 个答案:

答案 0 :(得分:2)

您不应该将inv重新分配给该函数的返回值。它将在原地更改。只是做:

addToInventory(inv, dragonLoot)

答案 1 :(得分:2)

您的inv设置为None,因为在python中所有未明确return值的函数隐式return None

您定义addToInventory的方式,它将隐式修改inv(谨防这种副作用,有时这实际上不是您想要或期望的那样)。

仅使用函数调用替换inv = addToInventory(inv, dragonLoot)的替代方法是明确addToInventory return inventory。由您来决定您喜欢哪种风格。

修正:

我知道你要求不提供完整的代码解决方案,但是根据你的意见,这是我能够清楚地解释它的唯一方法。 正如我们在评论中讨论的那样,如果练习框架给出了其余代码,则需要添加一个显式的return。然而,重要的是 你放置那个语句。在python中,白色空间很重要。如果将返回值与inventory.setdefault一致,它将在循环的第一次迭代期间执行。要让它在循环中运行然后返回,return需要相同的缩进级别:

def addToInventory(inventory, addedItems):
    for a in addedItems:
        if a not in inventory:
            inventory.setdefault(a, 1)
    return inventory #<<<<<<< IN LINE WITH THE FOR

答案 2 :(得分:0)

您的函数不返回任何内容,因此inv为None

但丹尼尔所说的也会解决这个问题; - )