我需要一个包含 range(3,666,2) 和 2(顺便说一句,用于埃拉托色尼筛法)的循环。这不起作用(“AttributeError:‘range’对象没有属性‘extend’”……或“append”):
primes = range(3,limit,2)
primes.extend(2)
我怎样才能用简单直观的 python 风格的方式做到这一点?
请您参考如下方法:
Python 3 中的
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。
