在Python中使函数变得懒惰

时间:2016-06-05 21:44:40

标签: python lambda lazy-evaluation

我想为eternity编写一个包装函数,使其表现得好像被懒惰地评估一样。换句话说,它的功能应该与下面的函数lazyeternity的功能相同。我有这个函数packageN,它接受​​一个函数并将它打包成一个lambda - 或者至少我认为它。 (lambda中的lazyeternity打包在etest的调用中延迟了其评估。)如何修改packageN以便eternity = packageN(eternity)可以反映lazyeternity的行为?

    def eternity():
        return eternity()

    # How can I create a wrapper function for eternity...
    # that will make it behave identical to this function?
    def lazyeternity():
        return lambda: lazyeternity()

    def packageN(f):
        return lambda *x: f(*x)

    def etest(x, y):
        return x

    eternity = packageN(eternity)

    # I want these both to return 4.
    # Currently only the first one returns 4,...
    # because the second one evaluates the eternity()...
    # parameter forever. I want to delay the evaluation...
    # of the parameter.
    print etest(4, lazyeternity())
    print etest(4, eternity())

2 个答案:

答案 0 :(得分:2)

lazyeternity返回的eternitypackageN之间的区别在于调用lazyeternity返回lambda,而eternity 一个lambda,当被称为,永远运行。

要让packageN返回类似lazyeternity的内容,请将其设为

def packageN(f):
    return lambda: lambda *x: f(*x)

答案 1 :(得分:1)

要同时使eternity工作,只需删除()。您想要返回一个函数,而不是函数的评估(无限循环)。