第3次使用None后,Python函数不返回任何值

时间:2018-09-27 17:30:36

标签: python python-2.7

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

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

2 个答案:

答案 0 :(得分:0)

cc在这里被两次呼叫。

print cc(klds(asa())),等同于print cc(7),是它第一次被调用。通过以下方式进行跟踪:

if k != 7:  # Nope, keep going...
print 2
rt(k+2)

我们已经结束了该功能。没有return语句,因此它返回None,这是您最后看到的内容。

要解决此问题,请确保返回值。 (即return rt(k+2)。)

在代码的其他地方也有类似的问题,您还必须先解决它,然后才能按预期运行。

答案 1 :(得分:0)

这是正在发生的事情

print cc(klds(asa()))

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

  1. asa()返回3,并将其发送到klds()。
  2. klds()返回s + 4,因为asa返回3,s = 3,所以s + 4 == 7
  3. 我们现在位于cc()中。因为k == 7
  4. ,所以跳过了“ if”块中的所有内容。 给定k + 2,打印
  5. 2,然后调用rt()。 k仍== 7。
  6. 在rt()内部,“是”,已打印9。
  7. 在rt()内部使用参数c(c == 9)调用
  8. cc()。
  9. 再次进入cc()。由于k == 9,k!= 7,因此将执行'if'块。
  10. 如您所料,将打印k(等于9)和3434。
  11. 返回值k。
  12. 既然已经返回一个值,则在步骤5中对rt()的调用已完成。现在,我们可以继续cc()。但是,那是cc()的最后一行,什么也不返回,因此默认情况下不返回None
  13. 您的最后一个打印语句将打印默认的None。

从本质上讲,当您在if语句中返回值时,返回值会将值返回到首次调用它的执行列表的顶部。您在调用rt()时首先调用此执行路径,因此返回的值在那里返回。如果要返回该值,则应将rt()返回的值分配给一个变量,然后返回该变量