pythonで素数表を出力(あと内包表記についてちょっと)

エラトステネスの篩

import math
def prime(n):
    l = range(n)
    l[1] = 0
    for i in l:
        if not i: #0だったら次の数字へ
            continue
        elif i > math.sqrt(n): #nの平方根より小さかったら終了
            return [p for p in l if p] #0以外のものを返す
        else:
            for m in  range(i*2, n, i):
                l[m]=0

引数までの素数リストを返す。
returnのところの[]を()に変えるとなぜかジェネレーターが生成される。

>>> (i for i in range(10))
<generator object <genexpr> at 0x10bc68280>
>>> {i for i in range(10)}
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

どうもタプル内包表記(?)みたいな書き方をするとジェネレーターになるっぽい
どうやらジェネレーター式というらしい