0

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

就像我有一个功能

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

我要跑步an时间继续x。我不确定如何编辑我当前的代码来做到这一点。

因此,如果我有一个定义为乘以 2 的函数,则称为mul_2.

repeat_lam(mul_2,3)(10)
80
4

4 回答 4

4

所以我们的规范是:

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

此设置需要 thatmul_2是一个函数,我们可以根据lambda需要使用 a 来定义它。我会证明这一点,但这并不是真正需要的。的实现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指的是传递给的functimesrepeat_lam。为了支持这一点,Python 每次被调用时都会返回一个单独的对象——repeat_lam每个对象都是一个函数,每个对象都将被“命名” wrapper,但是它们通过一些内部 Python 魔法(在技术术语中, Python 创建一个闭包)。functimes

因此,当您调用返回的函数时,它将自动使用调用时传入的functimesrepeat_lam,以及调用时传入arg的值。该代码的其余部分很简单:我们func重复应用到arg,分配回以arg建立结果,然后我们返回它。

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

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

lambda的效果与以下相同:

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

但是 lambda 只能评估单个表达式,因此它们的范围比成熟的函数更受限制。它们的主要目的是当任务非常简单以至于您甚至不想为它命名时:

>>> repeat_lam(lambda x: x * 2, 3)(10)
80
于 2012-09-03T11:35:47.310 回答
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_argsf(); 因为 Python 方法采用参数的变量列表,您通常不应该依赖传递特定类型变量的方法。它应该足够灵活,可以处理任何类型。

于 2012-09-03T09:04:40.813 回答
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 函数。

于 2012-09-03T08:47:22.353 回答
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)

在早期学习编程时,有些人更喜欢这种方法 - 但它显然更复杂。如果你必须研究的任何材料都暗示了这样的事情,那么找到另一个研究来源很重要。

于 2012-09-03T11:11:56.673 回答