【问题标题】:Returning False to Break out of a loop返回 False 以跳出循环
【发布时间】:2016-12-20 13:11:12
【问题描述】:

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

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

例如:

如果我的手是你的手

而我输入 u,我的话将无效,但手现在只包含 r t。因此 rut 将不再可用。

在最近 24 小时的连续编码之后,我对循环和 return 语句有了很好的掌握,但我不知道如何构造这个循环来避免这个问题。

代码如下:

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 loops) ,但这在 Python 中不存在。有什么建议可以做到这一点吗?因为我是编程新手,所以我已经研究了很长时间。

提前致谢!

【问题讨论】:

  • 我已经多次看过这个问题,但对我来说没有多大意义,而且情况似乎有点不同。我肯定会尽量让这段代码保持绝对简单,因为我正在学习 Python 初学者课程,并且由于我们还没有学到太多东西,因此需要一个简单的答案。此外,我希望获得更多个性化的答案,这就是我花时间和精力提出问题和放置代码的原因。
  • 我不太清楚您的要求,但是您可以将变量设置为 true 并在变量为 true 时循环,然后在需要中断的地方将其设置为 false在循环之外。
  • 我建议您使用调试器或print() 语句来弄清楚您的代码中发生了什么。

标签: python loops return


【解决方案1】:

您的代码中有几个问题,我已经对其进行了重构以使其更清晰(并修复了它,这就是重点:))

小问题

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

主要问题

主要问题是您将remaining 影响到hand 并对其进行了更改,因此每次调用解释您所遇到行为的函数时都会破坏您的head

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

break & return 没有真正的问题:我的想法是,当你连续多次调用你的函数时,你认为它不起作用,而第一次调用只会破坏你的输入数据。

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

【讨论】:

  • 感谢您的建议!我真的很感激!
猜你喜欢
  • 2012-10-14
  • 2013-06-07
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
相关资源
最近更新 更多