Python函数结尾处的“返回“完成””是什么意思?

时间:2019-05-29 00:13:09

标签: python python-2.7 loops

对于上下文,此代码写在谈论乘法持久性的video within the channel Numberphile by Matt Parker上。该代码是用Python 2编写的,我的问题是关于return "DONE"行。

显然,这可以防止生成无限循环,因为很明显,运行示例(如下)(带有和不带有该行):

def per(n, steps = 0):
    if len(str(n)) == 1:
        print "TOTAL STEPS " + str(steps)
        return "DONE"

    steps += 1
    digits = [int(i) for i in str(n)]

    result = 1
    for j in digits:
        result *= j
    print result
    per (result, steps)    

per(27)

# 14
# 4
# TOTAL STEPS 2

现在,没有行return "DONE"的相同代码不会结束循环,并产生:

14
4
TOTAL STEPS 2
4
TOTAL STEPS 3
4
TOTAL STEPS 4
4
TOTAL STEPS 5
4
TOTAL STEPS 6
4
TOTAL STEPS 7
4
TOTAL STEPS 8
4
TOTAL STEPS 9
4
TOTAL STEPS 10
4
TOTAL STEPS 11
4
TOTAL STEPS 12
4
TOTAL STEPS 13
4
TOTAL STEPS 14
4
...

我的问题是关于“返回“ HOME””的含义。它只是意味着停止。那里有“ HOME”的意思吗?

2 个答案:

答案 0 :(得分:2)

如果要在变量分配中运行该函数,则字面上将得到“ DONE”。我假设您的意思是“ DONE”而不是“ HOME”,因为您的示例中没有return "HOME"

例如:

x = per(7)
print(x)

将打印常规输出,并在调用DONE时也打印print(x)。因为7是个位数,所以第一次运行时就满足条件if len(str(n)) == 1

TOTAL STEPS 0
DONE

尽管该函数自称,但由于这是很不寻常的,因此使您很难了解这些东西。如果我们使用大于一位数的数字运行脚本,则会得到None。.因为它从不运行return语句,所以它的返回值是python的默认值,即NoneType :

x = per(27)
print(x)

结果:

14
4
TOTAL STEPS 2
None

因为27不满足具有一位数字的条件。.脚本调用自身并打印出结果。.直到脚本最终使用满足条件的4 ..并打印出TOTAL STEPS行。 / p>

要查看此值,我们必须修改函数:

def per(n, steps = 0):
    if len(str(n)) == 1:
        print("TOTAL STEPS " + str(steps))
        return "DONE"

    steps += 1
    digits = [int(i) for i in str(n)]

    result = 1
    for j in digits:
        result *= j
    print(result)
    x = per(result, steps)
    print("Inner return", x)


x = per(27)
print("Outer return", x)

结果:

14
4
TOTAL STEPS 2
Inner return DONE
Inner return None
Outer return None

非常感谢您不必为返回值担心。.因为您没有在示例中捕获变量中的返回值..仅使用return会产生相同的结果。这样一来,就可以停止运行该函数,并在per(27)之后移至该行(如果有)。这可能是查看此函数正在发生什么的有用方法。

使用=进行变量赋值不是使用返回值的唯一方法。这只是演示正在发生的事情的最简单方法。 例如仅运行print(per(27))就会得到与我的示例相同的结果。

答案 1 :(得分:0)

if语句中的return只是递归函数的终止-您是否注意到自己在内部调用per(x)

如果我们取出return,该函数将不会终止,Python将产生一个max recursive exception

现在您的函数将执行以下操作:如果n的长度为1,则终止;否则,终止。否则,请调用另一个per函数,直到满足终止条件的地方。

但是per时,您的len(str(n)) != 1实际上没有返回任何内容。默认情况下,函数隐式返回None。因此,即使per(1)返回“ Done”,返回的值也不会传播到调用它的函数中。

为了更清楚一点,您可能需要的是(保证返回值与不同的输入一致):

def per(n, steps=0):
    if len(str(n)) == 1:
        return "Done"
    # some other code
    return per(result, steps)

另一个定义也是一致的:

def per(n, steps=0):
    if len(str(n)) == 1:
        return # None
    # some other code
    per(result, steps)
    # implicitly return None