在Python中的λ递延评价(Deferred evaluation with lambda in

2019-06-25 13:47发布

在一个循环,我想两个节点s到推迟比较的两个值()到以后的时间。

class Node():
    def __init__(self, v):
        self.v = v
    def value(self):
        return self.v

nodes = [Node(0), Node(1), Node(2), Node(3), Node(4), Node(2)]
results = []
for i in [0, 1, 2]:
    j = i + 3
    results.append(lambda: nodes[i].value() == nodes[j].value())

for result in results:
    print result

结果都是真(因为I,J == 2,5所有的lambda表达式)。 我怎样才能推迟拉姆达的执行,直到它实际上是所谓的,但正确的变量绑定? 而在lambda表达式不一定都是平等的......还有很多其他的更复杂的表达式。

谢谢你的帮助!

Answer 1:

为了当前值绑定ij的功能,而不必让它看起来外的范围,你可以使用一个关闭或默认参数值。 要做到这一点最简单的方法是在你的拉姆达使用默认参数值:

for i in [0, 1, 2]:
    j = i + 3
    results.append(lambda i=i, j=j: nodes[i].value() == nodes[j].value())

下面是它是如何看起来像一个封闭:

def make_comp_func(i, j):
    return lambda: nodes[i].value() == nodes[j].value()

for i in [0, 1, 2]:
    j = i + 3
    results.append(make_comp_func(i, j))


Answer 2:

敷在另一个lambda:

results.append((lambda x, y: lambda: nodes[x].value() == nodes[y].value()) (i, j))

或在一个更好的方式,用partial

from functools import partial

results.append(partial(lambda x, y: nodes[x].value() == nodes[y].value(), i, j))

默认参数诀窍是,嗯......一招,我会建议,以避免它。



Answer 3:

惯用的方法是使用默认参数:

[f() for f in [lambda: i for i in range(3)]]
[2, 2, 2]

此更改为:

[f() for f in [lambda i=i: i for i in range(3)]]
[0, 1, 2]


文章来源: Deferred evaluation with lambda in Python