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
Если знаете что-либо еще по этой теме, хотите меня поправить или дать идею - пишите в комментариях, я все прочту и приму к сведению. Удачи!