对于上下文,此代码写在谈论乘法持久性的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”的意思吗?
答案 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