8 ответов:
потому что это более распространенный вызов
range(0, 10)возвращает[0,1,2,3,4,5,6,7,8,9], который содержит 10 элементов, которые равныlen(range(0, 10)). Помните, что программисты предпочитают индексирование на основе 0.кроме того, рассмотрим следующий общий фрагмент кода:
for i in range(len(li)): passвы могли бы увидеть, что если
range()подошел точноlen(li)что это будет проблематично? Программист должен был бы явно вычесть 1. Это также следует за общей тенденцией программистов, предпочитающихfor(int i = 0; i < 10; i++)заfor(int i = 0; i <= 9; i++).если вы часто вызываете диапазон с началом 1, Вы можете определить свою собственную функцию:
>>> def range1(start, end): ... return range(start, end+1) ... >>> range1(1, 10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
эксклюзивные диапазоны имеют некоторые преимущества:
для одной вещи каждый элемент в
range(0,n)является допустимым индексом для списков длинойn.и
range(0,n)имеет длинуn, а неn+1какой диапазон будет.
он хорошо работает в сочетании с нулевой индексацией и
len(). Например, если у вас есть 10 элементов в спискеx, они пронумерованы 0-9.range(len(x))дает вам 0-9.конечно, люди скажут вам, что это более Питонский сделать
for item in xилиfor index, item in enumerate(x), а неfor i in range(len(x)).нарезка работает так же:
foo[1:4]это пункты 1-3 изfoo(имея в виду, что пункт 1 на самом деле является вторым пунктом из-за индексации на основе нуля). Для согласованности, они должны оба работают одинаково.Я думаю об этом так: "первое число, которое вы хотите, а затем первое число вы не хочу."Если вы хотите 1-10, первое число, которое вы не хотите, это 11, так что это
range(1, 11).если он становится громоздким в конкретном приложении, достаточно легко написать небольшую вспомогательную функцию, которая добавляет 1 к конечному индексу и вызывает
range().
хотя здесь есть некоторые полезные алгоритмические объяснения, я думаю, что это может помочь добавить некоторые простые "Реальные" рассуждения о том, почему это работает таким образом, которые я нашел полезными при введении предмета молодым новичкам:
с чем-то вроде "диапазона(1,10)"путаница может возникнуть из-за того, что пара параметров представляет собой "начало и конец".
Это на самом деле старт и "стоп".
теперь, если это были в значение " end " тогда, да, вы можете ожидать, что это число будет включено в качестве последней записи в последовательности. Но это не "конец".
другие ошибочно называют этот параметр "count", потому что если вы когда-либо используете только " range(n)", то он, конечно же, повторяет " n " раз. Эта логика ломается при добавлении параметра start.
поэтому ключевым моментом является запоминание его названия:"остановка". Это означает, что это точка, в которой, при достижении итерации перестанет немедленно. Не после ссылки.
таким образом, хотя "start" действительно представляет собой первое значение, которое будет включено, при достижении значения "stop" он "ломается", а не продолжает обрабатывать "этот" перед остановкой.
одна аналогия, которую я использовал, объясняя это детям, заключается в том, что, по иронии судьбы, он ведет себя лучше, чем дети! Это не останавливает после он должен-он останавливается сразу же, не закончив то, что он делал. (Они получают это ;))
еще одна аналогия - когда вы водите машину, вы не передать знак остановки / выхода / "Уступите дорогу" и в конечном итоге он сидит где-то рядом или позади вашего автомобиля. Технически вы все еще не достигли его, когда вы останавливаетесь. Это не входит в "вещи, которые вы прошли в своем путешествии".
Я надеюсь, что некоторые из них помогают в объяснении Pythonitos / Pythonitas!
длина диапазона верхнее значение нижнее значение минус.
Это очень похоже на что-то вроде:
for (var i = 1; i < 11; i++) { //i goes from 1 to 10 in here }на языке C-стиля.
также как диапазон Руби:
1...11 #this is a range from 1 to 10однако Ruby признает, что много раз вы захотите включить терминальное значение и предлагает альтернативный синтаксис:
1..10 #this is also a range from 1 to 10
это также полезно для разделения диапазонов;
range(a,b)можно разделить наrange(a, x)иrange(x, b), тогда как диапазон необходимо написатьx-1илиx+1. Хотя вам редко нужно разбивать диапазоны, вы часто разделяете списки, что является одной из причин нарезки спискаl[a:b]включает в себя a-й элемент, но не b-й. Тогдаrangeналичие одного и того же свойства делает его хорошо последовательным.
рассмотрим код
for i in range(10): print "You'll see this 10 times", iидея в том, что вы получаете список длины
y-x, который вы можете (как вы видите выше) перебрать.Читать далее документы python для диапазона-они считают итерацию for-loop основной usecase.
В основном в python
range(n)проходитnраз, который имеет эксклюзивный характер, поэтому он не дает последнего значения, когда он печатается, мы можем создать функцию, которая дает инклюзивное значение это означает, что он также будет печатать последнее значение, указанное в диапазоне.def main(): for i in inclusive_range(25): print(i, sep=" ") def inclusive_range(*args): numargs = len(args) if numargs == 0: raise TypeError("you need to write at least a value") 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("Inclusive range was expected at most 3 arguments,got {}".format(numargs)) i = start while i <= stop: yield i i += step if __name__ == "__main__": main()
Comments