返回False以打破循环

时间:2016-08-13 19:32:07

标签: python loops return

我试图摆脱这个循环。如果单词中的字符不在手上,我会返回False并添加一个中断,这是一个基于Scrabble字母分数的每个字母整数值的字典。这是较大游戏的一部分,但是这个特殊功能会检查我输入的单词是否有效。

现在我遇到的问题是如果输入的单词不在单词列表中,则输入被拒绝并且要求玩家输入另一个单词。但是......如果我输入一个单独的字母,那么手仍然会被更新以删除该字母,因此当我使用所有三个字母重新键入单词时,它不可用。

例如:

如果我的手是

我输入你,我的话将无效,但现在只有r t。因此车辙将不再可用。

在编码的最后24小时之后,我对循环和返回语句有了很好的把握,除了我无法弄清楚如何构造这个循环以避免这个问题。

以下是代码:

def is_valid_word(word, hand, word_list):
"""
Returns True if word is in the word_list and is entirely
composed of letters in the hand. Otherwise, returns False.
Does not mutate hand or word_list.

word: string
hand: dictionary (string -> int)
word_list: list of lowercase strings
"""

    remaining = hand
    for c in word:
        if c not in remaining.keys():  """Loop 1"""
            return False
            break
        if c in remaining.keys():     """Loop 2"""
            remaining [c] -= 1
        if remaining [c] < 0:       """Loop 3"""
            return False
    if word in word_list:
        return True
    else:
        return False

然而,我构造循环最终条件将失败。如果我缩进第2循环和第3循环,那么如果字母不在手中,它们将会失败,反之亦然。显然,一个简单的修复就像break(n循环),但在Python中不存在。有任何建议可以实现吗?因为我是编程新手,所以我已经做了很长时间了。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题,我已经重构它以使其更清晰(并修复它,这就是重点:))

次要问题

  • 不是最优的:首先检查单词是否在word_list中(你最好使用set而不是列表,会更快),然后测试可用的字母
  • 多个return语句,后跟break。混乱。

主要问题

主要问题是您影响remaininghand并进行更改,因此每次调用此功能时都会销毁head,这会解释您遇到的行为

你必须复制字典,它才会起作用。 Python参数通过引用传递,因此如果您传递listdict并在函数内修改它,那么它将保持修改状态,除非您复制它。

休息时没有真正的问题返回:我的想法是,当你第一次调用函数只是破坏你的输入数据时,你连续几次调用函数时认为它不起作用。

def is_valid_word(word, hand, word_list):
    """
    Returns True if word is in the word_list and is entirely
    composed of letters in the hand. Otherwise, returns False.
    Does not mutate hand or word_list.

    word: string
    hand: dictionary (string -> int)
    word_list: list of lowercase strings
    """
    # make a copy or hand is destroyed by your test
    remaining = hand.copy()  
    rval = False

    if word in word_list:
        rval = True
        # don't check if word is not in word_list (optim)
        for c in word:
            if c not in remaining: # no need to specify keys()
                rval = False
                break

            remaining [c] -= 1
            if remaining [c] < 0:
                rval = False
                break

    return rval