Как вернуться назад в Python?

Я говорю о чем-то вроде:

for(i=n; i>=1; --i) {
   //do something with i
}

Я могу придумать несколько способов сделать это в python (создать список range(1,n+1) и отменить его, используя while и --i, ...), но мне было интересно, есть ли более элегантный способ сделать это. Есть?

РЕДАКТИРОВАТЬ: Некоторые предлагали использовать xrange () вместо range (), поскольку диапазон возвращает список, а xrange возвращает итератор. Но в Python 3 (который я использую) range () возвращает итератор, а xrange не существует.


person snakile    schedule 13.08.2010    source источник
comment
Слишком поздно отвечать, но я не видел здесь самого простого решения, так что вот оно ............................. ............................._ 1_ это даст вам i в обратном порядке. Мир снаружи.   -  person Parthik B.    schedule 17.02.2020
comment
@ParthikB разве обратное не создаст в конце лишнего места? похоже, вы создаете новый перевернутый массив - я могу ошибаться?   -  person BigDreamz    schedule 13.09.2020


Ответы (4)


range() и xrange() принимают третий параметр, определяющий шаг. Итак, вы можете сделать следующее.

range(10, 0, -1)

Который дает

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 

Но для итерации вы действительно должны использовать вместо этого xrange. Так,

xrange(10, 0, -1)

Примечание для пользователей Python 3: в Python 3 нет отдельных функций range и xrange, есть только range, что соответствует дизайну xrange в Python 2.

person Chinmay Kanchi    schedule 13.08.2010
comment
Поскольку этот вопрос касается итерации, используйте xrange вместо диапазона (не имеет большого значения для малых диапазонов, но начинает иметь значение для больших). - person mzz; 13.08.2010
comment
@mzz - только в Python 2.x - person Katriel; 13.08.2010
comment
Я использовал range просто потому, что это сделал OP. xrange vs range имеет значение только для действительно больших диапазонов, например сотен мегабайт. Кроме того, в Python 3.x это различие исчезло. - person Chinmay Kanchi; 13.08.2010
comment
@Chinmay, почему бы не использовать свой ответ как способ показать передовой опыт OP? Нет причин не предлагать использовать xrange. - person habnabit; 13.08.2010
comment
Что такое xrange? Это то же самое, что и диапазон, но быстрее? Если да, то почему это быстрее? - person snakile; 13.08.2010
comment
xrange создает генератор вместо list. Это означает, что вместо того, чтобы занимать всю память в начале, требуемое значение создается в то время, когда оно требуется. Для получения дополнительных сведений см. docs.python.org/tutorial/classes.html#generators - person Chinmay Kanchi; 13.08.2010
comment
Оказывается, xrange не существует в python 3 ... - person snakile; 13.08.2010
comment
Нет, это не так. В вашем вопросе не указано, какую версию python вы используете, и предположение по умолчанию, как правило, python 2.x - person Chinmay Kanchi; 13.08.2010
comment
я думаю, вам следует использовать диапазон (10, -1, -1) вместо диапазона (10, 0, -1). поскольку диапазон (10, 0, -1) остановится на индексе 0, в результате значение индекса 0 не будет печататься. - person Hatim; 30.11.2015
comment
На самом деле вы должны использовать диапазон (n-1, -1, -1), это предоставит значения от нуля до n-1. Как в этом ответе, так и в некоторых комментариях есть отдельные проблемы. - person Chris Flesher; 26.06.2017
comment
Да, в этом примере вы бы использовали (9, -1, -1) - person the_raging_deaner; 16.10.2019
comment
@ChrisFlesher, вы можете просто использовать range(n)[::-1], который переведен на range(n-1, -1, -1) (проверено в python 3.7) - person Hassan; 02.12.2019

for x in reversed(whatever):
    do_something()

Это работает практически со всем, что имеет определенный порядок, включая xrange объекты и списки.

person habnabit    schedule 13.08.2010
comment
Зная, что обратная функция возвращает список. Таким образом, обратный (диапазон (100000)) вернет новый список с 100000 элементами. - person Odomontois; 13.08.2010
comment
@Odomontois, нет, это не так. Он возвращает итератор. - person habnabit; 13.08.2010
comment
@Odomontois: Да, это неправда: print reversed([1, 2, 3]) возвращает <listreverseiterator object at 0xb77f1bec>. - person nosklo; 13.08.2010
comment
да. Прости. Возвращает результат метода obj .__ reversed__. Так что по умолчанию объекты-генераторы не имеют таких итераций, как многие другие. И даже обратное (reverse ([1,2,3])) вызывает TypeError. Таким образом, вы ДОЛЖНЫ создать список, прежде чем отправлять какой-либо итерируемый для обратного во многих ситуациях, например, reverse ([expr (i) for i in iterable if cond (i)]) - без скобок он падает. - person Odomontois; 13.08.2010
comment
Это должен быть принятый ответ imo - person Jamie Nicholl-Shelley; 20.04.2021

Все эти три решения дают одинаковые результаты, если ввод является строкой:

1.

def reverse(text):
    result = ""
    for i in range(len(text),0,-1):
        result += text[i-1]
    return (result)

2.

text[::-1]

3.

"".join(reversed(text))
person chocolate codes    schedule 15.07.2016
comment
какой метод рекомендуется использовать в зависимости от ситуации? - person Ridhwaan Shakeel; 08.12.2020

Чтобы перевернуть строку без использования reversed или [::-1], попробуйте что-нибудь вроде:

def reverse(text):
    # Container for reversed string
    txet=""

    # store the length of the string to be reversed
    # account for indexes starting at 0
    length = len(text)-1

    # loop through the string in reverse and append each character
    # deprecate the length index
    while length>=0:
        txet += "%s"%text[length]
        length-=1
    return txet
person alex.hunter    schedule 02.10.2014
comment
Зачем вам это нужно? Это довольно просто: def reverse (text): new_text = for char in text: new_text = char + new_text return new_text - person aks; 25.11.2015