web-dev-qa-db-ja.com

TypeError:シーケンス項目0:予期される文字列、NoneTypeが見つかりました

私は戦艦のゲームを改善しようとしています。元のバージョンは問題なく正常に動作します。最初のバージョンでは船が毎回同じ場所に配置されるという事実を克服するのに役立つコードを書いたので、1つの船(2つの正方形でできている)から始めました。私は2つの関数を作成してこれを行いました。最初の関数はランダムな座標を生成します...

 # Destroyer (2 squares)
def Deploy_Destroyer_1(Player):
    Rand_col_1 = randint(0,11)
    if Rand_col_1 <= 5:
        Rand_row_1 = randint(0,11)
    else:
        Rand_row_1 = randint(6,11)
    return Rand_col_1
    return Rand_row_1
    if Player[Rand_row_1][Rand_col_1] == 'X':
        Deploy_Destroyer_1(Player)
    else:
        Deploy_Destroyer_2(Player)

2番目の試行は、この座標を条件に対して調整します(ボードにフィットするかどうか、および配置できる回転)。

def Deploy_Destroyer_2(Player):
    if Rand_col_1 == 5 and Rand_row_1 == 6:
        #can be 1, 2, 3 or 4... in that order below
        Rand_position_1 = randint(1,4)
        if Rand_position_1 == 1:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 + 1][Rand_col_1] = 2
        if Rand_position_1 == 2:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 - 1][Rand_col_1] = 2
        if Rand_position_1 == 3:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 + 1] = 2
        if Rand_position_1 == 4:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 - 1] = 2
    Elif Rand_col_1 in range(1,4) and Rand_row_1 in range(1,10):
        #can be any 1, 2, 3 or 4... in that order below
        Rand_position_1 = randint(1,4)
        if Rand_position_1 == 1:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 + 1][Rand_col_1] = 2
        if Rand_position_1 == 2:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 - 1][Rand_col_1] = 2
        if Rand_position_1 == 3:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 + 1] = 2
        if Rand_position_1 == 4:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 - 1] = 2
    Elif Rand_col_1 in range(5,10) and Rand_row_1 in range(7,10):
        #can be any 1, 2, 3 or 4... in that order below
        Rand_position_1 = randint(1,4)
        if Rand_position_1 == 1:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 + 1][Rand_col_1] = 2
        if Rand_position_1 == 2:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 - 1][Rand_col_1] = 2
        if Rand_position_1 == 3:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 + 1] = 2
        if Rand_position_1 == 4:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 - 1] = 2
    Elif Rand_col_1 == 0 and Rand_row_1 == 0:
        #can be any 1, 2, 3 or 4... in that order below
        Rand_position_1 = randint(1,4)
        if Rand_position_1 == 1:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 + 1][Rand_col_1] = 2
        if Rand_position_1 == 2:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 - 1][Rand_col_1] = 2
        if Rand_position_1 == 3:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 + 1] = 2
        if Rand_position_1 == 4:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 - 1] = 2
    Elif (Rand_col_1 == 5 and Rand_row_1 == 0) or (Rand_col_1 == 11 and Rand_row_1 ==6):
        #can be one or four
        #check brackets and booleans here
        Rand_position_1 = randint(1,2)
        if Rand_position_1 == 1: #position 1
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 + 1][Rand_col_1] = 2
        if Rand_position_1 == 2: #position 4
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 - 1] = 2
    Elif Rand_col_1 == 0 and Rand_row_1 == 11:
        #can be 2 or 3
        Rand_position_1 = randint(2,3)
        if Rand_position_1 == 2: #position 2
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 - 1][Rand_col_1] = 2
        if Rand_position_1 == 3: #position 3
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 + 1] = 2
    Elif Rand_col_1 == 11 and Rand_row_1 == 11:
        #can be 2 or 4
        Rand_position_1 = randint(1,2)
        if Rand_position_1 == 1: #position 2
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 - 1][Rand_col_1] = 2
        if Rand_position_1 == 2: #position 4
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 - 1] = 2
    Elif (Rand_row_1 == 0 and Rand_col_1 in range(1,4)) or (Rand_row_1 == 6 and Rand_col_1 in range(6,10)):
        #can be 1, 3 or 4
        #check brackets and booleans here
        Rand_position_1 = randint(1,3)
        if Rand_position_1 == 1: #position 1
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 + 1][Rand_col_1] = 2
        if Rand_position_1 == 2: #position 3
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 + 1] = 2
        if Rand_position_1 == 3: #position 4
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 - 1] = 2
    Elif (Rand_col_1 == 5 and Rand_row_1 in range(1,5)) or (Rand_col_1 == 11 and Rand_row_1 in range(7,10)):
        #can be 1, 2 or 4
        #check brackets and booleans here
        Rand_position_1 = randint(1,3)
        if Rand_position_1 == 1: #position 1
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 + 1][Rand_col_1] = 2
        if Rand_position_1 == 2: #position 2
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 - 1][Rand_col_1] = 2
        if Rand_position_1 == 3: #position 4
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 - 1] = 2
    Elif Rand_col_1 == 0 and Rand_row_1 in range(1,10):
        #can be 1, 2 or 3... in that order below
        Rand_position_1 = randint(1,3)
        if Rand_position_1 == 1:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 + 1][Rand_col_1] = 2
        if Rand_position_1 == 2:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 - 1][Rand_col_1] = 2
        if Rand_position_1 == 3:
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 + 1] = 2
    Elif Rand_col_1 in range(1,10) and Rand_row_1 == 11:
        #can be 2, 3 or 4
        Rand_position_1 = randint(1,3)
        if Rand_position_1 == 2: #position 2
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1 - 1][Rand_col_1] = 2
        if Rand_position_1 == 3: #position 3
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 + 1] = 2
        if Rand_position_1 == 4: #position 4
            Player[Rand_row_1][Rand_col_1] = 2
            Player[Rand_row_1][Rand_col_1 - 1] = 2

