2014-01-16 168 views
1

我需要一個包含range(3,666,2)和2(對於Eratosthenes的篩子,順便說一句)的循環。這不起作用(「AttributeError的:‘範圍’對象有沒有屬性‘擴展’」 ......或「追加」):Python中的擴展範圍

primes = range(3,limit,2) 
primes.extend(2) 

我怎麼能做到這一點的簡單直觀的方式pythonesque?

+0

請打印出您的預計Ø/p。 –

+0

@ python-coder:Python 3:'AttributeError:'range'object has no attribute'extend''。 –

回答

6

range()在Python 3中返回專用的不可變的序列對象。你必須把它變成一個列表來擴展它:

primes = list(range(3, limit, 2)) 
primes.append(2) 

請注意,我用list.append(),不list.extend()(其中預計值的序列,而不是一個整數)。

但是,您可能想要開始您的循環與2,而不是結束它。而且,將整個範圍實現爲一個列表需要一些記憶並且殺死該對象的效率。使用iterator而不是鏈接:

from itertools import chain 

primes = chain([2], range(3, limit, 2)) 

現在你可以遍歷primes,而不將內存中的整個列表,還包括2在循環的開始。

+2

如果我有'range(3,ThisIsSuchABigNumber,2)'?我會爲一個範圍做一個數十億的清單嗎? – Liviu

+0

@利維:確切地說,這就是爲什麼你不會那麼做,真的。 –

+0

@Liviu'chain'和'range'是懶惰的函數。 'chain'會懶散地循環它的論點。所以,當調用時,整個列表將不會在內存中創建。 'range'將返回一個'range'對象,而不是整個列表。 – thefourtheye

5

如果你只循環,不希望兌現的話:

from itertools import chain 
primes = chain([2], range(3, limit, 2)) 

我覺得兩個在做,雖然開始更有意義......