Python 刽子手计划的缺陷
我需要编写一个简单的hangman函数,它接受一个字符串(被猜测的单词)和一个字母列表(被猜测的字母)。 这是我正在使用的代码:Python 刽子手计划的缺陷,python,Python,我需要编写一个简单的hangman函数,它接受一个字符串(被猜测的单词)和一个字母列表(被猜测的字母)。 这是我正在使用的代码: def WordGuessed(Word, letters): if letters == []: return False else: for i in letters: if i not in Word: return False else:
def WordGuessed(Word, letters):
if letters == []:
return False
else:
for i in letters:
if i not in Word:
return False
else:
if i == letters[-1]:
return True
代码通常是有效的,但我发现偶尔会打印出错误的答案。例如,如果
WordGuessed('durian', ['h', 'a', 'c', 'd', 'i', 'm', 'n', 'r', 't', 'u'])
当它应该打印为真时,它打印为假。有人能看出我的代码哪里错了吗?一旦发现单词中没有的猜测字母,就返回False。在您的示例中,第一个字母不在单词中 如果您在
单词
中循环并检查每个字母是否在数组中,则该操作将有效:
def WordGuessed(Word, letters):
if letters == []:
return False
else:
for i in Word:
if i not in letters:
return False
else:
if i == Word[-1]:
return True
# prints True
print(WordGuessed('durian', ['h', 'a', 'c', 'd', 'i', 'm', 'n', 'r', 't', 'u']))
# prints False, missing 'u'
print(WordGuessed('durian', ['h', 'a', 'c', 'd', 'i', 'm', 'n', 'r', 't']))
@乔霍普金斯说得对:与其检查单词是否包含所有猜测的字母,不如检查单词的所有字母是否都是猜测的 但您的代码可以更干净:
- 如果需要检查
实例是否为空列表
- 如果我们已经到达
for-else
的else
块,这意味着我们已经到达了iterable的末尾,而没有
ing或返回
ing,则无需额外检查中断
def WordGuessed(Word, letters):
if not letters:
return False
else:
for i in Word:
if i not in letters:
return False
else:
return True
最后,因为我们只需要检查一次字母的外观,所以我们可以使用独特的字母集合,如
试验
def WordGuessed2(Word, letters):
return set(Word).issubset(set(letters))
>>> word = 'durian'
>>> guessed_letters = ['h', 'a', 'c', 'd', 'i', 'm', 'n', 'r', 't']
>>> WordGuessed(word, guessed_letters)
False
>>> WordGuessed2(word, guessed_letters)
False
>>> guessed_letters.append('u')
>>> WordGuessed(word, guessed_letters)
True
>>> WordGuessed2(word, guessed_letters)
True