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

Python предоставляет множество полезных функций для работы со строками, например casefold() для приведения к нижнему регистру. Однако встроенной функции, которая бы прямо «переворачивала» строку, нет. В статье рассмотрены два основных простых подхода и дополнительные практические замечания.
Один заголовок — один смысл
Ниже — понятные, короткие примеры и пояснения, когда какой способ выбрать, и что учесть при обработке Unicode.
Срез строки
Оператор среза (slice) извлекает часть строки с помощью трёх значений: start, stop и step. Синтаксис:
string[start:stop:step]Чтобы получить строку в обратном порядке, достаточно указать шаг -1. Если не задавать start и stop, берётся вся строка по умолчанию.
Использование оператора среза для реверса строки
state = "California"
print(state[::-1])
Запуск приведённого кода выведет:
ainrofilaC
Срез — кратко, читается как «всю строку, но в обратном порядке». В CPython этот вариант обычно самый быстрый для простых строк.
Реверс через reversed() и join()
Более читаемая альтернатива — использовать функции reversed() и “”.join() вместе. reversed() возвращает итератор, который перебирает последовательность в обратном порядке. Последующие вызовы join() объединяют элементы обратно в строку.
Пример с reversed()
state = "California"
reversedState = reversed(state)
for i in reversedState:
print(i)
К сожалению, такой цикл выведет каждый символ на новой строке:
a
i
...
C
Использование join()
state = "California"
reversedState = "".join(reversed(state))
print(reversedState)
Вывод будет:
ainrofilaC
reversed() + join() делает явной идею «получаем итератор» и «объединяем», это полезно для читабельности, тестирования и когда нужен итератор (например, ленивый перебор).
Когда выбирать один метод над другим
- Срез (string[::-1])
- Плюсы: коротко, обычно быстрее, идиоматично для простых задач.
- Минусы: может выглядеть непрозрачно для новичков.
- reversed() + “”.join()
- Плюсы: выразительно, легко понять шаги, безопасно в сложных конвейерах обработки.
- Минусы: чуть более затратен по памяти/времени (создаёт промежуточные объекты).
Важно: для большинства практических задач выбор делайте по читаемости и контексту. В критичных по производительности местах измерьте обе реализации.
Unicode, комбинируемые символы и эмодзи
Обратите внимание: строки в Python — это последовательности кодовых точек (code points). Простое обращение порядка кодовых точек может «разрезать» комбинируемые символы (например, буквы с диакритикой) или эмодзи, состоящие из нескольких кодовых точек. В таких случаях результат может выглядеть неверно.
Пример проблемы: буква с комбинируемой диакритикой или сложный эмодзи могут разбиться при обычном реверсе.
Решение: оперировать не кодовыми точками, а графемными кластерами (grapheme clusters). Для этого часто используют стороннюю библиотеку regex (она расширяет возможности обычного re и поддерживает \X — графему).
Пример с библиотекой regex (требуется установка: pip install regex):
try:
import regex as re
except ImportError:
raise SystemExit("Установите пакет 'regex' для корректного реверса графем: pip install regex")
s = "a̐éö̲👍"
parts = re.findall(r"\X", s)
print("".join(reversed(parts)))Этот подход гарантирует, что комбинированные символы и составные эмодзи не будут «порезаны».
Альтернативные подходы и пример через цикл
Если нужно — можно явно реализовать реверс через цикл (например, для обучения или кастомной логики):
def reverse_loop(s):
result = []
for ch in s:
result.insert(0, ch)
return "".join(result)
print(reverse_loop("California"))Этот вариант понятен, но с точки зрения сложности и производительности не оптимален (insert(0, ch) в списке стоит дорого). Лучше собирать в список и затем reverse() или использовать append + reversed.
Сравнение методов
| Метод | Читаемость | Скорость (общее правило) | Поддержка Unicode графем |
|---|---|---|---|
| s[::-1] | Коротко, средняя | Обычно быстрее | Плохо (работает на кодовых точках) |
| “”.join(reversed(s)) | Хорошо | Чуть медленнее | Плохо (работает на кодовых точках) |
| regex \X + join | Понятно | Зависит от библиотеки | Хорошо (работает с графемами) |
| Явный цикл | Понятно новичку | Чаще всего медленнее | Плохо/зависит от реализации |
Критерии приёмки
- Вход: произвольная строка s.
- Ожидаемый базовый результат: символы в обратном порядке для обычных ASCII/латинских строк.
- Дополнительный критерий: для мультиязычных строк с комбинируемыми символами — корректность зависит от выбранного метода (требуется тест с графемами при необходимости).
Примеры тестовых случаев:
- “abc” -> “cba”
- “A” -> “A”
- “á” (буква + combining acute) -> сохраняет комбинированный символ как единый элемент при использовании regex \X
- “👍🏻👍” -> корректный реверс при графемной обработке
Чеклист для разработчика и ревьюера
- Нужен ли реверс на уровне кодовых точек или графем?
- Есть ли требования по памяти/производительности?
- Написаны ли тесты для эмодзи и комбинируемых символов?
- Документирован ли выбранный метод для будущих читающих код?
Краткие рекомендации
- Для простых строк используйте s[::-1].
- Если важна читабельность и вы работаете с пайплайнами — используйте “”.join(reversed(s)).
- Если строка может содержать сложные графемы или эмодзи — применяйте подход с regex \X или специализированными библиотеками для обработки графем.
Итог
Существует два основных простых способа реверса строки в Python: срез с шагом -1 и reversed() + join(). Оба подходят для большинства задач. Если важно корректно обрабатывать комбинированные символы и эмодзи, используйте графемную обработку через библиотеку regex или специализированные инструменты.
Ключевые выводы:
- s[::-1] — кратко и быстро для обычных строк.
- “”.join(reversed(s)) — более явный и читаемый вариант.
- Для Unicode-графем используйте regex и \X.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone