2014-02-17 33 views
0

我想玩弄Python中的素數,因此用一個函數來創建一個Sieve of EratosthenesPython函數返回發生器的,而不是名單

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) 

在我看來這功能一定要返回一個列表,但是當我做print(primes(1000))我只得到<generator object primes at 0x0000000002C5C558>作爲輸出。當使用print(list(primes(1000)))時,一切都按預期工作(打印質數列表)。

我錯過了什麼?

爲什麼函數返回一個生成器而不是一個列表?

+0

我建議你離開充當發電機和使用'名單()'它只有在你真正需要_do_名單。 –

+0

你正在創造一個新的(並且有用的)3.3特性。早期版本不允許這樣做。請參閱[這裏](http://stackoverflow.com/q/16780002/989121)。 – georg

+0

我在本地修改我的代碼以返回生成器。這真的很方便。 – snrlx

回答

6

因爲在函數中使用了yield expression

在篩中,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 
+0

我是盲人...... :(不僅盲目而且還沒有經驗 – snrlx

+0

霍利克...你在同一個問題中打敗了我兩次:D –

1

的Martijn打我給它。您在return語句之前觸及yield表達式。

1

爲了返回列表中,您可以:

def primes(limit): 
    result = []   # Store primes here. 
    a = [True] * limit 
    a[0] = a[1] = False 

    for (i, isprime) in enumerate(a): 
     if isprime: 
      result.appen(i) 
      for n in range(i*i, limit, i): 
       a[n] = False 
    return result  # return primes 
相關問題