【问题标题】:Function is returning type None when I expect an array当我期望一个数组时,函数返回类型 None
【发布时间】:2020-06-26 04:38:20
【问题描述】:

我正在尝试返回一个已通过递归函数传递的数组。但我只返回 None,而不是我预期的 bo Numpy 数组。

import numpy as np

board = [0, 0, 4, 5, 1, 9, 0, 0, 0, 6, 1, 0, 0, 7, 0, 0, 5, 9, 0, 0, 0, 6, 3, 0, 0, 0, 0, 5,
         4, 0, 3, 0, 0, 0, 0, 2, 3, 0, 6, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 6, 7, 0, 0, 2, 0,
         0, 0, 4, 0, 5, 8, 0, 0, 0, 4, 0, 0, 2, 0, 4, 0, 0, 1, 0, 0, 7, 0, 6]

grid = np.asarray(board).reshape(9, 9)


def possible(bo, y, x, n):
    for i in range(0, 9):
        if bo[y][i] == n:
            return False
    for i in range(0, 9):
        if bo[i][x] == n:
            return False
    x0 = (x // 3) * 3
    y0 = (y // 3) * 3
    for i in range(0, 3):
        for j in range(0, 3):
            if bo[y0 + i][x0 + j] == n:
                return False
    return True


def solve(bo):
    for y in range(9):  # row
        for x in range(9):  # column
            if bo[y][x] == 0:
                for n in range(1, 10):
                    if possible(bo, y, x, n):
                        bo[y][x] = n
                        solve(bo)
                        bo[y][x] = 0
                return
    return bo

solved = solve(grid)
print(solved)

这是为什么?

我可以将它打印到控制台。但返回值为None

请注意,第一个return 语句退出递归函数。允许移动到数组中的后续项目。

(上一个问题被标记为重复 - 但链接的问题没有回答我的查询)

编辑:明确我想要做什么。我正在尝试返回修改后的 bo 数组。第一个return 语句退出递归for n in range 语句。然后在范围内用另一个 # 运行。

【问题讨论】:

  • 函数return 的第一个语句solve() 应该返回一些明确的内容。看看控制流选项here
  • solve 是否按预期修改了grid
  • 是的。代码功能但不会返回。我可以通过键入print(bo) 代替函数solve 末尾的return 来打印它。但是当我尝试返回 bo 对象时,它会显示为 None
  • 我建议您在两个返回值上方放置一个 print(),以便您自己查看哪个返回值是最后一个。
  • 最后返回的是solve中的最后一个。它打印出预期的结果。但是当我尝试返回时返回None

标签: python numpy


【解决方案1】:

如果我将裸露的return 行更改为:

 return 'foobar' 

结果是:

In [5]: grid = np.asarray(board).reshape(9, 9)                                                                       
In [6]: solve(grid) 
Out[6]: 'foobar'

一个裸露的returnreturn None 相同(从函数的末尾脱落)。

即使函数是递归的,并且修改了bo(并且grid 在运行后具有正确的值),函数也会在该条件下返回,而不是最后的return bo 行。

所以

return bo

在两个地方都返回修改后的grid

def solve(bo):  
    for y in range(9):  # row  
        for x in range(9):  # column  
            if bo[y][x] == 0:  
                for n in range(1, 10):  
                    if possible(bo, y, x, n):  
                        bo[y][x] = n  
                        solve(bo)           # doesn't use the return value  
                        bo[y][x] = 0  
                return bo       # final return 
    return # bo optional

在递归中,您指望bo 被修改,并且永远不要使用返回的值。这就是为什么 solve(grid)grid 被更改的原因。如果你想让solve 返回修改后的grid,你必须明确地返回它。

在这样的代码中,您需要密切关注所有return 语句,并注意哪些在何时返回。

【讨论】:

    【解决方案2】:

    我相信您的问题出在 solve(bo) 函数中的 return 语句中。

    for n in range(1, 10):
        if possible(bo, y, x, n):
            bo[y][x] = n
            solve(bo)
            bo[y][x] = 0
    return
    

    每当你的函数完成这个循环时,它总是会返回None,因为它有一个返回值,但没有返回任何东西。

    【讨论】:

    • return 语句退出递归循环。如果没有该返回,它就无法按预期运行。
    • 您可以将return 替换为break 语句,因为它将退出循环而不返回值。
    • 我试过了。但它不会返回完全修改的数组。
    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多