扩展Python范围

Liv*_*viu 1 python range python-3.x

我需要一个包含range(3,666,2)2和2 的循环(顺便说一下,对于Eratosthenes的筛子).这不起作用("AttributeError:'range'对象没有属性'extend'"......或"append"):

primes = range(3,limit,2)
primes.extend(2)
Run Code Online (Sandbox Code Playgroud)

我怎么能以简单直观的pythonesque方式做到这一点?

Mar*_*ers 6

range()在Python 3中返回一个专用的不可变序列对象.你必须把它变成一个列表来扩展它:

primes = list(range(3, limit, 2))
primes.append(2)
Run Code Online (Sandbox Code Playgroud)

请注意,我使用过list.append(),而不是list.extend()(它需要一系列值,而不是一个整数).

但是,您可能希望开始循环2,而不是结束它.此外,将整个范围具体化为列表需要一些记忆并且杀死对象的效率.使用迭代器链接:

from itertools import chain

primes = chain([2], range(3, limit, 2))
Run Code Online (Sandbox Code Playgroud)

现在你可以循环primes而不在内存中实现整个列表,并且仍然包含2在循环的开头.

  • 如果我有`range(3,ThisIsSuchABigNumber,2)`?我会为一个范围做一个数十亿的清单吗? (2认同)

Jon*_*nts 5

如果您只是循环而不想实现,那么:

from itertools import chain
primes = chain([2], range(3, limit, 2))
Run Code Online (Sandbox Code Playgroud)

我认为这两个在开始时更有意义......