TypeError: объект «NoneType» не является итерируемым

У меня есть функция "checkAllInOneDirection", которая представляет собой рекурсивный цикл. Когда я выхожу из цикла, функция возвращает 1 массив и 3 логических значения. Самое странное, что в рекурсивной функции, когда она возвращается, она показывает, что все из них имеют значения, но я все еще получаю ошибку «Нет типа»:

Вот печать:

Before return : [[0, 0]] False False False False

Но по мере того, как он возвращается и до его исключения, возвращаемые значения становятся

    After returned : [[0, 0]] True True True True

Хотя возвращаемые значения из рекурсивного изменены и неверны, какое-то значение все еще есть, но я исключение из ошибки «Нет типа»? Вот ошибка:

     File "C:\xampp\htdocs\ZoneFinding\zoneFinder2D_V2.py", line 127, in handleCheck
    finalCatch, forBoo, bakBoo, upBoo, dwnBoo = checkAllInOneDirection(finalCatch,tempCatch,recursiveCount,newCatch, columnCount, rowCount, width, height, posToCheck, forBoo, bakBoo, upBoo, dwnBoo)
TypeError: 'NoneType' object is not iterable

Вот функция, которая вызывает рекурсивную "checkAllInOneDirection".

def handleCheck(newCatch, locale, subset, width, height, rowCount, columnCount, posToCheck):
    forBoo = True; bakBoo =True; upBoo=True; dwnBoo= True; lastOneInSet =0;
    while forBoo and bakBoo and upBoo and dwnBoo :
        if locale[posToCheck[0]][posToCheck[1]] == 0:
            recursiveCount = 0; tempCatch = []; finalCatch =[]
            tempCatch.append(posToCheck)
            finalCatch, forBoo, bakBoo, upBoo, dwnBoo = checkAllInOneDirection(finalCatch,tempCatch,recursiveCount,newCatch, columnCount, rowCount, width, height, posToCheck, forBoo, bakBoo, upBoo, dwnBoo)
            replaceVal(locale, finalCatch)

    return False, finalCatch

Вот код рекурсивной функции checkAllInOneDirection.

def checkAllInOneDirection(finalCatch,tempCatch,recursiveCount,newCatch, width, height, forBoo, bakBoo, upBoo, dwnBoo):

    isItLast = checkLast(forBoo, bakBoo, upBoo, dwnBoo)
    if isItLast:
        for each in tempCatch:
            if not each in finalCatch:
                finalCatch.append(each)
        tempCatch=[]
        for each in newCatch:
            if not each in finalCatch:
                finalCatch.append(each)
        newCatch=[]
        print "Before return :", finalCatch, forBoo, bakBoo, upBoo, dwnBoo
        return finalCatch, forBoo, bakBoo, upBoo, dwnBoo

    for each in range (0, len(tempCatch)):
        posToCheck = posToCheckBak = posToCheckUp = posToCheckDwn = [tempCatch[each][0], tempCatch[each][1]]
        ### Some code to check position forward
        newPosForward = checkForward(posToCheck, width)
        if newPosForward != False:
            tempLocale = locale[newPosForward[0]][newPosForward[1]]
        elif newPosForward == False:
            tempLocale = 1
        if newPosForward != False and tempLocale ==0 and not newPosForward in finalCatch and not newPosForward in newCatch:
            forVal = locale[newPosForward[0]][newPosForward[1]]
            newCatch.append(newPosForward)
            posToCheck = newPosForward
            forBoo = True
        elif newPosForward == False and tempLocale == 1 and not newPosForward in newCatch:
            forBoo = False

        ### Some code to check position backward
        newPosBackward = checkBackward(posToCheckBak)
        if newPosBackward != False:
            tempLocale = locale[newPosBackward[0]][newPosBackward[1]]
        elif newPosBackward == False:
            tempLocale = 1    
        if newPosBackward != False and tempLocale ==0 and not newPosBackward in finalCatch and not newPosBackward in newCatch:
            forVal = locale[newPosBackward[0]][newPosBackward[1]]
            newCatch.append(newPosBackward)
            posToCheckBak = newPosBackward
            bakBoo = True
        elif newPosBackward == False and tempLocale == 1 and not newPosBackward in newCatch:
            bakBoo = False

        ### Some code to check position upward
        newPosUp = checkUpRow(posToCheckUp)
        if newPosUp != False:
            tempLocale = locale[newPosUp[0]][newPosUp[1]]
        elif newPosUp == False:
            tempLocale = 1
        if newPosUp != False and tempLocale ==0 and not newPosUp in finalCatch and not newPosUp in newCatch:
            forVal = locale[newPosUp[0]][newPosUp[1]]
            newCatch.append(newPosUp)
            posToCheckUp = newPosUp
            upBoo = True
        elif newPosUp == False and tempLocale == 1 and not newPosUp in newCatch:
            upBoo = False

        ### Some code to check position downward
        newPosDwn = checkDwnRow(posToCheckDwn, height)
        if newPosDwn != False:
            tempLocale = locale[newPosDwn[0]][newPosDwn[1]]
        elif newPosDwn == False:
            tempLocale = 1
        if newPosDwn != False and tempLocale ==0 and not newPosDwn in finalCatch and not newPosDwn in newCatch:
            forVal = locale[newPosDwn[0]][newPosDwn[1]]
            newCatch.append(newPosDwn)
            posToCheckDwn = newPosDwn
            dwnBoo = True
        elif newPosDwn == False and tempLocale == 1 and not newPosDwn in newCatch:
            dwnBoo = False

    for each in tempCatch:
        if not each in finalCatch:
            finalCatch.append(each)
    tempCatch =[]
    for each in newCatch:    
        if not each in finalCatch:
            finalCatch.append(each)
            tempCatch.append(each)
    newCatch = []

    checkAllInOneDirection(finalCatch,tempCatch,recursiveCount,newCatch, width, height, forBoo, bakBoo, upBoo, dwnBoo)

