Pull to refresh

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

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

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.