函数在Python中返回NoneType?

时间:2013-10-23 00:10:15

标签: python function nonetype

为CS1开发一个Python项目,我遇到了一个奇怪的问题,我和我的室友都无法弄明白。代码的一般范围是使用数字来填充具有特定大小的形状的0的网格以填充空间,并且我们必须检查沿途以确保我们不将形状放置在已存在形状的位置。我在这里有两个函数,它们都做了几乎相同的事情,但无论出于什么原因,当falsechecker返回列表时它将它返回为NoneType。为什么会这样?

def falseChecker(binList, r, c, size):
    sCheck = isSpaceFree(binList, r, c, size)
    if sCheck == True:
        for x in range(c, c+size):
            for y in range(r, r+size):
                binList[x][y] = size
        return binList
    else:
        c += 1
        if c > len(binList):
            c = 0
            r += 1
            if r > len(binList):
                return binList
        falseChecker(binList, r, c, size)





def iChecker(binList, blockList):
    r = 0
    c = 0
    for i in blockList:
        check = isSpaceFree(binList, r, c, i)
        if check == True:
            for x in range(c, c+i):
                for y in range(r, r+i):
                    binList[x][y] = i
            c += 1
            if c > len(binList):
                c = 0
                r += 1
                if r > len(binList):
                    return binList
        else:
            binList = falseChecker(binList, r, c, i)

    return binList

main()

4 个答案:

答案 0 :(得分:13)

如果sCheck == True为false,则不return。在Python中,一个没有显式return的函数返回None

如果您试图递归调用自己并返回结果,那么您需要:

return falseChecker(binList, r, c, size)

答案 1 :(得分:3)

递归线:

falseChecker(binList, r, c, size)

需要

return falseChecker(binList, r, c, size)

或递归函数结束,外部函数继续,因为它还没有返回。然后它完成而不返回,因此返回None

答案 2 :(得分:2)

return结尾处需要falseChecker

def falseChecker(binList, r, c, size):
    sCheck = isSpaceFree(binList, r, c, size)
    if sCheck == True:
        for x in range(c, c+size):
            for y in range(r, r+size):
                binList[x][y] = size
        return binList
    else:
        c += 1
        if c > len(binList):
            c = 0
            r += 1
            if r > len(binList):
                 return binList

        #################################
        return falseChecker(binList, r, c, size)
        #################################

在Python中,函数默认返回None,如果它们到达自己的末尾而不返回。此外,当falseChecker首次运行时,如果sCheckFalse,则会执行else块。此代码块不包含return。因此,falseChecker的最终回报值为None

答案 3 :(得分:0)

我有相同的指示,除了履行职责外还需要一些练习,),我修改了一些代码以学习如何使用装饰器:

def listPrime(f):    #list the prime numbers
    def wrapper(x):
        for n in range(x):
            if f(n):
                print(n, end = " ", flush=True)
        print()

@listPrime
def isprime(n = 0): #evaluate when a number is prime (true) or isn't
    if n<=1:
        return False
    for x in range(2,n):
        if n % x == 0:
            return False
    else:
        return True

isprime(100)  

,但在这种情况下,控制台会向我抛出此错误“ TypeError:'NoneType'对象不可调用”,在这种情况下打印对象(函数)的类型为isprime(),它表示它实际上是,但是当我删除@listPrime装饰器时,此状态将更改为。为什么呢?

我知道还有另一种形式可以运行代码:

def isprime(n):
    if n<=1:
        return False
    for x in range(2,n):
        if n % x == 0:
            return False
    else:
        return True

def listPrime(x):    #lista numeros primos
    for n in range(x):
        if isprime(n):
            print(n, end = " ", flush=True)
    print()

listPrime(200)

但是我试图修改它,以学习如何使用装饰器。