在 Python 中使函数变得惰性
making function lazy in Python
我想为 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())
要使 eternity
都起作用,只需删除 ()
。您想要 return 一个函数,而不是函数的求值(无限循环)。
lazyeternity
和 eternity
之间的区别 return 由 packageN
编辑的是 lazyeternity
return 调用 lambda,而 eternity
是一个lambda,当被调用时,它会永远运行。
要使 packageN
return 的行为类似于 lazyeternity
,请使其成为
def packageN(f):
return lambda: lambda *x: f(*x)
我想为 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())
要使 eternity
都起作用,只需删除 ()
。您想要 return 一个函数,而不是函数的求值(无限循环)。
lazyeternity
和 eternity
之间的区别 return 由 packageN
编辑的是 lazyeternity
return 调用 lambda,而 eternity
是一个lambda,当被调用时,它会永远运行。
要使 packageN
return 的行为类似于 lazyeternity
,请使其成为
def packageN(f):
return lambda: lambda *x: f(*x)