Python中的扩展范围

问题描述:

我需要一个包含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''。 –

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

如果你只循环,不希望兑现的话:

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

我觉得两个在做,虽然开始更有意义......