コードを適用した後、このエラーが発生します。

    Traceback (most recent call last):
  File "<stdin>", line 310, in <module>
  File "<stdin>", line 15, in PrintBoards
TypeError: sequence item 0: expected string, NoneType found

そして、これがPrintBoards関数です

def PrintBoards(Player,Opponent):
    print ' '*10, 'PLAYER', ' '*30, 'OPPONENT'
    letters = ['A','B','C','D','E','F','G','H','I','J','K','L']
    for x in range(6):
        print letters[x],"  ".join(map(DisplayChar,Player[x]))," "*18,"| ","  ".join(map(DisplayChar,Opponent[x]))
    for x in range(6,12):
        print letters[x],"  ".join(map(DisplayChar,Player[x]))," | ","  ".join(map(DisplayChar,Opponent[x]))
    print " ","  ".join(map(str,range(1,10)))," 10 11 12","  ","  ".join(map(str,range(1,10)))," 10 11 12"

ここにDisplayChar関数があります

def DisplayChar(x):
    if x==0: 
        return '?'
    Elif x==1:
        return ' '
    Elif x==2:
        return 'X'
    Elif x==3:
        return ' '
    Elif x==4:
        return '*'

上記の関数をこれに編集してみました...

def DisplayChar(x):
        if x==0: 
            return '?'
        Elif x==2:
            return 'X'
        Elif x==4:
            return '*'
        else:
            return ' '

しかし、それは代わりに私にこのエラーを与えました

Traceback (most recent call last):
  File "<stdin>", line 309, in <module>
  File "<stdin>", line 15, in PrintBoards
TypeError: argument 2 to map() must support iteration

また、PrintBoards関数の後にPlayerとOpponentのリストを印刷して、0と1(DisplayChar関数を参照)が含まれていることを確認しました(新しい非常に長いコードを挿入したときではなく、元のコードに挿入したとき)。

この次のビットはマイケルへの応答です

