【问题标题】:Python list return 'None'Python 列表返回“无”
【发布时间】:2016-09-08 20:41:14
【问题描述】:

代码:

puzzle1= [
          [7,0,0,0,0,0,2,1,8],
          [0,4,8,6,2,9,0,0,0],
          [0,0,3,0,0,1,0,0,0],
          [0,0,7,0,0,8,0,3,2],
          [0,0,9,7,0,6,5,0,0],
          [6,8,0,1,0,0,7,0,0],
          [0,0,0,2,0,0,4,0,0],
          [0,0,0,4,1,5,8,7,0],
          [3,5,4,0,0,0,0,0,6]
          ]  
def eliminate_values(puzzle):
    redo = False
    for i in range(9):
        for j in range(9):
            if puzzle[i][j]==0 or isinstance(puzzle[i][j], list):
                puzzle[i][j] = []
                for num in range(1,10):
                   num_check = True;
                   for x in range(9):
                       if puzzle[i][x]==num:
                           num_check = False
                       if puzzle[x][j]==num:
                           num_check = False
                       if i<3:
                           aa=0
                       elif i<6 and i>2:
                           aa=3
                       else:
                           aa=6
                       if j<3:
                           bb=0
                       elif j<6 and j>2:
                           bb=3
                       else:
                           bb=6
                       for a in range(3):
                           for b in range(3):
                               if puzzle[a+aa][b+bb]==num:
                                   num_check = False
                   if num_check:
                       puzzle[i][j].append(num)
                if len(puzzle[i][j]) == 1:
                    puzzle[i][j] = puzzle[i][j][0]
                    redo = True;
    if redo:
        eliminate_values(puzzle)
    else:
        print(puzzle)
        return puzzle

puzzle=eliminate_values(puzzle1)
print(puzzle)

控制台:

[[7, 9, 6, 3, 5, 4, 2, 1, 8], [1, 4, 8, 6, 2, 9, 3, 5, 7], [5, 2, 3, 8, 7, 1, 9, 6, 4], [4, 1, 7, 5, 9, 8, 6, 3, 2], [2, 3, 9, 7, 4, 6, 5, 8, 1], [6, 8, 5, 1, 3, 2, 7, 4, 9], [8, 7, 1, 2, 6, 3, 4, 9, 5], [9, 6, 2, 4, 1, 5, 8, 7, 3], [3, 5, 4, 9, 8, 7, 1, 2, 6]]
None

评论:

我是 python 新手,但我不明白为什么 print 在函数内工作,而不是在它返回到主程序后工作。 (期望它打印两次但只打印一次然后'无')

【问题讨论】:

  • 您可能应该在if redo 中执行return eliminate_values(puzzle)
  • `如果重做:返回消除值(拼图)`

标签: python list return


【解决方案1】:

@tobias_k 是对的。

在每个递归函数中,您都有一个基本案例和一个递归案例。基本情况是当您到达递归结束并从递归函数返回最终值时。递归情况是函数再次调用自身。

不过,在这两种情况下,您都需要返回。

如果您不这样做,那么即使您最终达到了基本情况,基本情况的返回值也不会向上传递到堆栈。

即:

def recursiveDecrement(x):
    if x > 0:
        print("Recursive case. x = %s" %x)
        recursiveDecrement(x - 1)
        print("I should have returned...x = %s" %x)
    else:
        print("Base case. x = %s" %x)
        return x

如果我调用recursiveDecrement(5),我的输出将是:

Recursive case. x = 5
Recursive case. x = 4
Recursive case. x = 3
Recursive case. x = 2
Recursive case. x = 1
Base case. x = 0
I should have returned...x = 1
I should have returned...x = 2
I should have returned...x = 3
I should have returned...x = 4
I should have returned...x = 5

但是,一旦达到基本情况,该方法就会继续执行,最后什么都不返回,x 仍然等于 5。

更改您的 if 语句以在两种情况下都返回,一切都应该正常工作。

if redo:
    return eliminate_values(puzzle)
else:
    return puzzle

【讨论】:

    【解决方案2】:

    如果redoTrue,您正在递归调用您的函数,并且在堆栈的某个位置,一旦redoFalse,您打印并返回结果。但是,此结果不会向上传播到调用堆栈,因此最外层的函数调用将不返回任何内容,即None,然后将其打印出来。为此,您还必须return 递归调用的结果:

        if redo:
            return eliminate_values(puzzle)  # try again and return result
        else:
            return puzzle  # result found in this try, return it
    

    或者,您可以将函数体包装在 while 循环中,而不是使用递归。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      相关资源
      最近更新 更多