如何修复Python hangman游戏TypeError: 'NoneType' has no len()报错
报错根因
你的代码触发TypeError: object of type 'NoneType' has no len()的核心原因是wordsPickedBank函数没有返回有效单词,同时还有多处语法、逻辑错误:
- 函数内部错误调用自身递归,没有把选中的随机单词返回,导致
wordPicked默认取值为None,对None调用len()方法直接报错 - 函数定义放在
while循环内部,每次循环都会重复定义函数,无意义消耗性能 str.split("")是非法语法,Python不支持用空字符串作为split的分隔符,后续运行到这行还会触发新报错- 现有死循环没有退出逻辑,游戏结束后无法正常终止
修复后完整代码
import random # 单词抽取函数统一放在循环外定义 def pick_random_word(): with open('words.txt', 'r', encoding='utf-8') as file: all_words = file.read().split() return random.choice(all_words) hangmanGame = True # 最多允许猜错6次,可自行调整 max_wrong_guesses = 6 while hangmanGame: # 抽取随机目标单词 target_word = pick_random_word() # 生成下划线占位符列表,不会暴露原始单词 display = ['_'] * len(target_word) wrong_guesses = 0 guessed_letters = set() print("新一轮 Hangman 游戏开始!") # 单轮游戏循环 while wrong_guesses < max_wrong_guesses and '_' in display: # 展示当前占位符,不会显示原始单词 print(f"\n当前单词:{' '.join(display)}") print(f"剩余猜错次数:{max_wrong_guesses - wrong_guesses}") guess = input("请输入你猜的字母:").strip().lower() # 输入合法性校验 if len(guess) != 1 or not guess.isalpha(): print("请输入单个有效字母!") continue if guess in guessed_letters: print("你已经猜过这个字母了,请换一个!") continue guessed_letters.add(guess) # 判断猜词是否正确 if guess in target_word: # 替换所有匹配的占位符 for idx, letter in enumerate(target_word): if letter == guess: display[idx] = guess else: wrong_guesses += 1 print(f"猜错了!字母 {guess} 不在目标单词里") # 单轮游戏结束判定 if '_' not in display: print(f"\n恭喜你猜对了!目标单词是:{target_word}") else: print(f"\n游戏失败!你用完了所有猜错次数,目标单词是:{target_word}") # 询问是否开启新一轮 play_again = input("\n是否要开始新一轮游戏?输入y继续,输入n退出:").strip().lower() if play_again != 'y': hangmanGame = False print("游戏结束,再见!")
功能说明
- 自动从
words.txt读取所有单词随机抽取,不会提前向用户暴露目标单词 - 游戏过程中仅展示和单词长度匹配的下划线占位符,猜对字母后才会更新对应位置的显示
- 自带输入合法性校验、重复猜词提示,游戏结束后支持自主选择开启新一轮或退出,循环逻辑正常
内容的提问来源于stack exchange,提问作者Dean
相关产品推荐
相关产品推荐

