Python函数中的return语句失效了是什么原因及如何解决?

# coding:utf-8
import numpy as np

def drop_water(y, x, array, path): s1 = array[y + 1, x - 1] * 5 # 左下 s2 = array[y + 1, x] * 4 # 下 s3 = array[y + 1, x + 1] * 3 # 右下 s4 = array[y, x + 1] * 2 # 右 s5 = array[y, x - 1] * 1 # 左 l = [s1, s2, s3, s4, s5] w = 4 if sum(l) in [0, 15] else max(l) if w == 1: next_s = [y, x - 1] elif w == 2: next_s = [y, x + 1] elif w == 3: next_s = [y + 1, x + 1] elif w == 4: next_s = [y + 1, x] elif w == 5: next_s = [y + 1, x - 1] path.append(next_s) if next_s[0] == array.shape[0] - 1: print(path) return path else: print(‘a’) drop_water(next_s[0], next_s[1], array, path) print(‘w’)

array = np.array([[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]])

s = drop_water(0, 30, array, []) print(s)

输出如下:

a
a
[[1, 30], [2, 30], [3, 29]]
w
w
None

Python函数中的return语句失效了是什么原因及如何解决?

22 回复

你没有 return 呀


return语句“失效”通常是因为函数执行流程没按你预想的走。最常见的原因是return语句在条件分支里,但条件没满足,函数就执行到末尾隐式返回None了。

比如这个典型例子:

def find_even(numbers):
    for num in numbers:
        if num % 2 == 0:
            return num  # 只有遇到偶数才执行
    # 循环结束没return,函数返回None

result = find_even([1, 3, 5])
print(result)  # 输出None,看起来像return“失效”了

另一个常见坑是try-except块:

def risky_divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        print("除零错误")
    # 异常处理完没return,函数返回None

print(risky_divide(1, 0))  # 打印了错误信息,但返回None

检查代码时,重点看:1)所有分支路径是否都有return;2)循环中的return是否可能被跳过;3)try-except-finally中return的位置是否正确。

总结:仔细检查函数的所有执行路径。

在 if 里

只要进入了 else 就 return 不了了 只剩副作用了

问题是执行 if 语句后 return 会退出函数,不会执行后续的 else 了呀

第一次 call 如果进入了 else 就只剩副作用了

path 都没打印出来…说明没有走到 if 里面…
判断逻辑先看看吧…

[[1, 30], [2, 30], [3, 29]]这显然就是 path…

这个问题,王垠都说过了,if else 要成对出现,保证你的逻辑完整,要不然你都发现不了你的 bug 在哪里

那是副作用里面的 if

副作用是啥?

用调试走一遍都清楚了

我的 if else 成对出现了呀,能否详细解释一下?

走了好几遍仍然懵逼才来问的

简单说 就是你的 else 里面 没有 return

递归不是你这么玩的

建议百度“递归”先

从输出能明显看出代码执行到了 else 里面,而你 else 里面没有 return。

第 1 次调用 drop_water,进入 else 打印 a
再次调用 drop_water (第 2 次),进入 else 打印再次 a
再次调用 drop_water (第 3 次),进入 if 打印 path
打印第 2 次调用的 w
打印第 1 次调用的 w
然后没有 return 所以最后输出 none

好了想通了,进了逻辑死胡同了

递归最后一次走到 else 里面…

else:
print(‘a’)
p = drop_water(next_s[0], next_s[1], array, path)
print(‘w’)
return p

增加一个返回应该就可以了~

回到顶部