Python 刽子手计划的缺陷

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:

我需要编写一个简单的hangman函数,它接受一个字符串(被猜测的单词)和一个字母列表(被猜测的字母)。 这是我正在使用的代码:

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']))

@乔霍普金斯说得对:与其检查单词是否包含所有猜测的字母,不如检查单词的所有字母是否都是猜测的

但您的代码可以更干净:

  • 如果需要检查
    列表
    实例是否为空

  • 如果我们已经到达
    else
    for-
    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