在Python中返回非类型的函数?

在Python中返回非类型的函数?,python,function,nonetype,Python,Function,Nonetype,在为CS1开发Python项目时,我遇到了一个我和我的室友都无法解决的奇怪问题。代码的一般范围是使用数字填充空间,用一定大小的形状填充一个0的网格,我们必须一路检查以确保我们没有将形状放在已经有形状的地方。我这里有两个函数,它们的作用几乎是一样的,但无论出于什么原因,当falsechecker返回列表时,它都以非类型返回。为什么会这样 def falseChecker(binList, r, c, size): sCheck = isSpaceFree(binList, r, c, si

在为CS1开发Python项目时,我遇到了一个我和我的室友都无法解决的奇怪问题。代码的一般范围是使用数字填充空间,用一定大小的形状填充一个0的网格,我们必须一路检查以确保我们没有将形状放在已经有形状的地方。我这里有两个函数,它们的作用几乎是一样的,但无论出于什么原因,当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
        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()

如果
sCheck==True
为false,则不会
返回任何内容。在Python中,一个函数不显式地
返回
任何内容,而是返回

如果您试图递归地调用自己并返回结果,您希望:

return falseChecker(binList, r, c, size)
递归行:

falseChecker(binList, r, c, size)
需要

return falseChecker(binList, r, c, size)

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

您需要在
falseChecker
的末尾使用
return

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
。此外,当第一次运行
False checker
时,如果
sCheck
False
,则它将执行
else
块。此代码块不包含
返回值
。因此,
falseChecker
的最终返回值将是
None

我有相同的提示,在我的职责范围之外做了一些练习=),我修改了一些代码来学习如何使用装饰器:

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)  
def listPrime(f):#列出素数
def包装(x):
对于范围(x)内的n:
如果f(n):
打印(n,end=”“,flush=True)
打印()
@listPrime
def isprime(n=0):#计算一个数字是否为素数(true)

如果n@Everybody:常见的“我编写了一个递归函数,但没有从其中一个递归调用返回值”问题是否有一个规范副本?作为旁注,
如果sCheck:
如果sCheck==True:
在几乎所有情况下(包括这一种)都要好。@abarnert“几乎”?有什么情况下
==True
是首选的吗?@lvc:从前,我使用了一个设计糟糕的软件包,它包装了一个C库,函数返回
True
表示成功,但返回负整数错误码表示失败。我编写了一个模块,它包装了所有调用,并选中了
==True
,否则就引发了一个带有数字的异常,从而对我的其余代码隐藏了可怕的API,并在一条注释中解释了它在做什么,并针对包提交了一个bug。(如果你好奇的话,上游修复是返回一个True或False和0的元组或一个负错误代码,这稍微不那么可怕…)好的,我是通过返回listPrime函数“return wrapper”来实现的。但我仍然不明白为什么装饰师会改变iPrime的类型。
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)