返回False以打破循环
我想摆脱这种循环。如果单词中的字符不在手中,我已经返回False并添加了一个中断,这是一个基于拼字游戏字母分数的每个字母具有整数值的字典。这是一个更大的游戏的一部分,但是这个特殊的功能会检查我输入的单词是否有效。返回False以打破循环
现在我遇到的问题是,如果输入的单词不在单词列表中,输入被拒绝并且玩家被要求输入另一单词。但是,如果我输入单个字母作为例子,手仍会更新为删除该字母,因此当我使用全部三个字母重新输入一个单词时不可用。
例如:
如果我的手为rü牛逼
,我输入u,我的话将是无效的,但手现在只包含[R吨。因此,车辙将不再可用。
我对编码最后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中不存在。任何建议,使这种情况发生?由于我是编程新手,我一直在努力工作。
在此先感谢!
有在你的代码的几个问题,我已经重构它,使其更清晰(和固定它,那是一点:))
小问题:
- 不是最优的:首先检查单词是否在word_list中(最好使用
set
而不是列表),然后测试可用字母 - 几个
return
语句,然后是break
。混乱。
主要问题:
主要的问题是,你会影响到remaining
和hand
你改变它,从而破坏你的head
每次打电话,说明您所遇到的行为的功能。
你必须复制字典,它会工作。 Python参数是通过引用传递的,所以如果您通过list
或dict
并在函数内修改它,则它将保持修改状态,除非您复制该参数。
中断没有实际问题&返回:我的想法是,当你第一次调用刚刚销毁输入数据时,当你连续调用你的函数几次时,你认为它不起作用。
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
感谢您的建议!对此,我真的非常感激! – Chris
的可能的复制[如何摆脱在Python多个循环?(http://*.com/questions/189645/how-to-break-out-of-multiple-loops-in-蟒蛇) –
我已经看了很多次这个问题,并没有对我有很大的意义,这种情况似乎有点不同。我绝对想尽量保持这个代码尽可能简单,因为我在初学者python课程中,并且由于我们还没有学到太多东西,我们期望得到一个简单的答案。另外,我希望获得更多的个性化答案,这就是为什么我花时间和精力来问问题和放置代码的原因。 – Chris
我不完全明白你要求的内容太清楚,但你可以将变量设置为true,并在变量为true时循环,然后在需要跳出循环的任何位置将其设置为false。 – Harrison