PLAYER                                OPPONENT
[[1, 1, 1, 1, 1, 1], [1, 2, 2, 2, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1], [1, 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1], [1, 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
[0, 0, 0, 0, 0, 0]
A                                                       |  ?  ?  ?  ?  ?  ?
<function Deploy_Destroyer_1 at 0x1c2634>
[0, 0, 0, 0, 0, 0]
B
Traceback (most recent call last):
  File "<stdin>", line 314, in <module>
  File "<stdin>", line 17, in PrintBoards
TypeError: argument 2 to map() must support iteration

[〜#〜]編集[〜#〜]

誰かが関数を呼び出すのではなく割り当てたと親切に指摘した後、別のエラーが発生したことがわかりました(Pythonは私が好きだとは思いません)

Traceback (most recent call last):
  File "<stdin>", line 313, in <module>
  File "<stdin>", line 17, in PrintBoards
TypeError: argument 2 to map() must support iteration

以下に、私が愚かなことをした場合に備えて関数を呼び出した場所も含めました

Player, Opponent = InitBoards()
Player = DeployFleet(Player), Deploy_Destroyer_1(Player)
PrintBoards(Player,Opponent)

編集2

私はそれをMicheal0x2aが言ったものに変更し、エラーなしで実行されましたが、コードが配置している船は消えました:s

私が理解していることから、PrintBoards関数は、リストの項目をPlayer関数にマッピングすることにより、DisplayCharのボードを出力します(2がリストの項目の場合、 Xなどを出力します)。したがって、私の初心者の知識は、Deploy_Destroyer_1関数をMain関数(上記に含まれる)のPlayer =で呼び出して、リスト内の項目が確実に変更されるようにして、印刷は変更する必要があります。

新しいコード(Deploy_Destroyer_1)に問題があり、これが正しく行われていない(つまり、リスト内のアイテムが変更されないため、正しい文字が印刷されない、またはその他の何か)と思われます。考えられないことです)。

しかし、私が自分を混乱させた大きなチャンスもあります:)

私は2、3週間Pythonしか学んでいないので、誰かが私を助けるために詳細が必要な場合は尋ねてください

16
BLeeM

TypeError: sequence item 0: expected string, NoneType found」の根本的な原因を探していたためにここに到着した場合、これらの行に沿って何かを行っていることが原因である可能性があります...

','.join([None])
93
Noel Evans

DisplayChar関数にはデフォルト値がありません。 xのすべての可能なケースを処理する場合、これは害を及ぼしませんが、明らかにそうではありません。試す

def DisplayChar(x):
    if x == 0: 
        return '?'
    Elif x == 2:
        return 'X'
    Elif x == 4:
        return '*'
    else:
        return ' '

しかし、これはおそらくあなたがそれらを期待しないところに空の文字列を生み出すでしょう。

一般的には、まず最初に適切なPythonチュートリアルを実行することをお勧めします。上記のコードはすべて大幅に簡略化できます。

1
Johannes Charra

問題は、おそらく次の4行のどこかにあります。

_for x in range(6):
    print letters[x],"  ".join(map(DisplayChar,Player[x]))," "*18,"| ","  ".join(map(DisplayChar,Opponent[x]))
for x in range(6,12):
    print letters[x],"  ".join(map(DisplayChar,Player[x]))," | ","  ".join(map(DisplayChar,Opponent[x]))
_

これらの行の中で、joinステートメントを複数回使用しています。 joinステートメントが機能するには、文字列のリストが必要です。ただし、DisplayCharを_Player[x]_にマッピングしている場合、DisplayChar関数は、何らかの文字列ではなく値Noneを返します。

DisplayChar関数を見ると、0から4までの値しか処理しません。使用するリストには、追加の数値または文字が含まれている可能性があります。 xが_5_のようになった場合、DisplayCharは終了し、値Noneを返します。関数はデフォルトで値Noneを返すことに注意してください。

次のように、DisplayChar内でこれらの追加の数値を処理するか、DisplayCharを変更して、空の文字列を返すelseステートメントを含める必要があります。

_def DisplayChar(x):
    if x==0: 
        return '?'
    Elif x==1:
        return ' '
    Elif x==2:
        return 'X'
    Elif x==3:
        return ' '
    Elif x==4:
        return '*'
    else:
        return ' '
_

編集:

新しい編集があれば、何が起こっているのかわかっていると思います。

_Player[x]_を印刷したときに、2回目に_<function Deploy_Destroyer_1 at 0x1c2634>_が印刷されたことに注意してください。

つまり、どこか、コードの奥深くに埋め込まれ、_Player[row] = Deploy_Destroyer_1_の効果に対して何かを実行したことになります(括弧がないことに注意してください!)。関数を呼び出す代わりに、関数を割り当てました

ほとんどの場合、問題を解決するには、不足している括弧を探して追加する必要があります。

編集2:

あなたの問題は次の行にあると思います:Player = DeployFleet(Player), Deploy_Destroyer_1(Player)

直後に_print Player_を実行すると、おそらくNoneが後に続く数値の大きなリストが表示されると思います。

これは、DeployFleet関数がテーブルを返す(そうですか?)のに対して、_Deploy_Destroyer_1_関数は何も返さないためです。代わりに、Playerテーブルを変更するだけです。

これを修正するには、次のいずれかを試してください。

_Player = DeployFleet(Player)
Deploy_Destroyer_1(Player)
_

...または_Deployer_Destroyer_1_を変更して、完了時にPlayerを返すようにして、次のようにします。

_Player = DeployFleet(Player)
Deploy_Destroyer_1(Player)
_
0
Michael0x2a