Почему диапазон (1, 10) включает 1? [dубликат]

Вместо того, чтобы пытаться определить переменные a1, a2, a3, ... вы можете просто определить массив фиксированного размера:

  int [] anArray = new int [10];   

и ссылаются на [1], a [2], a [3], ...

204
задан marcog 22 December 2010 в 00:07
поделиться

8 ответов

Поскольку чаще всего вызывается диапазон (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]  
171
ответ дан wim 16 August 2018 в 04:02
поделиться
  • 1
    Если бы это было рассуждение, параметры не были бы range (start, count) ? – Mark Ransom 21 December 2010 в 23:50
  • 2
    @shogun Значение начала по умолчанию равно 0, то есть диапазон (10) эквивалентен диапазону (0, 10) . – marcog 21 December 2010 в 23:57
  • 3
    Ваш диапазон 1 не будет работать с диапазонами с разным размером шага, чем 1 . – dimo414 21 May 2015 в 05:09
  • 4
    Вы объясните, что диапазон (x) должен начинаться с 0, а x будет «длиной диапазона». ОК. Но вы не объяснили, почему диапазон (x, y) должен начинаться с x и заканчиваться y-1. Если программист хочет для цикла с i от 1 до 3, он должен явно добавить 1. Действительно ли это связано с удобством? – armin 24 July 2016 в 14:42
  • 5
    для i в диапазоне (len (li)): скорее антипаттерн. Нужно использовать перечислять . – hans 6 March 2018 в 13:17

В основном в диапазоне 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 ()

0
ответ дан Ashish Dixit 16 August 2018 в 04:02
поделиться

Хотя здесь есть некоторые полезные алгоритмические объяснения, я думаю, что это может помочь добавить некоторые простые «реальные жизненные» рассуждения о том, почему он работает таким образом, который я нашел полезным при представлении предмета молодым новичкам:

С чем-то вроде «диапазона (1,10)» может возникнуть путаница из-за того, что пара параметров представляет «начало и конец».

Это фактически начало и «остановка».

Теперь, если были значением «end», тогда, да, вы могли бы ожидать, что число будет включено в качестве окончательной записи в последовательности. Но это не «конец».

Другие ошибочно называют этот параметр «count», потому что если вы когда-либо используете «range (n)», то он, конечно же, повторяет «n» раз. Эта логика ломается, когда вы добавляете начальный параметр.

Итак, ключевым моментом является запоминание его имени: «stop». Это означает, что точка, по которой, когда она будет достигнута, итерация немедленно прекратится. Не после этой точки.

Итак, в то время как «start» действительно представляет первое значение, которое должно быть включено, при достижении значения «stop» оно «ломается», а не продолжается до процесс «это тоже» перед остановкой.

Одна аналогия, которую я использовал в объяснении этого для детей, заключается в том, что, как это ни парадоксально, лучше вести себя, чем детей! Он не останавливается после , который он должен, - он останавливается немедленно, не заканчивая того, что он делает. (Они получают это;))

Другая аналогия - когда вы водите машину, вы не проходите знак остановки / выхода / «уступить» и в конечном итоге сидите где-то рядом или сзади, ваша машина. Технически вы все еще не достигли этого, когда останавливаетесь.

Надеюсь, что некоторые из них помогают объяснить Pythonitos / Pythonitas!

. Это не относится к «вещам, которые вы передали в своем путешествии».

11
ответ дан dingles 16 August 2018 в 04:02
поделиться

Он хорошо работает в сочетании с нулевым индексированием и 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 () .

16
ответ дан kindall 16 August 2018 в 04:02
поделиться
  • 1
    +1 для согласованности с нарезкой. – Steve Tjoa 22 December 2010 в 02:33
  • 2
    Согласитесь на нарезку. w = 'abc'; w [:] == w [0: len (w)]; w [: - 1] == w [0: len (w) -1]; – kevpie 22 December 2010 в 03:32
  • 3
    def full_range (start, stop): диапазон возврата (запуск, останов + 1) ## вспомогательная функция – nobar 17 August 2011 в 01:44
  • 4
    возможно, пример перечисления должен читать для индекса, элемент в перечислении (x) , чтобы избежать путаницы – seans 7 March 2016 в 14:05
  • 5
    @ Seans Спасибо, исправлено. – kindall 17 March 2016 в 19:27

Рассмотрим код

  для i в диапазоне (10): print «Вы увидите это 10 раз», i  

Идея что вы получите список длины yx , который вы можете (как видите выше) перебирать.

Читайте в документы python для диапазона - они рассматривают for-loop итерацию первичную usecase.

4
ответ дан Robert 16 August 2018 в 04:02
поделиться

Эксклюзивные диапазоны имеют некоторые преимущества:

С одной стороны, каждый элемент в диапазоне (0, n) является допустимым индексом для списков длины n .

Также диапазон (0, n) имеет длину n , а не n + 1 , которая включающий диапазон.

17
ответ дан sepp2k 16 August 2018 в 04:02
поделиться

Длина диапазона - это верхнее значение минус нижнее значение.

Это очень похоже на что-то вроде:

  for (var i = 1; i & lt;  , [; D5] 

Также, как и диапазон Ruby:

]
  1 ... 11 # это диапазон от 1 до 10  

Однако Ruby признает, что много раз вы захотите включить значение терминала и предложить альтернативный синтаксис:

  1..10 # это также диапазон от 1 до 10  
7
ответ дан Skilldrick 16 August 2018 в 04:02
поделиться
  • 1
    Г! Я не использую Ruby, но могу себе представить, что 1..10 vs 1 ... 10 трудно отличить при чтении кода! – marcog 22 December 2010 в 00:04
  • 2
    @marcog - когда вы знаете, что существуют две формы, ваши глаза настраиваются на разницу :) – Skilldrick 22 December 2010 в 00:48
  • 3
    Оператор диапазона Ruby прекрасно интуитивно понятен. Более длинная форма дает вам более короткую последовательность. <Я> Кашель – Russell Borogove 22 December 2010 в 01:50
  • 4
    @Russell, возможно, 1 ............ 20 должен давать тот же диапазон, что и 1..10. Теперь для этого потребуется какой-то синтаксический сахар. ;) – kevpie 22 December 2010 в 04:25
  • 5
    @Russell Дополнительная точка сжимает последний элемент из диапазона :) – Skilldrick 22 December 2010 в 10:18

Это также полезно для диапазонов разделения; диапазон (a, b) можно разбить на диапазон (a, x) и (x, b) , тогда как с включенным диапазоном вы будет писать либо x-1 , либо x + 1 . Хотя вам редко приходится разделять диапазоны, вы часто часто разбиваете списки, что является одной из причин нарезки списка l [a: b] включает в себя a-ый элемент, но не b- е. Тогда диапазон , обладающий тем же свойством, делает его хорошо согласованным.

9
ответ дан user200783 16 August 2018 в 04:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: