使用lambda调用函数n次(python)
如果可能的话,有人能告诉我如何使用Python中的lambda函数多次调用函数吗 就像我有一个功能一样使用lambda调用函数n次(python),python,Python,如果可能的话,有人能告诉我如何使用Python中的lambda函数多次调用函数吗 就像我有一个功能一样 def repeat_lam(a, n): lambda x: f(x) 我想在x上运行a,n次。我不知道如何编辑我的当前代码,使它做到这一点 所以如果我有一个被定义为乘以2的函数叫做mul_2 repeat_lam(mul_2,3)(10) 80 您可以定义lambda函数,如下所示: ntimes = lambda f, args, n: (f(*args), ntimes(f
def repeat_lam(a, n):
lambda x: f(x)
我想在x
上运行a
,n
次。我不知道如何编辑我的当前代码,使它做到这一点
所以如果我有一个被定义为乘以2的函数叫做mul_2
repeat_lam(mul_2,3)(10)
80
您可以定义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)
ntimes2 = lambda f, arg, n: ntimes2(f, f(arg), n-1) if n>1 else f(arg)
在这种情况下,返回值将是单个调用的返回值的元组
如果希望将第一个调用的返回值输入到第二个调用中,依此类推,则应使用如下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)
ntimes2 = lambda f, arg, n: ntimes2(f, f(arg), n-1) if n>1 else f(arg)
但是,n次应用函数的最简单方法是使用for循环,而不是使用lambda函数。简单、直接的方法:
def exec_num_times(f,times,*args,**kwargs):
for _ in range(times):
f(*args,**kwargs)
还有其他方法。例如,如果您有一个函数,然后是一个参数列表:
results=[f(x)表示参数列表中的x]
但是,这不是必需的,因为您可以直接将参数的列表传递到
f()
;作为Python方法,您通常不应该依赖于传递特定类型变量的方法。它应该足够灵活,可以处理任何类型的问题。根据问题的性质,您可能正在尝试采用函数编程中使用的一种技术,以避免所有“循环”,并用函数调用替换这些循环
因此,不要像我们在经验语言中那样依赖一个简单的语言结构来反复重复一个语句,这将是:
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)
在早期学习编程时,有些人喜欢这种方法,但它显然更复杂。如果你要研究的任何材料都是这样的建议,那么找到另一个来源进行研究是很重要的。因此我们的规范是:
>>> repeat_lam(mul_2,3)(10)
80
此设置要求mul_2
是一个函数,如果需要,我们可以使用lambda
定义该函数。我会证明这一点,但这并不是真的需要。repeat_lam
的实现与lambdas无关。然而,它需要是一个函数。。。它返回一个函数(这样我们就可以用(10)
调用结果)
我们定义了一个嵌套在repeat_lam
中的函数——在Python中,函数是对象,因此可以像对待任何其他对象一样对待它们。这意味着,除其他外,我们可以返回它:)所以这里发生的是wrapper
引用传递到repeat\u lam
的func
和times
值。为了支持这一点,每次调用repeat_lam
时,Python都会返回一个单独的对象——每个对象都是一个函数,每个对象都将被“命名”wrapper
,但它们通过一些内部Python魔法(从技术上讲,Python创建了一个闭包)得到单独的func
和times
值绑定到它们.
因此,当您调用返回的函数时,它将自动使用调用repeat_lam
时传入的func
和times
值,以及为调用传入的arg
。该代码的其余部分很简单:我们反复将func
应用于arg
,将其赋值回arg
,以建立结果,然后返回结果
现在我们可以测试它(并了解lambda是如何使用的):
lambda的效果与以下相同:
>>> def mul_2(x):
... return x * 2
但是lambdas只能计算单个表达式,因此它们的范围比成熟的函数更有限。它们的主要用途是当任务非常简单,您甚至不想费心命名它时:
>>> repeat_lam(lambda x: x * 2, 3)(10)
80
欢迎来到堆栈溢出!我们鼓励你这样做。如果您有,请将其添加到问题中-如果没有,请先研究并尝试您的问题,然后再回来。对不起,我已经尝试了,但没有效果。将立即更新OP。若要执行多次操作,需要使用for循环或递归。这与兰博达斯无关。所以现在还不清楚你到底想做什么。很抱歉,我是个傻瓜,但我刚刚开始编程。但是,有没有一种不涉及递归的方法可以让OP中的repeat_lam函数做n次的事情呢。你能扩展forloop吗?如果你刚刚开始编程,并且使用Python,那么至少在一两个月内远离lambda。它们是一个100%的可选功能,对于任何你想实现的东西来说,没有它的代码都是很容易理解的。有没有一种不用递归的方法呢?你可以简单地使用循环,但不能在lambda函数中使用。那不是递归lambda。递归lambda是用Y-combinator构造的。基于OP中的示例,我认为他特别希望支持1个参数中的函数,并将该参数视为累加器。