2016-07-27 38 views
4

(Python的3.5.1)的Python:設置(sympy.primerange(A,B))

我一直在嘗試使用Sympy一些項目歐拉的問題,但我已經遇到一些奇怪如何set(sympy.primerange(a, b))和類似的建築工作。

>>> import sympy 
>>> PR = sympy.primerange(1, 20) 
>>> set(PR) 
{2, 3, 5, 7, 11, 13, 17, 19} 

到目前爲止,這麼好。但是:

>>> import sympy 
>>> PR = sympy.primerange(1, 20) 
>>> set(PR) 
{2, 3, 5, 7, 11, 13, 17, 19} 
>>> set(PR) 
set() 

調用只需PR給我打電話<generator object primerange at 0x039C1720>一次list(PR)兩次後。 for p in PR: print(p)list(PR)也會發生同樣的情況。

爲什麼這個不行:

>>> import sympy, itertools 
>>> sympy.sieve.extend(100) 
>>> set(itertools.takewhile(lambda p: p<20, sympy.sieve)) 
set() 
>>> sympy.sieve 
<Sieve with 25 primes sieved: 2, 3, 5, ... 89, 97> 

我們爲什麼不拿到一套{2, 3, 5, 7, 11, 13, 17, 19}

回答

3

第一個現象是與發電機有關。 sympy.primerange返回一個生成器,而不是一個列表。生成器讓你迭代它們的元素一次,按需生成它們。對set()的調用遍歷生成器PR中的每個元素,並將其消耗。

itertools.takewhile需要一個可迭代的第二個參數。 sympy.sieve是不是一個迭代。它允許您通過索引請求任意素數,並保持動態內部篩。由於sympy.sieve不是可迭代的,因此無法從中提取任何元素。這就是爲什麼你沒有得到預期的結果。

對你做項目歐拉的榮譽。

+0

謝謝。這就說得通了。在[Sympy API](http://docs.sympy.org/dev/modules/ntheory.html)中挖掘,我發現這會起作用:>>> sympy.sieve.extend(20)>> > set(sympy.sieve._list)'給出'{2,3,5,7,11,13}'並且可以被多次調用。 –

相關問題