2015-05-28 4 views
7

Не знаете, какие аргументы внутри [ ] действительно выполняют функцию range().range (n) [x: y: z]

Exp: print (range(5)[::-2]) Выход: [4, 2, 0]

Но если [x:y:z] обозначает [start:stop:step], а затем, когда я ставлю print(range(5)[4:-2:-2]) список выход [4] вместо [4, 2, 0], не уверен, как это работает.

ответ

8

В Python 3, range() создается специальный объект range. В Python 2 он создает list.

List element:  0 1 2 3 4 
Index:   0 1 2 3 4 
Backwards index: -5 -4 -3 -2 -1 

Так, переходя от индекса к индексу 4-2 действительно идет из элемента списка 4 в список элемент 3. Поскольку вы пропускаете все остальные элементы, вы не добираетесь до 3, оставив вас только с [4].

+0

. Тогда как я могу идти до отрицательного числа? – The6thSense

+0

@VigneshKalai В диапазоне нет отрицательного числа. Если вам нужны отрицательные числа, вы не должны указывать «диапазон» для перехода от нуля к определенному (положительному) числу. – poke

+0

Как @Shashank говорит, создайте этот 'list', передав правильные аргументы' range() ', а не пытаясь нарезать неправильный' list' в форму. – TigerhawkT3

-1

Вы можете лечить [x: y: z] означает [start: stop: прыжки] в диапазоне от 5 до и после итерации от 0 до 4 включительно, и поскольку ваш z отрицателен, он будет перебирать от 4 до 0 с 2 прыжками 4 --- 3 --- 2 (--- представляет прыжки), поэтому выход равен 4 --- (3) --- 2 --- (1) --- 0. ------> ------->

Счастливый Coding

7

Вы правы, это [start:stop:step]. Обратите внимание, что отрицательные пуски и остановки определены для начала в конце последовательности. Таким образом, для диапазона, который заканчивается значениями 2, 3, 4, остановка -2 относится к 3 (-1 - последняя, ​​-2 - вторая и последняя и т. Д.).

Итак, в вашем случае диапазон имеет длину 5, начиная с 0 и заканчивая на 4. Вы начинаете с индекса 4 и заканчиваетесь индексом -2, который составляет 5-2 = 3. Так что пока индекс относится к [3, 4]. Теперь, начиная с 4, у вас есть отрицательный шаг 2. Таким образом, вы пропустите 3, в результате получится всего лишь [4].

Если вы хотите [4, 2, 0], то вы должны выйти из стопа:

>>> range(5)[4::-2] 
[4, 2, 0] 

Вы можете на самом деле даже выйти из старта:

>>> range(5)[::-2] 
[4, 2, 0] 

но range(5)[4:-2] результатов []. Затем как range(5)[4:-2:-2] результаты [4]?

Срез оценивается сразу, а не один аргумент за другим:

После оценки отрицательного стоп, range(5)[4:-2] эквивалентно range(5)[4:3]. Поскольку указанного шага не указано, будет использоваться шаг по умолчанию для положительного 1. Это означает, что срез должен перейти от индекса 4 к индексу 3 с положительным шагом. Это невозможно, поэтому возвращается пустой список.

Если у нас есть отрицательный шаг, это выглядит так: range(5)[4:3:-2]. Теперь, поскольку у нас есть отрицательный шаг, направление меняется на противоположное. Таким образом, мы можем начать с индекса 4 и перейти к более низкому индексу 3.

Это просто определено, что для положительного шага, stop >= start должно быть правдой, а для отрицательного шага - обратным, stop <= start.

+0

но 'диапазон (5) [4: -2]' 'результаты []'. Затем как 'range (5) [4: -2: -2]' results '[4]'? – itzMEonTV

+0

@itzmeontv Добавил ответ на этот вопрос в моем ответе. – poke

+0

ok это должно быть лучшим объяснением на этом – itzMEonTV

2

Ломтики с тремя аргументами, определенными в терминах [start:stop:step]. Кстати, это также то, как объекты диапазона определяются с тремя аргументами. Посмотрим, как это скоро начнется.

То, что вы делаете это:

>>> range(5) 
[0, 1, 2, 3, 4] 
>>> range(5)[4:-2:-2] 
[4] 

Отрицательные индексы в Python обтекать от длины последовательности. Таким образом, длина вашего списка равна 5, а затем вы делаете два шага вниз с -2, поэтому вы получаете индекс 3 в качестве значения остановки. Другими словами, индекс 3 является дозорным значением для итератора, в этот момент операция среза перестает собирать элементы. Вы будете отступать на 2 индекса каждый шаг, но индекс 3 является дозорным, поэтому срез останавливает сбор элементов после того, как он захватывает элемент по индексу 4 и достигает индекса остановки.

То, что вы, вероятно, на самом деле хотите сделать это:

>>> range(4, -2, -2) 
[4, 2, 0] 
+1

В Python 2 'range()' уже возвращает 'list'. – TigerhawkT3

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