我需要一個包含range(3,666,2)
和2(對於Eratosthenes的篩子,順便說一句)的循環。這不起作用(「AttributeError的:‘範圍’對象有沒有屬性‘擴展’」 ......或「追加」):Python中的擴展範圍
primes = range(3,limit,2)
primes.extend(2)
我怎麼能做到這一點的簡單直觀的方式pythonesque?
我需要一個包含range(3,666,2)
和2(對於Eratosthenes的篩子,順便說一句)的循環。這不起作用(「AttributeError的:‘範圍’對象有沒有屬性‘擴展’」 ......或「追加」):Python中的擴展範圍
primes = range(3,limit,2)
primes.extend(2)
我怎麼能做到這一點的簡單直觀的方式pythonesque?
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
在循環的開始。
如果我有'range(3,ThisIsSuchABigNumber,2)'?我會爲一個範圍做一個數十億的清單嗎? – Liviu
@利維:確切地說,這就是爲什麼你不會那麼做,真的。 –
@Liviu'chain'和'range'是懶惰的函數。 'chain'會懶散地循環它的論點。所以,當調用時,整個列表將不會在內存中創建。 'range'將返回一個'range'對象,而不是整個列表。 – thefourtheye
如果你只循環,不希望兌現的話:
from itertools import chain
primes = chain([2], range(3, limit, 2))
我覺得兩個在做,雖然開始更有意義......
請打印出您的預計Ø/p。 –
@ python-coder:Python 3:'AttributeError:'range'object has no attribute'extend''。 –