我想知道是否有人有一个很好的干净的蟒蛇和有效的技术来实现理解,涉及到同样的表达在警卫和结果。
为了清楚起见,请考虑以下简单示例:

def f(a):
    print "Calling", a
    return a + 1

print [ f(v) for v in xrange(3) if f(v) > 1 ]

这将打印
Calling 0
Calling 1
Calling 1
Calling 2
Calling 2
[2, 3]

证明对于大多数元素f被调用两次。这很好,如果f有副作用,我们需要什么,但是如果f是一些没有副作用的昂贵操作,重复调用是不可取的。但对于我来说,每个元素只调用一次f的解决方案似乎很笨拙/冗长:
intermediate = ( f(v) for v in xrange(3) )
print [ r for r in intermediate if r > 1 ]

即使是一条线
print [ r for r in ( f(v) for v in xrange(3) ) if r > 1 ]

那么,有人能想出更好的办法吗?

最佳答案

您可以使用filter()函数:

filter(lambda x: x > 1, [ f(v) for v in xrange(3)])

但这和你上次建议的解决方案一样冗长。

08-07 16:40