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语句失效了是什么原因及如何解决?
你没有 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 不了了 只剩副作用了
第一次 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
增加一个返回应该就可以了~


