我正在使用python 3并尝试在for循环中将函数相乘。我编写了一个简单的示例代码来演示我的问题。我要这段代码要做的是从函数x ^ 2开始,然后在第一个循环中将其乘以x ^ 2,得到x ^ 4。然后再将x ^ 4与x ^ 2乘以得到x ^ 6等。
fun = lambda x: x**2
function = lambda x: x**2
for i in range(2):
function = lambda x: function(x) * fun(x)
print(function(2))
但是代码出了递归错误。我不知道这如何导致递归?任何帮助都感激不尽。
答案 0 :(得分:1)
循环中的分配等同于:
def function(x):
return function(x) * fun(x)
这是没有停止条件的递归函数。由于python's binding rules,您对function
的初始定义被遮盖了:
以下构造将名称绑定:形式参数到函数, 导入语句,类和函数定义(这些绑定 定义块中的类或函数名称)
您可以使用python3 -m trace --trace script.py
进行跟踪并验证这种行为:
--- modulename: script, funcname: <lambda>
script.py(6): function = lambda x: function(x) * fun(x)
--- modulename: script, funcname: <lambda>
script.py(6): function = lambda x: function(x) * fun(x)
# Repeated until a RecursionError is thrown
您可以将函数作为lambda的参数绑定:
fun = lambda x: x**2
function = lambda x: x**2
for i in range(2):
function = lambda x, y=function: y(x) * fun(x)
print(function(2))
这将产生以下跟踪:
--- modulename: script, funcname: <module>
script.py(3): fun = lambda x: x**2
script.py(4): function = lambda x: x**2
script.py(5): for i in range(2):
script.py(6): function = lambda x, y=function: y(x) * fun(x)
script.py(5): for i in range(2):
script.py(6): function = lambda x, y=function: y(x) * fun(x)
script.py(5): for i in range(2):
script.py(8): print(function(2))
--- modulename: script, funcname: <lambda>
script.py(6): function = lambda x, y=function: y(x) * fun(x)
--- modulename: script, funcname: <lambda>
script.py(6): function = lambda x, y=function: y(x) * fun(x)
--- modulename: script, funcname: <lambda>
script.py(4): function = lambda x: x**2
--- modulename: script, funcname: <lambda>
script.py(3): fun = lambda x: x**2
--- modulename: script, funcname: <lambda>
script.py(3): fun = lambda x: x**2
64
答案 1 :(得分:0)
我从未找到解决方案,但确实找到了解决方法。我没有尝试立即对其进行乘法运算,而是编写了一个函数来进行乘法运算。这似乎可行,所以我只使用它。
def multiplyFun(fun1,fun2):
fun = lambda x: fun1(x) * fun2(x)
return fun
fun = lambda x: x**2
function = lambda x: x**2
for i in range(5):
print(i)
function = multiplyFun(function,fun)
print(function(2))
答案 2 :(得分:0)
另一种语法:您可以使用嵌套的lambda
(其中对外部变量进行评估以返回内部变量),而不是将第二个参数传递给lambda
:
squared = lambda x: x**2
function = lambda x: x**2
for i in range(2):
function = (lambda f: lambda x: f(x) * squared(x))(function)
print(function(2))
似乎比默认参数更通用(在语言上)。