首页 > 解决方案 > Python 函数在第三次使用 None 后返回 none

问题描述

所以我试图解决一些问题并使用给定的逻辑。但即使在每次我尝试返回该值时使用 print 获得正确的值后,输出也是无。

def rt(c):
    print "yep",c
    cc(c)
def asa():
        return 3
def klds(s):
    return s+4
def cc(k):
    if k!=7:
        print k
        print 3434   
        return k
    print 2
    rt(k+2)
print cc(klds(asa()))

预期输出:倒数第二个值 3434 只是检查函数是否在打印之后执行,倒数第三个值是要返回的值

2
yep 9
9
3434
9

获取输出:

2
yep 9
9
3434
None

标签: pythonpython-2.7

解决方案


这是正在发生的事情:

print cc(klds(asa()))

从最内层的嵌套函数开始计算:

  1. asa() 返回 3,将其发送到 klds()。
  2. klds() 返回 s + 4,因为 asa 返回 3,s = 3,所以 s + 4 == 7
  3. 我们现在在 cc() 里面。'if' 块内的所有内容都被跳过,因为 k == 7
  4. 打印 2,然后调用 rt(),给定 k+2。k 仍然 == 7。
  5. 在 rt(), 'yep', 9 被打印出来。
  6. cc() 在 rt() 中使用参数 c (c == 9) 调用。
  7. 现在再次在 cc() 中。由于 k == 9, k != 7,所以执行 'if' 块。
  8. 如您所料,将打印 k(等于 9)和 3434。
  9. 返回值 k。
  10. 现在已经返回了一个值,步骤 5 中对 rt() 的调用已经完成。我们现在可以继续向下 cc()。但是,那是 cc() 的最后一行,没有返回任何内容,所以默认返回 None
  11. 您的最后一条打印语句打印默认的无。

本质上,当您在 if 语句中返回值时,return 会将值发送回第一次调用它的执行列表的顶部。当您调用 rt() 时,您首先调用此执行路径,因此返回的值将在此处返回。如果你想返回那个值,你应该把 rt() 返回的东西赋给一个变量,然后返回那个变量


推荐阅读