1. ホーム
  2. python

[解決済み] TypeError: 型 'NoneType' の引数は反復可能ではありません。

2022-01-28 07:42:44

質問

Pythonでハングマンゲームを作っています。このゲームでは、1つのPythonファイルに、配列からランダムな文字列を選択し、変数に格納する関数があります。その変数は、別のファイルにある関数に渡されます。その関数は、ユーザーの推測を文字列として変数に格納し、その推測が単語の中にあるかどうかをチェックします。しかし、私が文字を入力してエンターキーを押すたびに、この質問のタイトルのエラーが表示されます。念のため、Python2.7を使っています。以下は、単語を受け取る関数のコードです。

import random

easyWords = ["car", "dog", "apple", "door", "drum"]

mediumWords = ["airplane", "monkey", "bananana", "window", "guitar"]

hardWords = ["motorcycle", "chuckwalla", "strawberry", "insulation", "didgeridoo"]

wordCount = []

#is called if the player chooses an easy game. 
#The words in the array it chooses are the shortest.
#the following three functions are the ones that
#choose the word randomly from their respective arrays.
def pickEasy():
    word = random.choice(easyWords)
    word = str(word)
    for i in range(1, len(word) + 1):
        wordCount.append("_")

#is called when the player chooses a medium game.
def pickMedium():
    word = random.choice(mediumWords)
    for i in range(1, len(word) + 1):
        wordCount.append("_")

#is called when the player chooses a hard game. 
def pickHard():
    word = random.choice(hardWords)
    for i in range(1, len(word) + 1):
        wordCount.append("_")

さて、以下はユーザーの推測を取り込んで、それがゲームに選ばれた単語に入っているかどうかを判断するコードです(wordCount変数には注意を払わないでください。また、"words"は、上記のコードを含むファイルの名前です)。

from words import *
from art import *

def gamePlay(difficulty):
    if difficulty == 1:
        word = pickEasy()
        print start
        print wordCount
        getInput(word)

    elif difficulty == 2:
        word = pickMedium()
        print start
        print wordCount

    elif difficulty == 3:
        word = pickHard()
        print start
        print wordCount

def getInput(wordInput):
    wrong = 0
    guess = raw_input("Type a letter to see if it is in the word: \n").lower()

    if guess in wordInput:
        print "letter is in word"

    else:
        print "letter is not in word"

これまで、gamePlay関数内の変数"guess"をstr()で文字列に変換したり、.lower()で小文字にしてみたり、wordsファイルでも同様のことをやっています。以下は、これを実行したときに表示されるエラーです。

File "main.py", line 42, in <module>
    main()
  File "main.py", line 32, in main
    diff()
  File "main.py", line 17, in diff
    gamePlay(difficulty)
  File "/Users/Nathan/Desktop/Hangman/gameplay.py", line 9, in gamePlay
    getInput(word)
  File "/Users/Nathan/Desktop/Hangman/gameplay.py", line 25, in getInput
    if guess in wordInput:

ここにある "main.py" は私が書いた別の Python ファイルです。もし他のファイルも見たいなら教えてください。しかし、今回紹介したものが唯一の重要なものだと感じています。お時間をいただき、ありがとうございました。もし、重要なことが抜けていたら教えてください。

解決方法は?

関数が何も返さない場合など。

def test():
    pass

という暗黙の戻り値を持っています。 None .

このように、あなたの pick* メソッドが何も返さない場合などです。

def pickEasy():
    word = random.choice(easyWords)
    word = str(word)
    for i in range(1, len(word) + 1):
        wordCount.append("_")

は、それらを呼び出す行、例えば

word = pickEasy()

セット word から None ということで wordInputgetInputNone . ということになります。

if guess in wordInput:

が相当します。

if guess in None:

None のインスタンスです。 NoneType はイテレータ/繰り返し機能を提供しないので、この型エラーが発生します。

修正方法は、戻り値の型を追加することです。

def pickEasy():
    word = random.choice(easyWords)
    word = str(word)
    for i in range(1, len(word) + 1):
        wordCount.append("_")
    return word