【发布时间】:2013-11-01 01:41:41
【问题描述】:
在为 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()
【问题讨论】:
-
@Everybody:对于常见的“我写了一个递归函数,但没有从其中一个递归调用返回值”问题,是否存在规范重复?
-
附带说明,
if sCheck:在几乎所有情况下都比if sCheck == True:好(包括这种情况)。 -
@abarnert“几乎”?是否有任何情况首选
== True? -
@lvc:曾几何时,我使用了一个设计糟糕的包,该包包含一个 C 库,其中包含返回
True表示成功但返回负整数错误代码表示失败的函数。我编写了一个模块来包装所有调用并检查== True否则引发了一个异常,以从我的代码的其余部分隐藏可怕的 API,并在注释中解释它在做什么,并提交了一个针对包裹。 (如果你很好奇,上游修复是返回一个 True 或 False 和 0 或负错误代码的元组,这稍微不那么可怕......)