Объект типа NoneType не имеет ошибки длины - PullRequest
0 голосов
/ 27 апреля 2020

Я написал следующую функцию, чтобы добавить элементы списка в строку.


import random 
import string 

def printmatches (word,x):
    y = len(word)
    z = [" "] *y 
    i = 0 
    while i<y:
        if word[i] == x: 
            z[i] = x 
        else:
            z[i] = " "  
        i+=1

    return (z)

def append(string,chars): ##append list to a string
    q = 0
    while q < len(string): 
        if string[q] == " " and chars[q] != " ":
            string[q] = chars[q]
        q+=1  

x = random.randint(0,55899)

def convertlist(x):
    q = " "
    a = 0
    while (a < len(x)):
        q+=x[a]
        a+=1
    return (q) 

try:
    f = open('words.txt', 'r')
    s = " "
    s = f.readline()

    L = s.split()

    word = L[x]

    f.close()

except IOError:
    print('file not found')

q=0

print word

print (printmatches('ereesvox','o') == [" "] * 8)  
current = [" "] * len(word)  
c = 0
char = " " 
while char != word and q < 3 and c <35: 
    char = raw_input (" ") 
    c+=1
    ##current.append(printmatches(word,char)) 
    append(current, printmatches(word,char)) 
    str = (append(current, printmatches(word,char)))
    if (convertlist(str) == word): 
        print 'Congratulations, you have won'
    if printmatches(word,char) == [" "]*len(word):    
        print "You have ", (2-q), " guesses left"   
        q+=1 
    if (q == 3):
        print "Game over"
    print ' '.join(current)     



x должен быть списком, но когда я выполняю код, его тип интерпретируется как Nonetype, и я получаю сообщение об ошибке, потому что я пытаюсь получить доступ к элементам внутри x и сравнить его длину. Как я могу решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020
def append(string,chars): ##append list to a string
    q = 0
    while q < len(string): 
        if string[q] == " " and chars[q] != " ":
            string[q] = chars[q]
        q+=1  

Это явно не возвращает значение, поэтому оно неявно возвращает None.

(Имя string здесь также очень плохой выбор: во-первых, вы ожидаете, что его передадут список, а не строка (поскольку, как вы, вероятно, узнали ранее, вы не можете изменить строку, подобную этой), а во-вторых, она скрывает импортированный модуль * 1006. * Но опять же, ваш код не использует Модуль string, поэтому вы не должны import его вообще.)

str = (append(current, printmatches(word,char)))

Теперь str - это None, потому что это результат вызова append.

if (convertlist(str) == word): 

Теперь мы пытаемся convertlist с None, что, конечно, не работает, поскольку мы хотели, чтобы список был передан в ...

def convertlist(x):
    q = " "
    a = 0
    while (a < len(x)):
        q+=x[a]
        a+=1
    return (q) 

.. и, следовательно, здесь len недопустимо применительно к None.


Естественным способом получения информации из функции является return этой информации. Создайте новую строку в append и return it; тогда вы можете использовать результат так, как вы пытаетесь его использовать. В качестве бонуса, поскольку вы создаете новый объект, вы можете фактически снова передать строку.

За исключением того, что я понятия не имею, почему эта функция называется append, поскольку, несмотря на комментарий, она не ' кажется, намеревался сделать что-нибудь подобное ...

0 голосов
/ 27 апреля 2020

Поставьте флажок перед выполнением любой операции с x, чтобы увидеть, что x не None или любой другой тип, кроме list. Примерно так:

def convertlist(x):
    q = " "
    a = 0
    if isinstance(x, list):
        while (a < len(x)):
            q+=x[a]
            a+=1
    return (q)
...