Вместо того, чтобы пытаться определить переменные a1, a2, a3, ... вы можете просто определить массив фиксированного размера:
int [] anArray = new int [10];
и ссылаются на [1], a [2], a [3], ...
Поскольку чаще всего вызывается диапазон (0, 10)
, который возвращает [0,1,2,3,4,5,6,7,8,9]
, который содержит 10 элементов, которые равны len (диапазон (0, 10))
. Помните, что программисты предпочитают индексирование на основе 0.
Также рассмотрим следующий общий фрагмент кода:
для i в диапазоне (len (li)): pass
Не могли бы вы увидеть, что если range ()
поднялся до точности len (li)
, это было бы проблематично? Программисту нужно будет явно вычесть 1. Это также следует общей тенденции программистов, предпочитающих для (int i = 0; i & lt; 10; i ++)
по сравнению с для (int i = 0; i! = 9; i ++)
.
Если вы часто вызываете диапазон с началом 1, вы можете определить свою собственную функцию:
& GT; & GT; & GT; def range1 (начало, конец): ... диапазон возврата (начало, конец + 1) ... & gt; & gt; & gt; & gt; & gt; & gt; range1 (1, 10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
В основном в диапазоне python (n) выполняется итерация n раз, которая имеет исключительный характер, поэтому она не дает последнего значения при ее печати, мы можем создать функцию, которая дает инклюзивное значение, это означает, что она также будет печатать последние значение, указанное в диапазоне.
def main (): для i in inclusive_range (25): print (i, sep = "")
def inclusive_range (* args):
numargs = len (args), если numargs == 0: raise TypeError («вам нужно написать хотя бы значение») elif numargs == 1: stop = args [0] start = 0 step = 1 elif numargs == 2: (start, stop) = args step = 1 elif numargs == 3: (start, stop, step) = args else: raise TypeError (ожидается, что будет включен диапазон включения не более 3 аргументов, получено {} ". format (numargs)) i = start while i & lt; = stop: yield i i + = step
, если name ==" main ": main ()
Хотя здесь есть некоторые полезные алгоритмические объяснения, я думаю, что это может помочь добавить некоторые простые «реальные жизненные» рассуждения о том, почему он работает таким образом, который я нашел полезным при представлении предмета молодым новичкам:
С чем-то вроде «диапазона (1,10)» может возникнуть путаница из-за того, что пара параметров представляет «начало и конец».
Это фактически начало и «остановка».
Теперь, если были значением «end», тогда, да, вы могли бы ожидать, что число будет включено в качестве окончательной записи в последовательности. Но это не «конец».
Другие ошибочно называют этот параметр «count», потому что если вы когда-либо используете «range (n)», то он, конечно же, повторяет «n» раз. Эта логика ломается, когда вы добавляете начальный параметр.
Итак, ключевым моментом является запоминание его имени: «stop». Это означает, что точка, по которой, когда она будет достигнута, итерация немедленно прекратится. Не после этой точки.
Итак, в то время как «start» действительно представляет первое значение, которое должно быть включено, при достижении значения «stop» оно «ломается», а не продолжается до процесс «это тоже» перед остановкой.
Одна аналогия, которую я использовал в объяснении этого для детей, заключается в том, что, как это ни парадоксально, лучше вести себя, чем детей! Он не останавливается после , который он должен, - он останавливается немедленно, не заканчивая того, что он делает. (Они получают это;))
Другая аналогия - когда вы водите машину, вы не проходите знак остановки / выхода / «уступить» и в конечном итоге сидите где-то рядом или сзади, ваша машина. Технически вы все еще не достигли этого, когда останавливаетесь.
Надеюсь, что некоторые из них помогают объяснить Pythonitos / Pythonitas!
. Это не относится к «вещам, которые вы передали в своем путешествии».
Он хорошо работает в сочетании с нулевым индексированием и len ()
. Например, если у вас есть 10 элементов в списке x
, они пронумерованы 0-9. range (len (x))
дает вам 0-9.
Конечно, люди скажут вам, что это больше Pythonic для для элемента в x
или для индекса, item в перечислении (x)
, а не для i в диапазоне (len (x))
.
Нарезка тоже работает так: foo [1: 4]
- это пункты 1-3 из foo
(имея в виду, что элемент 1 на самом деле является вторым элементом из-за индексации на основе нуля). Для согласованности они должны работать одинаково.
Я думаю, что это: «первое число, которое вы хотите, за которым следует первое число, которое вы не хотите ». Если вы хотите 1-10, первое число, которое вам не нужно, равно 11, поэтому это диапазон (1, 11)
.
Если он становится громоздким в конкретном приложении, достаточно легко написать небольшую вспомогательную функцию, которая добавляет 1 к концу индекса и вызывает range ()
.
w = 'abc'; w [:] == w [0: len (w)]; w [: - 1] == w [0: len (w) -1];
– kevpie
22 December 2010 в 03:32
def full_range (start, stop): диапазон возврата (запуск, останов + 1) ## вспомогательная функция
– nobar
17 August 2011 в 01:44
для индекса, элемент в перечислении (x)
, чтобы избежать путаницы
– seans
7 March 2016 в 14:05
Рассмотрим код
для i в диапазоне (10): print «Вы увидите это 10 раз», i
Идея что вы получите список длины yx
, который вы можете (как видите выше) перебирать.
Читайте в документы python для диапазона - они рассматривают for-loop итерацию первичную usecase.
Эксклюзивные диапазоны имеют некоторые преимущества:
С одной стороны, каждый элемент в диапазоне (0, n)
является допустимым индексом для списков длины n
.
Также диапазон (0, n)
имеет длину n
, а не n + 1
, которая включающий диапазон.
Длина диапазона - это верхнее значение минус нижнее значение.
Это очень похоже на что-то вроде:
for (var i = 1; i & lt; , [; D5] Также, как и диапазон Ruby:
] 1 ... 11 # это диапазон от 1 до 10
Однако Ruby признает, что много раз вы захотите включить значение терминала и предложить альтернативный синтаксис:
1..10 # это также диапазон от 1 до 10
1..10
vs 1 ... 10
трудно отличить при чтении кода!
– marcog
22 December 2010 в 00:04
Это также полезно для диапазонов разделения; диапазон (a, b)
можно разбить на диапазон (a, x)
и (x, b)
, тогда как с включенным диапазоном вы будет писать либо x-1
, либо x + 1
. Хотя вам редко приходится разделять диапазоны, вы часто часто разбиваете списки, что является одной из причин нарезки списка l [a: b]
включает в себя a-ый элемент, но не b- е. Тогда диапазон
, обладающий тем же свойством, делает его хорошо согласованным.
range (start, count)
? – Mark Ransom 21 December 2010 в 23:50диапазон (10)
эквивалентен диапазону(0, 10)
. – marcog 21 December 2010 в 23:571
не будет работать с диапазонами с разным размером шага, чем1
. – dimo414 21 May 2015 в 05:09для i в диапазоне (len (li)):
скорее антипаттерн. Нужно использоватьперечислять
. – hans 6 March 2018 в 13:17