警告這是一個有點令人費解,但做這項工作。我將用一個例子來解釋它。
讓說expensive_function = math.sin
infinite generator = collections.count(0.1,0.1)
然後
[z for z in (y if y < 5 else next(iter([]))
for y in (math.sin(x) for x in itertools.count(0.1,0.1)))]
是
[0.09983341664682815,
0.19866933079506122,
0.2955202066613396,
0.3894183423086505,
0.479425538604203]
所以你的問題歸結爲
[z for z in (y if y < 0.5 else next(iter([])) \
for y in (expensive_function(x) for x in generator))]
訣竅是迫使來自發電機的並沒有什麼飄逸StopIteration
比next(iter([]))
這裏expensive_function
只調用每次迭代一次。
使用有限生成器和停止條件擴展無限生成器。 由於發電機不允許raise StopIteration
,我們選擇一種複雜的方式,即next(iter([]))
現在你有一個有限生成器,它可以在列表解析
可以作爲OP與上述方法的應用在這裏非monotonic功能而言是一個虛構的非單調函數
昂貴的非單調函數f(x) = random.randint(1,100)*x
停止條件= < 7
[z for z in (y if y < 7 else next(iter([])) for y in
(random.randint(1,10)*x for x in itertools.count(0.1,0.1)))]
[0.9,
0.6000000000000001,
1.8000000000000003,
4.0,
0.5,
6.0,
4.8999999999999995,
3.1999999999999997,
3.5999999999999996,
5.999999999999999]
BTW:真正意義上的在整個範圍內是非單調的(0,2pi)
任何答案值得接受嗎?如果不是,你還在尋找什麼信息? – 2012-03-09 23:23:36
很抱歉標記是這個人。謝謝您的回答! – Joe 2012-03-11 02:28:32
沒問題。希望你只需要提醒一下。 :) – 2012-03-11 05:02:32