1. Использование цикла со строкой в результате
Создадим функцию reversed1 с аргументом variable, где variable - переменная, хранящая строку, которую мы хотим перевернуть. Так как строка являются неизменяемым объектом, то создадим отдельную, пока что пустую переменную res, которая в будущем будет хранить результат.
def reversed1(variable):
res=''В функцию поместим цикл, который будет "прохаживаться" по каждому из элементов строки. Начнем мы с конца строки, используя положительные индексы, соответственно параметр start функции range -len(variable)-1. -1 потому, что длина строки всегда на 1 больше, чем индекс последнего ее элемента. Закончить мы должны на первом символе строки, поэтому параметр stop функции range() - -1, поскольку перечисляются числа до значения этого параметра, не включительно. Параметр step - -1, потому что мы считаем в обратном порядке.
def reversed1(variable):
res=''
for i in range(len(variable)-1,-1,-1):
passТеперь заполним тело цикла - проведем конкатенацию между старым значением res и элементом строки с индексом i. Таким образом, при каждой итерации цикла мы добавляем по одному символу к результату. После окончания цикла вернем результат.
Полный код:
def reversed1(variable):
res=''
for i in range(len(variable)-1,-1,-1):
res+=variable[i]
return res
n = reversed1(input())
print(n)2. Использование цикла со списком в результате
Этот способ аналогичен предыдущему, единственное его отличие заключается в типе данных переменной res - здесь она является списком.
Вместо конкатенации можно использовать метод append(), с помощью которого мы добавляем элемент, указанный в качестве аргумента к методу, в конец списка. Итак, мы получили:
def reversed2(variable):
res=[]
for i in range(len(variable)-1,-1,-1):
res.append(variable[i])
return resФункция пока что возвращает список, состоящий из односимвольных элементов. Если нас это не устраивает, то почему бы не преобразовать список в строку при помощи метода join()? Сделаем это, добавив конструкцию res=''.join(res).
Полный код:
def reversed1(variable):
res=[]
for i in range(len(variable)-1,-1,-1):
res.append(variable[i])
res=''.join(res)
return res
n = reversed1(input())
print(n)3. Рекурсия
Третий в нашем обзоре способ - рекурсия, как всегда трудная для понимания. Как всегда создаем функцию, но не спешим помещать туда цикл.
Начну объяснение с конца. Если мы записали в результат все символы кроме первого, то длина оставшейся строки равна единице и, следовательно, ее нужно вернуть. Получаем:
def reversed3(variable):
if len(variable) == 1:
return variableНо если длина строки больше одного, то нужно вернуть последний из ее элементов и вызвать эту же функцию, но уже отрезав последний символ. Сделать это мы можем с помощью среза variable[:-1]. Обновим картину:
def reversed3(variable):
if len(variable) == 1:
return variable
else:
return variable[-1] + reversed3(variable[:-1])Использование else:здесь необязательно, так как после возвращения чего-либо этой функцией она завершится. Поэтому конструкцию return variable[-1] + reverse3(variable[:-1]) можно поместить напрямую в тело функции. Конечный вариант решения:
def reversed3(variable):
if len(variable) == 1:
return variable
return variable[-1] + reversed3(variable[:-1])
n = reversed3(input())
print(n)4. Использование встроенной функции
В Python 3 встроена специальная функция reversed(), в качестве аргумента она принимает список или строку, а возвращает итератор последовательности значений, состоящей из всех элементов аргумента в обратном порядке.
Простыми словами - недостаточно написать res = reversed(variable), данные нужно преобразовать в нужный тип (в нашем случае - в строку). Сделать мы это можем при помощи метода join(), соединив последовательность через пустую строку. После выполненных действий возвращаем результат. Код:
def reversed4(variable):
res=''.join(reversed(variable))
return res
n = reversed4(input())
print(n)5. Срез строки
Можете представить способ перевернуть строку, который был бы короче названия функции? А я могу!
Срез строки - вещь прекрасная, но порой пугающая новичков "уплотненным" синтаксисом. Срез содержит три параметра - [start:stop:step], аналогично функции range(). Подробнее о них вы можете прочитать в других статьях на Хабре.
Для способа с использованием срезов не нужно даже создавать функцию, только зря строки и время потратите. Все элементарно - присвоим параметру step значение -1 и пропустим два других параметра, происходит магия - строка переворачивается:
n = input()[::-1]
print(n)Ввод:qwerty
Вывод: ytrewq
Конечно, никакой магии здесь нет, мы просто перебираем символы с шагом -1, то есть в обратном порядке.
Заключение
Первый и второй способы как нельзя лучше подходят, если во время переворота строки нужно ее изменять. При этом они значительно уступают 4 и 5 способам в скорости. Читаются умеренно хорошо, поэтому в некоторых случаях их уместно использовать.
Насчет третьего способа много сказать не могу, поскольку не могу придумать ему применение. Такой способ плохо читается и довольно медленный, поэтому я не рекомендую его использовать.
Четвертый способ довольно быстрый, отлично читается и подходит во многих случаях.
Пятый способ - самый быстрый, хорошо читается, очень краткий (6 символов), поэтому его я считаю наиболее предпочтительным.
Сравнительную таблицу скорости некоторых способов вы можете найти по ссылке - https://python-scripts.com/reversed
Если знаете что-либо еще по этой теме, хотите меня поправить или дать идею - пишите в комментариях, я все прочту и приму к сведению. Удачи!