person FongYu    schedule 30.08.2012    source источник
comment
почему бы не просто while forBoo and bakBoo and upBoo and dwnBoo:?   -  person mgilson    schedule 30.08.2012
comment
Похоже, checkAllInOneDirection возвращает None. Не могли бы вы отредактировать вопрос, чтобы включить его источник?   -  person DSM    schedule 30.08.2012
comment
@mgilson, изменено, но это не устраняет ошибку   -  person FongYu    schedule 30.08.2012
comment
Мгилсон был просто стилистическим предложением. Предложение DSM добавить код для checkAllInOneDirection было гораздо важнее (без него ничего не сделать)   -  person David Robinson    schedule 30.08.2012
comment
@user1518600 user1518600 - я знаю, что это не по теме вашего вопроса (отсюда и комментарий, а не ответ). Хотя мне нравится указывать на эти вещи. Иногда вы можете узнать намного больше, чем вы ищете, когда задаете вопрос :)   -  person mgilson    schedule 30.08.2012
comment
Спасибо всем за то, что указали области для улучшения, замечательные люди, спасибо   -  person FongYu    schedule 30.08.2012


Ответы (2)


Я думаю, вы хотите, чтобы последняя строка была:

return checkAllInOneDirection(...)

вместо просто:

checkAllInOneDirection(...)

После того, как вы упадете с конца этого оператора, функция вернется. Поскольку у него нет явного оператора возврата, он возвращает None.

person mgilson    schedule 30.08.2012
comment
замечательно~ теперь я думаю, что это завершает мою первую рекрутивную функцию в Python. Спасибо - person FongYu; 30.08.2012

finalCatch, forBoo, bakBoo, upBoo, dwnBoo = checkAllInOneDirection(...)

ожидает что-то в форме a,b,c,d,e справа от равенства. Это синтаксическое сокращение для list, tuple или range. Если функция не возвращает значение или возвращает что-то, что не может быть повторено, это тип ошибки, которую вы ожидаете.

Итерация означает следующее: предположим, у вас есть класс, который действует как контейнер для значений. Итерация по классу или по значениям заключается в проверке каждого значения по одному. Если вы исследуете класс, который не поддерживает такое поведение (например, целые числа), он выдаст ошибку, потому что нет способа обработать запрос.

person rsegal    schedule 30.08.2012