如何在python中将lambda附加到列表中?

2024-05-16 21:50:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图制作一个程序,创建一个lambda函数列表,格式为y=mx+b,其中'm'和'b'是预先确定的值

我的总体目标是实现一个功能

  • 拍照
  • 找到上面的线条
  • 以纯色将它们延伸到整个画面

基本上,像霍夫变换之类的东西,如果你知道那是什么的话。在

一旦我有了一个特定图像的线,我就可以创建一个lambda函数来表示直线的斜率和它的起点。我遇到了一个问题,无法将lambda函数附加到列表中。在

我试过了:

^{1}$

以下是我得到的错误:

^{pr2}$

Tags: lambda函数图像程序功能列表格式直线
3条回答

这会给你一个线索:

>>> i=1
>>> a=lambda x:x+i
>>> a(5)
6
>>> i=2
>>> a(5)
7

lambda在外部作用域中使用i。在OP的情况下,所有函数都是相同的。在最后一个循环中使用i使i成为函数,而不是整数。将其更改为其他值,您将发现函数都是相同的,使用最后一个值i

^{pr2}$
10
10
10
10
10
10
10
10
10
10

解决方法是,将i作为函数的参数,将值捕获为局部变量:

nums = []
for i in range(10):
    j = lambda x,i=i: x + i
    nums.append(j)
for f in nums:
    print(f(1))
1
2
3
4
5
6
7
8
9
10

问题是您创建的lambda引用的是活动堆栈框架中的当前值i。当您稍后在第二个for循环中重用i时,它将绑定到列表中的lambda。当作为i(1)调用时,lambda正试图计算1 + i,其中{}是lambda,因此您当然会得到一个错误。在

可能您想要的是在lambda创建点冻结i的值。您可以通过替换:

j = lambda x: x + i

有:

^{pr2}$

这通过将i绑定到lambda变量,然后立即应用该lambda,在该lambda之后绑定保持不变,从而有效地捕获当前值。在

你的价值观已经改变了,这不是你想的那样。在

首先创建lambda:

j = lambda x: x + i

希望我将保持为当前值(所以0、1、2等等)。在

然后执行它:

^{pr2}$

你看到了吗,你如何命名第二个迭代器变量i?将其更改为j,您的示例将起作用。为什么?因为python在lambda中解析i的值,而不是在定义它时。所以当你执行你的lambda(i(1)),它会进入你的lambda身体并尝试x+i。然后它将查找i,它现在包含lambda(不是整数!)。所以你的问题。在

你需要做双重功能才能使它正常工作。试试这个:

if __name__ == "__main__":
  nums = []
  for i in range(10):
    def generate_lambda(i):
      return lambda x: x + i
    j = generate_lambda(i)
    nums.append(j)
  for i in nums:
    print(i(1))

为什么这个有用?当您调用generate\u lambda时,将有一个带有整数值的i变量。它将隐藏变量i,稍后用于迭代lambdas。而且,由于您从未修改generate-lambda函数中的i变量,它将永远保持不变。在

相关问题 更多 >