- Как перевернуть строку в Python
- Использование цикла for
- Применение цикла while
- С помощью оператора slice([])
- Использование обратной функции reversed() с соединением
- Применение рекурсии
- 5 способов перевернуть строку в Python 3
- 2. Использование цикла со списком в результате
- 3. Рекурсия
- 4. Использование встроенной функции
- 5. Срез строки
- Заключение
Как перевернуть строку в Python
Python String – это набор символов Юникода. Python имеет множество функций для обработки строк, но его строковая библиотека не поддерживает встроенную функцию «reverse()». Существуют другие способы как перевернуть строку в Python.
Использование цикла for
Изменим данную строку, используя цикл for.
def reverse_string(str): str1 = "" # Declaring empty string to store the reversed string for i in str: str1 = i + str1 return str1 # It will return the reverse string to the caller function str = "JavaTpoint" # Given String print("The original string is: ",str) print("The reverse string is",reverse_string(str)) # Function call
('The original string is: ', 'JavaTpoint') ('The reverse string is', 'tniopTavaJ')
В приведенном выше коде мы объявили функцию reverse_string() и передали аргумент str. В теле функции мы объявили пустую строковую переменную str1, которая будет содержать перевернутую строку.
Цикл for повторяет все элементы данной строки, соединяет каждый символ в начале и сохраняет его в переменной str1.
После полной итерации с помощью данного цикла в вызывающей функции вернулась строка обратного порядка str1. Результат напечатан на экране.
Применение цикла while
Мы также можем перевернуть строку, используя цикл while. Разберем этот способ на следующем примере.
# Reverse string # Using a while loop str = "JavaTpoint" # string variable print ("The original string is : ",str) reverse_String = "" # Empty String count = len(str) # Find length of a string and save in count variable while count > 0: reverse_String += str[ count - 1 ] # save the value of str[count-1] in reverseString count = count - 1 # decrement index print ("The reversed string using a while loop is : ",reverse_String)# reversed string
('The original string is : ', 'JavaTpoint') ('The reversed string using a while loop is : ', 'tniopTavaJ')
В приведенном выше коде мы объявили переменную str, которая содержит строковое значение. Мы инициализировали цикл while значением строки.
На каждой итерации значение str [count – 1] соединялось с reverse_String и уменьшало значение. A while завершил свою итерацию и перевернул строку в обратном порядке.
С помощью оператора slice([])
Мы также можем перевернуть данную строку, используя расширенный оператор slice. Рассмотрим его применение в следующем примере.
# Reverse a string # using slice syntax # reverse(str) Function to reverse a string def reverse(str): str = str[::-1] return str s = "JavaTpoint" print ("The original string is : ",s) print ("The reversed string using extended slice operator is : ",reverse(s))
('The original string is : ', 'JavaTpoint') ('The reversed string(using extended slice syntax) is : ', 'tniopTavaJ')
Обычно оператор slice принимает три параметра – start, stop и step. Мы предоставили нулевое значение для начального и конечного индексов, что указывает на то, что начальный индекс равен 0, а конечный – n-1 по умолчанию. Размер шага -1 означает, что строка переходит от конца в позицию индекса 1.
Использование обратной функции reversed() с соединением
Python предоставляет функцию reversed() для переворота строки. Рассмотрим следующий пример.
#reverse a string using reversed() # Function to reverse a string def reverse(str): string = "".join(reversed(str)) # reversed() function inside the join() function return string s = "JavaTpoint" print ("The original string is : ",s) print ("The reversed string using reversed() is : ",reverse(s) )
('The original string is : ', 'JavaTpoint') ('The reversed string using reversed() is : ', 'tniopTavaJ')
В теле функции мы объявили пустую строку, разделенную оператором .dot. Строка reversed() вернула обратную строку, которая соединилась с пустой строкой, разделенной с помощью функции join().
Применение рекурсии
Строку также можно перевернуть с помощью рекурсии. Рекурсия – это процесс, в котором функция вызывает сама себя. Рассмотрим следующий пример.
# reverse a string # using recursion def reverse(str): if len(str) == 0: # Checking the lenght of string return str else: return reverse(str[1:]) + str[0] str = "Devansh Sharma" print ("The original string is : ", str) print ("The reversed string(using recursion) is : ", reverse(str))
('The original string is : ', 'JavaTpoint') ('The reversed string(using reversed) is : ', 'tniopTavaJ')
В приведенном выше коде мы определили функцию, которая принимает строку в качестве аргумента.
В теле функции мы определили базовое условие рекурсии: если длина строки равна 0, то строка возвращается, а если нет, то мы вызываем функцию рекурсивно.
5 способов перевернуть строку в Python 3
Создадим функцию 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 и пропустим два других параметра, происходит магия — строка переворачивается:
Конечно, никакой магии здесь нет, мы просто перебираем символы с шагом -1, то есть в обратном порядке.
Заключение
Первый и второй способы как нельзя лучше подходят, если во время переворота строки нужно ее изменять. При этом они значительно уступают 4 и 5 способам в скорости. Читаются умеренно хорошо, поэтому в некоторых случаях их уместно использовать.
Насчет третьего способа много сказать не могу, поскольку не могу придумать ему применение. Такой способ плохо читается и довольно медленный, поэтому я не рекомендую его использовать.
Четвертый способ довольно быстрый, отлично читается и подходит во многих случаях.
Пятый способ — самый быстрый, хорошо читается, очень краткий (6 символов), поэтому его я считаю наиболее предпочтительным.
Сравнительную таблицу скорости некоторых способов вы можете найти по ссылке — https://python-scripts.com/reversed
Если знаете что-либо еще по этой теме, хотите меня поправить или дать идею — пишите в комментариях, я все прочту и приму к сведению. Удачи!