使用lambda多次调用函数(python)

时间:2012-09-03 08:36:50

标签: python

如果可能的话,有人可以指导我如何使用Python中的lambda函数多次调用函数吗?

就像我有一个功能

def repeat_lam(a, n):
    lambda x: f(x)

我想在a上运行nx次。我不知道如何编辑我当前的代码来实现它。

所以,如果我有一个被定义为乘以2的函数mul_2

repeat_lam(mul_2,3)(10)
80

4 个答案:

答案 0 :(得分:4)

所以我们的规范是:

>>> repeat_lam(mul_2,3)(10)
80

此设置要求mul_2是一个函数,如果需要,我们可以使用lambda定义。我会证明这一点,但并不是真的需要。 repeat_lam的实现与lambdas无关。但是,它需要是一个函数...返回一个函数(这样我们就可以用(10)调用结果。

def repeat_lam(func, times):
    def wrapper(arg):
        for i in range(times):
            arg = func(arg)
        return arg
    return wrapper

我们定义一个嵌套在repeat_lam内的函数 - 在Python中,函数是对象,因此它们可以像任何其他对象一样对待。这意味着,除其他外,我们可以返回它:)所以这里发生的是wrapper引用传递给func的{​​{1}}和times值。为了支持这一点,Python每次调用repeat_lam时都会返回一个单独的对象 - 每个对象都是一个函数,每个对象将被“命名为”repeat_lam,但它们会分开wrapperfunc绑定到它们的值,通过一些内部Python魔术(在技术术语中,Python创建一个闭包)。

因此,当您调用返回的函数时,它会自动使用调用times时传入的functimes值,以及传递的repeat_lam在通话中。其余代码很简单:我们将arg重复应用于func,分配回arg以构建结果,然后我们将其返回。

现在我们可以测试它(看看如何使用lambda):

arg

lambda的效果与:

相同
>>> mul_2 = lambda x: x * 2
>>> repeat_lam(mul_2,3)(10)
80

但lambdas只能评估单个表达式,因此它们的范围比成熟函数更有限。它们的主要目的是当任务如此简单以至于你甚至不想打扰命名它时:

>>> def mul_2(x):
...     return x * 2

答案 1 :(得分:3)

简单明了的方法:

def exec_num_times(f,times,*args,**kwargs):
  for _ in range(times):
      f(*args,**kwargs)

还有其他方法。例如,如果您有一个函数,然后是一个参数列表:

results = [f(x) for x in list_of_args]

但是,这不是必需的,因为您可以直接将list_of_args传递给f();作为Python方法take variable list of arguments,您通常不应该依赖于传递特定类型变量的方法。它应该足够灵活,适用于任何类型。

答案 2 :(得分:0)

你可以定义一个lambda函数,如下所示:

ntimes = lambda f, args, n: (f(*args), ntimes(f, args, n-1)) if n>1 else (f(*args),)

def foo(bar):
    print "foo", bar
ntimes(foo, ["bar"], 10)

在这种情况下,返回值将是各个调用的返回值的元组。

如果你想将第一个调用的返回值输入到第二个调用中,依此类推,你可以使用这样的lambda函数:

ntimes2 = lambda f, arg, n: ntimes2(f, f(arg), n-1) if n>1 else f(arg)

然而,应用函数n次的最简单方法是使用for循环,而不是使用lambda函数。

答案 3 :(得分:0)

对于你的问题的性质,你可能正在尝试调整功能编程中使用的技术,它完全避免“循环”,用函数调用替换它们。

所以,不要像我们在经验语言中那样依赖简单的语言构造来重复一遍又一遍的语句:

repeats = 10
result = 0
for i in range(repeats):
    result = function(result)

除此之外,您可以创建一个接收两个参数的函数,第二个是 一个计数器,第一个是中间结果 - 如果计数器值为0,它只返回中间结果。否则,它使用中间结果调用原始函数,并再次调用本身,但计数器减1:

def repeat_func(function, result, repeat):
    if repeat == 0:
        return result
    return repeat_func(function, function(result), repeat - 1)

在学习编程的早期阶段,有些人更喜欢这种方法 - 但显然更复杂。如果您需要学习的任何材料都是这样的,那么找到另一个研究来源非常重要。