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

Чтобы развернуть строку в Python, можно использовать срез с отрицательным шагом:

str[::-1]

Например, давайте обратим строку "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]

Здесь:

  • iterable – итурируемый объект, например, строка
  • start – индекс начала среза
  • end – индекс конца среза (элемент под этим индексом в срез не входит)
  • step – размер шага среза. Значение по умолчанию равно 1

Все три значения могут быть отрицательными.

Удобной особенностью срезов является то, что значения start/end/step можно не указывать. Если вы не укажете начало среза, он начнется с первого элемента итерируемого объекта. Если не укажете конец – срез закончится последним элементом.

Отрицательный шаг меняет направление среза. Таким образом, нотация string[::-1] означает, что в срез войдут все элементы string, от первого до последнего, но в обратном порядке.

2. Как развернуть строку в цикле

Развернуть строку можно и иначе, например, при помощи цикла for или while. В обоих случаях идея одна и та же:

  1. Инициализация пустой результирующей строки.
  2. Перебор всех символов исходной строки.
  3. Добавление каждого символа в начало результирующей строки

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)

Давайте разберем код, чтобы вы могли лучше понять, что происходит:

  1. Сначала вы преобразуете строку в список символов
  2. Затем вы вызываете метод list.reverse() для символов. Это меняет их порядок следования
  3. Наконец, вы преобразуете перевернутый список символов обратно в строку

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, а также рекурсию. При этом использование среза – самый простой и, к тому же, самый эффективный способ обратить строку.

Спасибо за внимание. Успешного кодинга!

Перевод статьи Artturi Jalli “5 Ways to Reverse a String in Python (Example Program)”.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *