为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()
答案 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
首次运行时,如果sCheck
为False
,则会执行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(),它表示它实际上是
我知道还有另一种形式可以运行代码:
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)
但是我试图修改它,以学习如何使用装饰器。