7

在为 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

4 回答 4

15

在 wheresCheck == True为假的情况下,你什么都不做return。而在 Python 中,一个没有显式return返回任何内容的函数会返回None.

如果你试图递归调用自己并返回结果,你想要这个:

return falseChecker(binList, r, c, size)
于 2013-10-23T00:12:40.307 回答
5

递归行:

falseChecker(binList, r, c, size)

需要是

return falseChecker(binList, r, c, size)

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

于 2013-10-23T00:12:48.823 回答
2

你需要 areturn在末尾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

于 2013-10-23T00:13:17.170 回答
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' object is not callable”,在这种情况下打印对象(函数)isprime()的类型,它说它实际上是一个 <class 'NoneType'> ,但是当我删除 @listPrime 装饰器时,此状态更改为 <class 'function'>。这是为什么?

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

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)

但是我尝试修改它是为了学习如何使用装饰器。

于 2020-12-09T22:42:03.303 回答