take
こういう機能はイディオムでおいておくのではなく、ちゃんと部品化して可読性を高める、とう癖が大事なのではないかと思う。
def take(n, iterable): i = 0 for item in iterable: if i >= n: break i += 1 yield item
for element in take(10, infinite_iterator): if not good_condition(element): break else: print "good"
ちなみに、先頭10個に対してだけ判定したい、というのなら、all を使えばよかったり(Python 2.5 以降)。
if all(good_condition(element) for element in take(10, infinite_iterator)): print "good"
で、まぁ、なんかこう先頭の n 個の要素を返すイテレータをいろいろな方法で。
最後のやつがちゃんと動く理由を理解するには for の内部動作を知っている必要があるかもしれない。
def take(n, iterable): for i, item in enumerate(iterable): if i >= n: break yield i
from itertools import takewhile def take(n, iterable): pred = lambda t: t[0] < n return (items[1] for item in takewhile(pred, enumerate(iterable)))
from itertools import izip def take(n, iterable): return (item for i, item in izip(xrange(n), iterable))
def take(n, iterable): it = iter(iterable) for i in xrange(n): yield it.next()