繁体   English   中英

关于在python中使用返回值的问题

[英]Question about using return value in python

def multiples(n, i=1):
    if i != 11:
        multiples(n,i+1)
    return n*i

print(multiples(2))

output:
2

这是一个简单的例子,

我想要打印所有倍数(2 到 22),这样我就可以在另一个 function 中使用它。

有人可以向我解释为什么它只打印 2 吗?

我不确定它将如何通过递归实现,或者为什么在您的代码中需要递归,但如果您只想获得倍数,那么这将起作用:

def multiples(n, i=1):
        while i != 12:
            print(n*i)
            i += 1

multiples(2)

我建议你学习递归的基础知识,function 调用等。

我们先来看看你的function从1到11做了什么。

对于multiples(2) ,function的参数是n=2,i=1,发现i不等于11,满足条件,所以function调用multiples(2, 2)

接下来是multiples(2, 2) ,值 i=2 仍然不等于 11,所以 function 调用multiples(2, 3) ,依此类推,直到 i = 11。

当调用multiples(2, 11)时。 条件不满足。 所以 function 立即返回 2 * 11 = 22,并且 go 返回multiples(2, 10)

但是在multiples(2, 11)之后,返回值被丢弃并且 function multiples(2, 10)返回 20

所以经过所有的递归,function multiples(2)只会返回2,不会得到multiples(2, 2)的返回值

如果要打印递归的所有值。 我建议你可以使用下面的方法:

def multiples(n, i=1):
    if i >= 11:   # it is suggested to use greater then to prevent decimal numbers error
        return [n*i]+ multiples(n,i+1)   # add current value and next recursive value
    else:
        return [n*i]   # if i is greater then 11, return value and stop recursive  
        
print(multiples(2))

output:

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]

您的代码没有使用递归调用的返回值,因此它仅返回第一级return n*i返回的值。

由于您希望生成一个数字序列,因此最好让您的 function 成为生成器,而不是通过产生n和当前i的乘积,然后从递归调用中产生序列,直到i达到所需的最大值m

def multiples(n, i=1, m=11):
    yield n * i
    if i < m:
        yield from multiples(n, i + 1, m)

for i in multiples(2):
    print(i)

这输出:

2
4
6
8
10
12
14
16
18
20
22

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM