2013-04-17 3 views
0

У меня есть метод следующий вызов: методПочему мой метод возвращает None?

NCOLS = 3   
NPEGS = 4 

first_guess = [] 

print("calling first guess method") 
first_guess = firstGuess(NCOLS, NPEGS, first_guess) 
print("after method call: " + str(first_guess)) 

firstGuess:

def firstGuess(NCOLS, NPEGS, first_guess): 
"""Used for setting up the first guess of the game""" 
    print("in firstGuess method") 
    for c in range(1, NCOLS + 1): 
    if len(first_guess) == NPEGS: 
     print("about to return first guess: " + str(first_guess)) 
     return first_guess 
    else: 
     first_guess.append(c) 

    print("out of for loop, first_guess len is " + str(len(first_guess)) + ", " + str(first_guess)) 
    if len(first_guess) <= NPEGS: #there were less color options than pegs 
    firstGuess(NCOLS, NPEGS, first_guess) 

Это, кажется, возвращается None по причине я не могу понять.

Вот мой результат:

calling first guess method 
in firstGuess method 
out of for loop, first_guess len is 3, [1, 2, 3] 
in firstGuess method 
about to return first guess: [1, 2, 3, 1] 
after method call: None 
Traceback (most recent call last): 
File "mastermind.py", line 323, in <module> 
sys.exit(main()) 
File "mastermind.py", line 318, in main 
playOnce() 
File "mastermind.py", line 160, in playOnce 
first_guess = first_guess + str(g[0][i]) 
TypeError: 'NoneType' object is not subscriptable 

Почему это возвращение None вместо [1, 2, 3, 1]?

ответ

3

Проблема, которую вы поражающих, что ваш рекурсивный вызов не возвращает результат.

Итак, он печатает «из цикла петли ...», затем он выполняет рекурсивный вызов. Этот рекурсивный вызов затем успешно возвращает что-то ... но внешний вызов игнорирует это и падает с конца, что означает, что вы получаете None.

Просто добавьте return перед вызовом firstGuess:

print("out of for loop, first_guess len is " + str(len(first_guess)) + ", " + str(first_guess)) 
if len(first_guess) <= NPEGS: #there were less color options than pegs 
    return firstGuess(NCOLS, NPEGS, first_guess) 

Это по-прежнему оставляет путь, где вы ничего не вернуть (если вы получите «из цикла для», а затем len(first_guess) > NPEGS) ... но у вас нет никакой логики, чтобы делать что-нибудь полезное там. Возможно, вы захотите добавить своего рода assert или raise, если вы считаете, что этого никогда не произойдет.

+0

А я вижу спасибо! Глупая ошибка. – Deekor

0

Это потому, что в вашем коде есть пути, которые не заканчиваются тем, что вы явно возвращаете что-либо.

Если вы звоните firstGuess рекурсивно, вы должны делать return firstGuess(...)? Хотя, все равно будет случай, когда вы проваливаетесь и ничего не возвращаете. Вы должны добавить окончательный оператор return first_guess после окончательного заявления if.

Попробуйте это:

def firstGuess(NCOLS, NPEGS, first_guess): 
    """Used for setting up the first guess of the game""" 
    print("in firstGuess method") 
    for c in range(1, NCOLS + 1): 
    if len(first_guess) == NPEGS: 
     print("about to return first guess: " + str(first_guess)) 
     return first_guess 
    else: 
     first_guess.append(c) 

    print("out of for loop, first_guess len is " + str(len(first_guess)) + ", " + str(first_guess)) 
    if len(first_guess) <= NPEGS: #there were less color options than pegs 
    return firstGuess(NCOLS, NPEGS, first_guess) 
    return first_guess 
0

Измените последние две строки в

if len(first_guess) <= NPEGS: #there were less color options than pegs 
    return firstGuess(NCOLS, NPEGS, first_guess) 
else: 
    # what do you do here? return something 
    return first_guess 

Вы не возвращаются во всех отраслях

Смежные вопросы