You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python猜词游戏遇TypeError:'in'需字符串左操作数,求解决方案

解决Hangman游戏中的TypeError问题

嘿,我看到你在写Python猜词游戏时碰到了这个TypeError: 'in' requires string as left operand, not builtin_function_or_method错误,咱们来一步步搞定它!

错误根源定位

你代码里的这一行是问题核心:

guess = guess.lower

lower()是字符串的内置方法,必须加括号才能调用——不加括号的话,你不是把输入的字母转成小写,而是把guess变量赋值成了str.lower这个函数对象。这就导致后面执行if guess in word时,Python发现左边是个函数,不是字符串,直接抛出错误。

修复步骤&优化建议

除了修复这个核心错误,咱们还能优化代码里的其他小问题,让游戏逻辑更顺畅:

1. 修复lower()调用

把那行改成:

guess = guess.lower()

这样guess就会是你输入字母的小写字符串,完全符合in操作的类型要求。

2. 简化display列表初始化

你原来用循环替换下划线的写法有点繁琐,一行就能搞定:

display = ['_'] * len(word)

直接生成和目标单词长度一致的下划线列表,简洁又直观。

3. 调整guessedletters的作用域

你把guessedletters = []放在while循环里,每次循环都会清空列表,根本存不住已经猜过的字母。把它移到循环外面初始化:

guessedletters = []
while guess != 'quit':
    # 循环内的逻辑

4. 修复猜对字母后的display更新逻辑

你原来的更新代码位置不对,应该放在猜对字母的分支里,遍历目标单词把对应位置的下划线替换成猜对的字母:

if guess in word:
    print(f'Well Done! The word has {word.count(guess)} "{guess}"(s)')
    # 更新display列表
    for idx, char in enumerate(word):
        if char == guess:
            display[idx] = guess
    print(' '.join(display))  # 用空格分隔下划线,显示更美观

完整修复后的代码

import random

wordlist = ['python','hangman','hippopotamus','eschscholtzia']
word = random.choice(wordlist)
display = ['_'] * len(word)
guessedletters = []

print('Welcome to hangman, type quit to exit program.')
print(f'The word has {len(word)} letters')
print(' '.join(display))

while True:
    guess = input('Pick a letter? ').strip().lower()
    
    if guess == 'quit':
        print(f'The word was "{word}". Thanks for playing!')
        break
    
    if len(guess) != 1 or not guess.isalpha():
        print('Please enter a single letter only!')
        continue
    
    if guess in guessedletters:
        print(f'You already guessed "{guess}"! Try another one.')
        continue
    
    guessedletters.append(guess)
    
    if guess in word:
        print(f'Well Done! The word has {word.count(guess)} "{guess}"(s)')
        # 更新显示的下划线
        for idx, char in enumerate(word):
            if char == guess:
                display[idx] = guess
    else:
        print(f'Sorry, no "{guess}" in the word.')
    
    print(' '.join(display))

通用解决思路

以后碰到类似'in' requires string的错误,可以按这个流程排查:

  • 先检查in左边的变量类型:用type(guess)打印看看是不是字符串,如果是函数/其他类型,肯定有问题。
  • 回忆字符串方法的调用方式:所有字符串方法(比如lower()strip())都需要加括号,不然你拿到的是方法本身,不是执行后的结果。
  • 检查变量赋值逻辑:确认你有没有把函数、对象误赋值给本该是字符串的变量。

内容的提问来源于stack exchange,提问作者Orfevre

火山引擎 最新活动