Гид по технологиям

Как перевернуть строку в Python

3 min read Python Обновлено 15 Nov 2025
Перевернуть строку в Python — 2 простых способа
Перевернуть строку в Python — 2 простых способа

Человек, держащий книгу по Python

Python предоставляет множество удобных функций для работы со строками, например casefold() для приведения к нижнему регистру. Функции, которая бы прямо называлась «перевернуть строку», в стандартной библиотеке нет. Тем не менее, есть два простых и понятных способа получить обратную строку. Выбор зависит от предпочтений, читаемости кода и требований к корректной обработке Unicode.

Срез строки

Оператор среза служит для извлечения части последовательности. Он использует три значения: start, stop и step. Общий синтаксис:

string[start:stop:step]

Чтобы получить строку в обратном порядке, укажите шаг step = -1. Если опустить start и stop, вернётся вся строка в обратном порядке.

Пример: срез для реверса

state = "California"
print(state[::-1])

Вывод:

ainrofilaC

Преимущества: коротко и часто быстрее. Недостаток: при работе с комбинациями символов (например, буква + диакритический знак) или составными эмодзи визуальный порядок может быть нарушен.

reversed() + join()

Другой ясный и часто более «читаемый» вариант — использовать reversed(), который возвращает итератор в обратном порядке, и затем собрать результат с помощью join().

Пример: поэлементный вывод reversed()

state = "California"
reversedState = reversed(state)
for ch in reversedState:
    print(ch)

Вывод (символы печатаются построчно):

a
i
n
r
o
f
i
l
a
C

Пример: собрать строку через join()

state = "California"
reversedState = "".join(reversed(state))
print(reversedState)

Вывод:

ainrofilaC

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

Альтернативы и дополнительные варианты

  • Обычный цикл: собрать символы в список и затем ‘’.join(list) — работает, но длиннее.
  • list(reversed(s)) + ‘’.join(…) — эквивалентно предыдущему, но создаёт явный список.
  • Для байтовых данных можно использовать slicing или bytearray.

Когда эти методы дают неверный визуальный результат

Один из распространённых трипов — Unicode и “графемы”. Строка может содержать комбинирующие знаки (буква + акцент) или сложные эмодзи, которые визуально представляют собой один символ, но состоят из нескольких кодовых точек. Простейшие методы (срез и reversed) работают по кодовым точкам и могут нарушить визуальную целостность.

Пример с комбинирующим знаком и флагом

# Пример, где простой реверс будет неверным с точки зрения визуала
s = "á🇺🇸"  # 'a' + комбинирующий акцент, затем флаг (составной эмодзи)
print(s[::-1])          # может сломать порядок графем
print("".join(reversed(s)))

Чтобы корректно инвертировать такие строки, разбейте строку на графемы (графемные кластеры) и разверните их:

import regex
s = "á🇺🇸"
graphemes = regex.findall(r"\X", s)
reversed_s = "".join(reversed(graphemes))
print(reversed_s)

Замечание: модуль regex — внешняя библиотека (PyPI). Она поддерживает паттерн \X для графем и часто используется, когда важен визуально корректный порядок символов.

Производительность и читаемость

  • Срез (slice[::-1]) обычно самый компактный вариант и в большинстве случаев — быстрый и простой.
  • reversed()+join() чуть более явный по смыслу; в небольших скриптах читаемость может быть важнее микроскорости.
  • Для критичных по скорости участков измеряйте реальные показатели на ваших данных (timeit/profiler).

Important: не придумывайте профилировочные числа — реальная производительность зависит от размера строк и особенностей Python-реализации (CPython, PyPy и т. д.).

Критерии приёмки

Проверьте функцию реверса по этим тестам:

  • Простой ASCII: “hello” -> “olleh”.
  • Пустая строка: “” -> “”.
  • Однобайтовые символы и смешанные: “abc123” -> “321cba”.
  • Комбинирующие акценты: “á” (a + ´) — ожидается целостный символ после реверса, если требуется визуальная корректность.
  • Сложные эмодзи и флаги: корректность достигается только при работе с графемами.

Примеры функций

Короткая функция через срез:

def reverse_simple(s: str) -> str:
    return s[::-1]

Функция с поддержкой графем (нужен пакет regex):

import regex

def reverse_grapheme(s: str) -> str:
    graphemes = regex.findall(r"\X", s)
    return "".join(reversed(graphemes))

Краткая сводка

  • Для большинства задач используйте s[::-1] — коротко и быстро.
  • Если важна корректность для Unicode-графем (эмодзи, комбинирующие знаки), разбивайте на графемы и реверсируйте их.
  • Для чтения кода и явного намерения подойдёт reversed() + join().

Notes: при работе с международными данными заранее продумайте требования к визуальной целостности и протестируйте на реальных примерах.

1-line glossary:

  • Графема — единица восприятия символа пользователем (может состоять из нескольких кодовых точек).
  • Кодовая точка — числовой идентификатор символа в Unicode.

Конец статьи.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство