我需要一个包含range(3,666,2)
和2的循环(顺便提一下,对于Eratosthenes的筛子)。这不起作用(“AttributeError:'range'对象没有属性'extend'”......或“append”):
primes = range(3,limit,2)
primes.extend(2)
我怎么能用简单直观的pythonesque方式做到这一点?
答案 0 :(得分:6)
range()
返回一个专用的不可变序列对象。你必须把它变成一个列表来扩展它:
primes = list(range(3, limit, 2))
primes.append(2)
请注意,我使用的是list.append()
,而不是list.extend()
(需要序列的值,而不是一个整数)。
但是,你可能希望开始你的2
循环,而不是结束它。此外,将整个范围具体化为列表需要一些记忆并且杀死对象的效率。请改用迭代器链接:
from itertools import chain
primes = chain([2], range(3, limit, 2))
现在你可以循环primes
而不在内存中实现整个列表,并且在循环开始时仍然包含2
。
答案 1 :(得分:5)
如果您只是循环而不想实现,那么:
from itertools import chain
primes = chain([2], range(3, limit, 2))
我认为这两个在开始时更有意义......