如果考虑资源消耗,这两个功能是否相同?
它们在功能上不一样。您似乎已经在问题中理解了这一点,所以我不太确定您在怀疑什么,但是在考虑资源消耗时这一点尤其重要:
def isIt(arg):
lightweightResult = lightweightFunction(arg)
expensiveResult = superExpensiveFunction(arg)
// obviously you can use both results here, so both have been computed.
// return the values directly, no further computation done here:
return (lightweightResult and expensiveResult)
您可能会这样做的一个原因是如果您需要expensiveResult
其他东西,或者superExpensiveFunction
总是需要调用 if,例如某些资源的初始化程序。
正如您所描述的,在第二种情况下,funcB(arg)
仅在funcA(arg)
评估为 true 时才评估(返回真实值)。这称为短路:
def isIt(arg):
return (lightweightFunction(arg) and superExpensiveFunction(arg))
众所周知,短路是防止不必要执行的好方法。
如果 funcB() 是生成器上的 any() 怎么办?
除非调用任何生成器,否则它永远不会运行生成器。生成器已经是防止不必要执行的好方法,因为它们是惰性求值的。我认为在这种情况下,短路和发电机是一个很好的组合。
正如Blkknght的评论中所指出的,值得注意的是,any()
并且all()
也有短路,因此在生成器中,生成器只会被评估到确认结果的元素(全部为假或任何为真)。您可以在python.org...#all上查看代码。