- 5 способов развернуть строку в Python
- Как развернуть строку в Python
- 1. Разворот строки при помощи среза с отрицательным индексом
- 2. Как развернуть строку в цикле
- 2.1. Разворот строки при помощи цикла for
- 2.2. Разворот строки при помощи цикла while
- 3. Как развернуть строку при помощи reversed() и str.join()
- 4. Разворот строки при помощи list.reverse()
- 5. Как развернуть строку при помощи рекурсии
- Сравнение производительности
- Заключение
- 5 способов перевернуть строку в Python 3
- 2. Использование цикла со списком в результате
- 3. Рекурсия
- 4. Использование встроенной функции
- 5. Срез строки
- Заключение
5 способов развернуть строку в Python
Чтобы развернуть строку в Python, можно использовать срез с отрицательным шагом:
Например, давайте обратим строку «Testing» :
s = "Testing" # Используем отрицательный шаг для разворота строки rev = s[::-1] print(rev) # Результат: # gnitseT
В этой статье мы рассмотрим пять способов развернуть строку в Python. Но имейте в виду, что приведенный выше пример – наилучший. Остальные методы полезны скорее для оттачивания навыков работы с Python.
Как развернуть строку в Python
Итак, давайте разберем подробнее наш первый способ разворота строки, а затем еще четыре. Только помните, что срез с отрицательным индексом – это самый короткий и наиболее питоничный подход. Используйте его, если только обстоятельства не вынуждают вас воспользоваться другим способом.
1. Разворот строки при помощи среза с отрицательным индексом
Самый быстрый и простой способ развернуть строку в Python – использовать срез с отрицательным индексом [::-1]. Вот функция, которая разворачивает строку с помощью среза:
def reverse_slicing(s): return s[::-1]
Давайте рассмотрим подробнее, как работает эта функция.
Срезы позволяют получить доступ к элементам итерируемых объектов. Например, с помощью среза можно получить 5 первых значений списка или последние 10 символов строки. Синтаксис среза:
- iterable – итурируемый объект, например, строка
- start – индекс начала среза
- end – индекс конца среза (элемент под этим индексом в срез не входит)
- step – размер шага среза. Значение по умолчанию равно 1
Все три значения могут быть отрицательными.
Удобной особенностью срезов является то, что значения start/end/step можно не указывать. Если вы не укажете начало среза, он начнется с первого элемента итерируемого объекта. Если не укажете конец – срез закончится последним элементом.
Отрицательный шаг меняет направление среза. Таким образом, нотация string[::-1] означает, что в срез войдут все элементы string , от первого до последнего, но в обратном порядке.
2. Как развернуть строку в цикле
Развернуть строку можно и иначе, например, при помощи цикла for или while . В обоих случаях идея одна и та же:
- Инициализация пустой результирующей строки.
- Перебор всех символов исходной строки.
- Добавление каждого символа в начало результирующей строки
2.1. Разворот строки при помощи цикла for
Вот функция, которая разворачивает строку с использованием цикла for :
def reverse_for_loop(s): s1 = "" for c in s: s1 = c + s1 return s1
2.2. Разворот строки при помощи цикла while
Вот функция, которая для реверсирования строки использует цикл while :
def reverse_while_loop(s): s1 = "" l = len(s) - 1 while l >= 0: s1 += s[l] l -= 1 return s1
3. Как развернуть строку при помощи reversed() и str.join()
В Python есть встроенная функция reversed() , которую можно вызывать для итерируемых объектов, таких как строки или списки. Чтобы развернуть строку, необходимо скомбинировать этот метод с методом str.join() .
Вот функция, которая вызывает функцию reversed() в сочетании с методом .join() :
def reverse_with_join(s): return "".join(reversed(s))
Функция reversed() принимает строку и возвращает специальный объект reversed , который хранит символы в обратном порядке. Обратите внимание, что в результате получается не строка, а объект-итератор.
Чтобы преобразовать перевернутые символы в строку, можно вызвать метод str.join() , используя в качестве разделителя пустую строку. Метод join() берет символы из объекта reversed и объединяет их в строку, которая является перевернутой версией исходной строки.
4. Разворот строки при помощи list.reverse()
Еще один способ развернуть строку – преобразовать ее в список символов, развернуть список и снова преобразовать его в строку.
Вот функция, которая для разворота строки использует метод list.reverse() :
def reverse_with_list(s): s_as_list = list(s) s_as_list.reverse() return "".join(s_as_list)
Давайте разберем код, чтобы вы могли лучше понять, что происходит:
- Сначала вы преобразуете строку в список символов
- Затем вы вызываете метод list.reverse() для символов. Это меняет их порядок следования
- Наконец, вы преобразуете перевернутый список символов обратно в строку
5. Как развернуть строку при помощи рекурсии
И, наконец, можно отработать навыки рекурсии, перевернув строку с помощью рекурсивной функции (функции, которая вызывает сама себя).
Вот пример реализации функции, которая рекурсивно переворачивает строку:
def reverse_recursively(s): if len(s) == 0: return s else: return reverse_recursively(s[1:]) + s[0]
Идея этой функции очень похожа на подход цикла while , который вы видели ранее. Кроме того, в ней используется срез для доступа ко всем буквам строки, кроме первой.
Сравнение производительности
Вот сравнение производительности вышеуказанных методов для разворота строк в Python.
Чтобы повторить тесты производительности в вашей системе:
- Создайте файл Python с именем reverse_strings.py
- Скопируйте и вставьте в этот файл все методы реверсирования строк
- Откройте окно командной строки или терминал
- Запустите приведенные ниже команды терминала, чтобы посмотреть время выполнения
$ python3 -m timeit --number 100000 --unit usec 'import reverse_strings' 'reverse_strings.reverse_slicing("This is just a tests")' 100000 loops, best of 5: 0.377 usec per loop $ python3 -m timeit --number 100000 --unit usec 'import reverse_strings' 'reverse_strings.reverse_for_loop("This is just a tests")' 100000 loops, best of 5: 1.84 usec per loop $ python3 -m timeit --number 100000 --unit usec 'import reverse_strings' 'reverse_strings.reverse_while_loop("This is just a tests")' 100000 loops, best of 5: 2.94 usec per loop $ python3 -m timeit --number 100000 --unit usec 'import reverse_strings' 'reverse_strings.reverse_with_join("This is just a tests")' 100000 loops, best of 5: 1.01 usec per loop $ python3 -m timeit --number 100000 --unit usec 'import reverse_strings' 'reverse_strings.reverse_with_list("This is just a tests")' 100000 loops, best of 5: 0.87 usec per loop $ python3 -m timeit --number 100000 --unit usec 'import reverse_strings' 'reverse_strings.reverse_recursively("This is just a tests")' 100000 loops, best of 5: 6.29 usec per loop
Как видите, проще всего развернуть строку с помощью среза с отрицательным шагом ( str[::-1] ).
Заключение
Сегодня вы узнали, как развернуть строку в Python. Для этого можно использовать срез с отрицательным шагом (предпочтительный метод), циклы for и while, конвертацию строки в список и обратно, встроенные функции Python, а также рекурсию. При этом использование среза – самый простой и, к тому же, самый эффективный способ обратить строку.
Спасибо за внимание. Успешного кодинга!
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
Если знаете что-либо еще по этой теме, хотите меня поправить или дать идею — пишите в комментариях, я все прочту и приму к сведению. Удачи!