繁体   English   中英

如何使用递归编写一个在Python中重复调用另一个函数的函数?

[英]How do I use recursion to write a function that calls another function repeatedly in Python?

我正在尝试编写一个反复调用另一个函数的函数。 这是我到目前为止的内容:

def function1(n, function_object):
    if n > 0:
        function_object
        function1(n-1, function_object)

def function2(x, word):
    for i in range(x):
        print word

y = 'pluto'

function1(3, function2(3, y))

这是我尝试运行它时得到的:

>>> 
pluto
pluto
pluto
>>> 

我以为它会打印“ pluto”九次,但似乎function2只执行一次。 如何在function1中重复执行它?

  • 在function_object之后错过了()
  • 调用function1传递的是function2的返回值,您应该传递函数对象。 我在以下代码中将其替换为lambda。 (使调用一个匿名函数function2 ,而不是调用function2之前调用function1

def function1(n, function_object):
    if n > 0:
        function_object() # <---- Added ()
        function1(n-1, function_object)

def function2(x, word):
    for i in range(x):
        print word

y = 'pluto'

function1(3, lambda: function2(3, y)) # <---

在您的代码中,function1调用了自己以及另一个函数。 不必那么复杂。

另外,在最后一行中,您将function2(3, y)作为参数传递-因为那里有parens () ,因此调用 function2并获取结果,然后将结果传递给function1。 我不认为那是你的本意。

所以我修改了它。 根据您的要求,这里有一个函数(function1)调用N次(任意)函数N次,并将N的当前值与任意参数一起传递。

def function1(n, function_object, *args):
    while n > 0:
        function_object(n, *args)
        n -= 1

def function2(n, x, word):
    for i in range(x):
        print "%s, %d, %d" % (word, n, i)

y = 'pluto'

function1(3, function2, 3, y)

输出:

pluto, 3, 0
pluto, 3, 1
pluto, 3, 2
pluto, 2, 0
pluto, 2, 1
pluto, 2, 2
pluto, 1, 0
pluto, 1, 1
pluto, 1, 2

执行此操作时:

function2(3, y)

该函数立即运行,其返回值(在这种情况下为None )作为function_object参数传递到function1中。 function1 ,您尝试这样调用它:

function_object

但是实际上并没有这样称呼。 因此,在调用function1 之前 ,function2最终将被总共调用一次。

如果将它替换为function_object() ,它调用它-但是会出现错误,因为function_objectNone ,这是不可调用的。 要传入function2而不是None ,只是不要在外面调用它-而是需要这样做:

function1(3,function2)

这将使您出错,说function2需要接受两个参数,但是您没有给它任何参数 因此,下一步就是弄清楚如何将这些参数传递给它-这需要在调用它时发生。 但是function1预计不带参数的函数..你可以通过编写另一个函数,它没有参数,并要求解决这个问题function2你想要的两个参数,并将传递到功能1。 所以看起来像这样:

def function1(n, function_object):
    if n > 0:
        function_object()
        function1(n-1, function_object)

def function2(x, word):
    for i in range(x):
        print word

y = 'pluto'

def function3():
    function2(3, y)

function1(3, function3)

如果只使用一次此功能3,并且没有一个合理的名称,则可以使用lambda创建一个执行相同功能的匿名函数:

def function1(n, function_object):
    if n > 0:
        function_object()
        function1(n-1, function_object)

def function2(x, word):
    for i in range(x):
        print word

y = 'pluto'
function1(3, lambda: function2(3, y))

在这种情况下,Lambda是一个不错的选择,否则,您可以看看这篇文章,他们解释另外两种实现方法:将带有参数的函数传递给Python中的另一个函数?

暂无
暂无

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

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