我想知道是否有人有一個很好的乾淨的Pythonic和有效的技術來實現在結果中涉及同樣表達式的解析。 需要明確的是,考慮下面簡單的例子:具有相同功能的Python列表理解和警告
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 ]
所以,任何人都可以拿出更好的東西?
我認爲你的最後兩個代碼塊是一樣好。 – Amadan
opt1。雙重理解(如嵌套); OPT2。理解+過濾器; OPT3。 memoize'f()' –
我認爲中間生成器的方法是python可以提供的最好的東西。在理解中有一個'let'會很棒,但這不是haskell。 – bgusach