2013-10-23 6 views
5

CS1用のPythonプロジェクトで作業しています。私は、私と私の部屋のどちらも分からないという奇妙な問題が出てきました。コードの一般的な範囲は、スペースを埋めるために数字を使用して特定のサイズのシェイプで0のグリッドを塗りつぶすことです。シェイプが存在する場所にシェイプを配置していないことを確認する必要があります。私はここで2つの関数を持っていますが、どちらも事実上同じですが、falsecheckerがリストを返す何らかの理由で、NoneTypeとして返します。なぜこうなった? sCheck == Trueがfalseの場合は機能Pythonで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() 
+3

@Everybody:一般的な "私は再帰関数を書きましたが、再帰呼び出しの1つから値を返さなかった"正規の複製はありますか? – DSM

+2

ほとんどの状況(これを含む)では 'if sCheck:'は 'if sCheck == True:'よりも優れています。 – abarnert

+0

@abarnert "almost"? '== True'が優先される*状況がありますか? – lvc

答えて

11

、あなたはないreturn何でもします。 Pythonでは、明示的にreturn以外の関数はNoneを返します。

あなたは再帰的に自分自身を呼び出して結果を返すようにしようとしていた場合、あなたはこの欲しかっ:

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

を再帰的なライン:

falseChecker(binList, r, c, size) 

return falseChecker(binList, r, c, size) 

たりする必要があります再帰関数は終了し、外部関数 siそれはまだ戻っていません。その後、返さずに終了するので、Noneを返します。あなたがfalseCheckerの終わりにreturnが必要

2

:彼らは戻ることなく自分自身の最後に来た場合、Pythonで

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) 
     ################################# 

、機能はデフォルトでNoneを返します。さらにfalseCheckerが初めて実行された場合、sCheckFalseの場合、elseブロックが実行されます。このコードブロックにはreturnが含まれていません。このため、最終的な戻り値falseCheckerNoneになります。

関連する問題