Python中的扩展范围
我需要一个包含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''。 –