Я пытаюсь составить список с числами 1-1000
в нем. Очевидно, что это было бы неприятно писать / читать, поэтому я пытаюсь составить список с диапазоном в нем. В Python 2 кажется, что:
some_list = range(1,1000)
сработало бы, но в Python 3 диапазон похож на xrange
Python 2?
Кто-нибудь может дать некоторое представление об этом?
python
python-3.x
list
range
навес для лодок
источник
источник
some_list[i] == i+1
так что, вероятно, вам все равно не нужен список.Ответы:
Вы можете просто построить список из объекта диапазона:
Вот как вы это делаете с генераторами в python2.x. Говоря в общем, вам, вероятно, не нужен список, поскольку вы можете получить значение
my_list[i]
более эффективно (i + 1
), и если вам просто нужно перебрать его, вы можете просто вернуться к немуrange
.Также обратите внимание, что на python2.x
xrange
все еще индексируется 1 . Это означает, чтоrange
на python3.x тоже есть свойство 21
print xrange(30)[12]
работает для python2.x2 Аналогичное утверждение для 1 в python3.x есть
print(range(30)[12])
и это тоже работает.источник
list(arg)
других языках это называется вызовом конструктораlist
класса. На самом деле, это также случай с Python. Споры о том, заполнен ли объект во время конструирования (как в случае C ++) или только во время первого автоматически вызываемого метода (как в__init__()
методе Python ), не могут изменить основную абстрактную идею. На мой взгляд, конструктор списка берет итератор и заполняет список возвращаемыми значениями .'range' object is not callable
В Pythons <= 3.4 вы можете, как другие предложили, использовать
list(range(10))
, чтобы составить список из диапазона (в общем, любой повторяемый).Другая альтернатива, представленная в Python
3.5
с его распаковывающими обобщениями, заключается в использовании*
в списке литерала[]
:Хотя это эквивалентно
list(r)
, это буквальный синтаксис, и тот факт, что вызов функции не задействован, позволяет выполнять его быстрее. Это также меньше символов, если вам нужно код гольф :-)источник
[*range(10)]
прекрасно работает, когда вам не нужноrange
ни для каких целей, кроме инициализацииlist
. Примечание: моя любимая (хорошо, не совсем) часть распаковывающих обобщений состоит в том, что пустыеset
s теперь имеют буквальный синтаксис{*()}
, или, как я это называю, оператор одноглазой обезьяны. ;-)в Python 3.x
range()
функция получила свой собственный тип. так что в этом случае вы должны использовать итераторlist(range(1000))
источник
list(range(1000))()
Причина, по которой Python3 не имеет функции для непосредственного получения ранжированного списка, заключается в том, что оригинальный дизайнер Python3 был довольно новичком в Python2. Он рассматривал только использование
range()
функции в цикле for, поэтому список никогда не нужно расширять. На самом деле, очень часто нам нужно использоватьrange()
функцию для создания списка и передачи в функцию.Следовательно, в этом случае Python3 менее удобен по сравнению с Python2, потому что:
xrange()
иrange()
;range()
иlist(range())
Тем не менее, вы все равно можете использовать расширение списка следующим образом:
источник
list
, потому что обычно это неправильно. Для 99 из 100 вариантов использования создание фактаlist
неэффективно и бессмысленно, посколькуrange
само по себе действует как неизменяемая последовательность почти во всех отношениях, иногда более эффективно при загрузке (например, тесты содержания дляint
s являютсяO(1)
, а неO(n)
дляlist
s). В Python 2 люди предпочитали использоватьrange
по умолчанию, хотя этоxrange
был почти всегда лучший вариант; в Python 3 вы можете явно включитьlist
, а не случайно получить его, используя неправильное имя.Вам действительно не нужно использовать цифры 1-1000 в списке. Но если по какой-то причине вам действительно нужны эти цифры, то вы можете сделать:
Понимание списка в двух словах:
Вышеприведенное понимание списка означает:
Это всего лишь синтаксис понимания списка, хотя из 2.x. Я знаю, что это будет работать в Python 3, но я не уверен, что есть также обновленный синтаксис
Диапазон начинается с первого параметра; но заканчивается до, не включая второй параметр (когда задано 2 параметра; если первый параметр пропущен, он будет начинаться с «0»)
источник
list(range(1000))
list()
конструктора с итерацией .list()
Конструктор знает , как создать новый список , когда данный объект любой итерации.list(range(1000))
inspectorG4dget : будет работать в python3 так же, как иlist(xrange(1000))
в python2На самом деле, если вы хотите 1-1000 (включительно), используйте
range(...)
функцию с параметрами 1 и 1001:range(1, 1001)
потому чтоrange(start, end)
функция переходит от начала к (конец-1) включительно.источник
Используйте Range в Python 3.
Вот пример функции, которая возвращает число между двумя числами
источник
Фактически, это ретро-градация Python3 по сравнению с Python2. Конечно, Python2, который использует range () и xrange (), более удобен, чем Python3, который использует list (range ()) и range () соответственно. Причина в том, что первоначальный разработчик Python3 не очень опытен, они рассматривали только использование функции range многими новичками для итерации по большому количеству элементов, в которых неэффективны как память, так и процессор; но они пренебрегали использованием функции диапазона для создания списка номеров. Теперь им уже поздно возвращаться.
Если бы я был дизайнером Python3, я:
Это должно быть оптимальным.
источник