#python #python-3.x
Вопрос:
Просто для пояснения, шаг также может быть отрицательным. В настоящее время я как раз этим и занимаюсь.
def excl_range(start, end, step):
if step > 0:
return range(start 1, end, step)
return range(start - 1, end, step)
Мне просто интересно, есть ли более чистый способ, предпочтительно без использования новой функции для этого.
Ответ №1:
Редко упоминаемый или используемый факт range
заключается в том, что это полный тип последовательности в python 3. Это означает, что вы можете индексировать объекты напрямую, в том числе с помощью срезов:
range(...)[1:]
Это эквивалентно увеличению start
на step
. Обратите внимание, что знак шага не имеет значения: второй элемент всегда start step
по определению:
range(start step, end, step)
Вы также можете исключить элемент во время итерации:
it = iter(range(...))
next(it)
for x in it:
...
Это работает для любой итерации, а не только range
для нее . Вы можете сделать то же самое с itertools.islice
:
for x in islice(range(...), 1):
...
Комментарии:
1. Ах, это именно то, что я искал, диапазон(…)[1:], так как другие 2 точно не будут работать очень чисто в моем контексте. Большое вам спасибо, я приму его, как только смогу.
2. @SamTaaghol. Я также добавил гораздо более чистую версию вашей первоначальной попытки
3. Дело в том, что «шаг» очень длинный, и я немного помешан на линиях, пытаясь сделать его как можно более чистым, ха-ха. вот почему я прибегнул к использованию этой функции.
Ответ №2:
Вы могли бы подумать о том, чтобы сделать это вот так:-
step = 1
start = 10
end = 100
for i in range(start 1 if step > 0 else start - 1, end, step):
pass # your code goes here
Комментарии:
1. Только что понял, что вы можете нарезать диапазон напрямую
2. @darkknight Ты , наверное, имел в виду
start step
, что нетstart 1
.3. Кроме того, из-за этого нет никаких условий. Я добавил это к своему ответу сейчас
4. @Тьерри Латуйль Нет. Взгляните еще раз на код операции
5. Ну, исходный код операции неверен в этом аспекте и не делает того, что задается вопросом.