Как стать автором
Обновить

5 способов перевернуть строку в Python 3

Python *
Ожидает приглашения

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

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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.