generatorで素数

プログラミングHaskell

take 100 primes

みたいな書き方にいたく感動したので。
とりあえずitertoolの中にtakewhileというのを見つけたのでそれに合う書き方をしてみた。

takewhile(lambda x: x < 100, sieve())

このように書いて100以下の素数リストを手に入れたい。

from itertools import takewhile,ifilter

def sieve():
    x = [2]
    i=2
    while True:
        i += 1
        if len(list(ifilter(lambda k: i%k==0, x))) == 0:
            x.append(i)
            yield i

l = takewhile(lambda x: x < 100, sieve())
print list(l)

所与のtake 100 primesを書こうと5分ぐらい考えたのだけど頭がこんがらがってきたのでここまで。generatorもあんまり理解しないで使ってるだけだしちょっとよくない。
あと検索してみたらgeneratorで素数な人はすでにたくさんいた。
ifilterに加えてcountも使ったほうがよさそう。