美文网首页程序员
Python 递归返回 None,为嘛呢?

Python 递归返回 None,为嘛呢?

作者: alabiubiubiu | 来源:发表于2016-07-13 11:41 被阅读3251次

今天在 codewar 做题目玩,做到一题时,想试试用递归写,却发现在函数体内一切正常,可是打印返回值时,打印出来的结果却是 None 。不明白是在哪里除了问题了,于是在网上翻了一圈,自己又仔细思考了下整个逻辑。似乎弄清楚了。这里我来解释下我的理解。

首先,我来写一个简化的递归函数,来做用于解释的案例。

def ex(x):
    if x > 1:
        x -= 1
        ex(x)
    else:
        return x

t = ex(5)
print(t)

上面的程序逻辑超简单:判断输入的书是否大于 1 ,如果大于 1 则把它减 1 ,然后再判断。如此不断递归下去。当 x 不大于 1 的时候,返回 x 的大小。

很容易认为返回的 x 打印出来的结果是 1 是不?但是不是的。你可以把上面的代码运行下,打印出来的结果是:

None

为什么是这样的呢?我的理解是:

当我们在 t = ex(5) 的时候,调用了一次函数。如果函数直接返回 t = 1,那是木有问题的。问题是,程序在这里返回数据。反而又去调用了一次函数本身。这次调用的的是 ex(4) 然后一直调用的 ex(1) 这时候程序终于运行到了 return 这里。那这次 return 给了谁呢?答案是谁都没有给。因为我们没有设置 t = ex(1), 所以函数的 return 回的数据就这么丢失了。

而我们调用的 t = ex(5) 呢,因为它的 if > 1 是成立的,所以直接跳过了了 else: return x ,等于这一次调用,是没有用到 return 的。而在 Python 中规定,如果一个函数体没有 return 的时候,那它的 return 就是 None 。这也就是为什么,我们运行上面的程序的时候,得到的结果是 None 。

为了证明这点,我们可以去写一个程序,去尝试获得迭代到 ex(1) 这次调用时 ex(1) 所返回的值。程序如下:

t = {}

def ex(x):
    global t
    if x > 1:
        x -= 1
        t[x] = ex(x)
    else:
        return x

ex(10)
print(t)

在程序中,我们用字典,把 ex(x) 每次调用所返回的数据记录了下来。结果如下:

{1: 1, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}

可见:

  1. 在迭代中,后调用的函数先返回。
  2. 除了最后一次调用的函数有了正确的返回外,之前的函数都没有 return ,所以返回的都是 None。

那如何正确地返回迭代出来的数据呢?答案是:一层一层第把最后一次调用返回出来。代码如下:

def ex(x):
    if x > 1:
        x -= 1
        return ex(x)
    else:
        return x

t = ex(5)
print(t)

结果为:

1

为什么这次能正确呢?因为第一次调用 ex(x) 的时候,它返回的是ex(x-1),下一次调用返回了 ex(x-2) 一路携手交传,最终把 ex(1) return 给了 t ,这个时候就等于 t = ex(1) 了,自然就得到了正确的结果了。

嗯,本文就到这里要结束了。最后说一下, Python 的确不喜欢迭代。所以它严格限制了迭代的次数。我电脑上,只要迭代的次数超过 999 ,就会报错,如下:

t = ex(998)

1

t = ex(999)

Traceback (most recent call last):
File "E:\Work\Coder\Test\test4.py", line 14, in <module>
t = ex(999)
RecursionError: maximum recursion depth exceeded in comparison

相关文章

  • Python 递归返回 None,为嘛呢?

    今天在 codewar 做题目玩,做到一题时,想试试用递归写,却发现在函数体内一切正常,可是打印返回值时,打印出来...

  • 递归函数遇到的一些坑

    递归遇到的一些坑。 为什么递归函数会返回None 上面的例子:在调用递归处不加return 就会返回None.因为...

  • Python 递归函数返回值为 None 的解决办法

    在使用 Python 开发的过程中,避免不了会用到递归函数。但递归函数的返回值有时会出现意想不到的情况。 下面来举...

  • 数据分析(三)-处理丢失数据

    处理丢失数据 None与np.nan的区别 None None是Python自带的,类型为Python objec...

  • Python 入门之 递归

    Python 入门之 递归 1、递归: 递:一直传参 归:返回 (1)不断调用自己本身(无效递归 -- 死递归) ...

  • python 递归,return结果None

    return的作用是将函数结果返回,即退出def函数模块。大量的教材和网上教程都有说明函数执行遇到return就会...

  • Effective Python 学习笔记 4

    Effective Python 学习笔记 4 尽量使用异常来表示特殊情况,而不要返回None 要点 用None这...

  • 【Note】PyTorch 文档学习历程

    1. torchtorch.eye(n, m=None, out=None)返回 2 维张量,对角线为 1,其他为...

  • shell与python对比

    1,返回值不同,函数返回值如果为假,默认为None。False为假,并且它的值为0,但是假跟值没关系,None的值...

  • return;debug。

    python def函数 没有return/return后没有参数,则返回None值 return跳出函数窗口,执...

网友评论

    本文标题:Python 递归返回 None,为嘛呢?

    本文链接:https://www.haomeiwen.com/subject/dcbsjttx.html