杂学第六篇:调用函数,获取的返回值,有时正确,有时为(None或者null或者undefined)

作为一个小白,写代码不够严谨,仍需多加写。

今天用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) 即可。

最后贴一下,正确的返回值:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值