Python函数返回生成器而不是列表

snr*_*rlx 0 python list generator python-3.x

我想在Python中使用素数,因此使用函数来创建Sieve of Eratosthenes:

def primes(limit):
    a = [True] * limit
    a[0] = a[1] = False

    for (i, isprime) in enumerate(a):
        if isprime:
            yield i
            for n in range(i*i, limit, i):
                a[n] = False
    return list(a)
Run Code Online (Sandbox Code Playgroud)

在我看来,这个函数肯定应该返回一个列表但是当我这样做时print(primes(1000))我只得到<generator object primes at 0x0000000002C5C558>输出.当使用print(list(primes(1000)))一切按预期工作时(打印质数列表).

我错过了什么?

为什么函数返回生成器而不是列表?

Mar*_*ers 6

因为您在函数中使用了yield表达式.

在筛子中,a是一个面具,而不是最终产生的素数列表.你真的不想要返回那个列表.

如果您希望函数返回列表而不是充当生成器,请在函数中收集素数:

def primes(limit):
    a = [True] * limit
    a[0] = a[1] = False
    primes = []

    for (i, isprime) in enumerate(a):
        if isprime:
            primes.append(i)
            for n in range(i*i, limit, i):
                a[n] = False

    return primes
Run Code Online (Sandbox Code Playgroud)