2014-01-16 2 views
1

Мне нужна петля, содержащая range(3,666,2) и 2 (для просечки Эратосфена, между прочим). Это не работает («AttributeError:„Диапазон“объект не имеет атрибута" продлить»... или«добавляемый»):Расширение диапазона в Python

primes = range(3,limit,2) 
primes.extend(2) 

Как я могу это сделать в простой интуитивной pythonesque образом?

+0

Распечатайте ожидаемый о /п. –

+0

@ python-coder: Python 3: 'AttributeError: объект 'range' не имеет атрибута 'extend''. –

ответ

6

range() в Python 3 возвращает выделенный объект неизменным. Вы должны включить его в список, чтобы расширить его:

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 в начале цикла.

+2

И если у меня есть диапазон (3, ThisIsSuchABigNumber, 2) '? Я сделаю список миллиардов только для диапазона? – Liviu

+0

@ Liviu: именно так вы и не хотели бы этого делать. –

+0

@ Liviu 'chain' и' range' - ленивые функции. 'chain' будет лениво перебирать свои аргументы. Таким образом, весь список не будет создан в памяти при вызове. 'range' вернет объект' range', а не весь список. – thefourtheye

5

Если вы только перекручивание и не хотите, чтобы материализовать, то:

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

Я думаю, что два имеет больше смысла в начале, хотя ...

Смежные вопросы