作为一个小白,写代码不够严谨,仍需多加写。
今天用python 调用函数时出现标题的情况。很疑惑为什么写了return,还能取到None
后来搞明白了。
我使用了递归
递归调用本身,
我是这么写的
def A(a):
if a>3:
b = a *a
return b
else:
a = a +1
A(a)
a = 0
b = A(a)
print(b)
这么写的想法很简单,简单的以为只要运行到return b那里,函数就会直接返回b。
运行之后的结果是:
你看,结果就成了None。
首先要理解清楚递归中返回值的返回顺序
递归会在递归结束的那次中执行return语句,但是程序并不是在这里直接就返回return的值,而是跳回到上次调用递归的地方,继续执行后面的语句,而后年的语句又没有return语句,所以最后一次的返回值就没被返回,从而返回值为None。其实很好理解,你 平时调用一个函数,不也是获取到返回值之后就会回到调用的地方吗?递归也是这样的,只不过是自己调用自己而已,所以,按道理,调用完自己,也要回到调用的地方。如果还不理解,看下面的示例:
def A(a):
if a>3:
b = a *a
print("返回了b的值:%d"%(b))
return b
else:
a = a +1
A(a)
print("第%d次数调用"%(a))
a = 0
b = A(a)
print(b)
上面的运行结果是:
从运行结果上看,最先运行的print函数就是return上面那句,所以就知道,在递归调用A(a)时,是不会进行下一步的print函数。直到递归完成,然后就开始一步一步的回到当初调用的地方,所以就会依次从后面往前面print调用次数。最后面第一次调用A(a)后的print语句之后并没有return。,所以函数并没有get到返回值,因此,返回为None。
所以正确的写法,就是在递归调用的后面的语句中添加return语句,用于返回最后一次递归调用的返回值。如下所示:
def A(a):
if a > 3:
b = a * a
print("返回了b的值:%d" % (b))
return b
else:
a = a + 1
b = A(a)
print("第%d次数调用" % (a))
return b
a = 0
b = A(a)
print(b)
先用b变量存下返回值,最后再返回b值即可,这种情况适用在递归获取返回值后还有操作的情况,比如我这里有输出print,如果不需要后面的操作,可直接 return A(a) 即可。
最后贴一下,正确的返回值: