Строка состоит из символов, но компьютер хранит каждый символ как числовой код. Python позволяет переходить от символа к коду и обратно с помощью двух встроенных функций:
ord()— символ → число;chr()— число → символ.
Эти функции пригодятся, когда символ нужно изменить по математическому правилу: например, сдвинуть букву на несколько позиций.
🔢 Как работает ord()
ord() принимает ровно один символ и возвращает его числовой код:
print(ord("A")) # 65
print(ord("B")) # 66
print(ord("a")) # 97
print(ord(" ")) # 32
Заглавные и строчные буквы имеют разные коды. Поэтому диапазоны A–Z и a–z при преобразовании обычно обрабатывают отдельно.
Если передать строку длиннее одного символа, Python выдаст TypeError:
ord("AUTH") # ошибка: нужен один символ
🔤 Как работает chr()
chr() выполняет обратное преобразование — принимает числовой код и возвращает символ:
print(chr(65)) # A
print(chr(66)) # B
print(chr(97)) # a
Функции можно соединить:
letter = "C"
code = ord(letter)
restored_letter = chr(code)
print(code) # 67
print(restored_letter) # C
➡️ Сдвиг одной буквы
Чтобы получить следующую заглавную букву, можно увеличить код на 1:
letter = "C"
shifted = chr(ord(letter) + 1)
print(shifted) # D
Для сдвига на три позиции прибавляем 3:
letter = "C"
shift = 3
shifted = chr(ord(letter) + shift)
print(shifted) # F
Но простое сложение ломается в конце алфавита: после Z находится уже не A. Значит, сдвиг должен быть циклическим.
🔄 Зачем нужен % 26
В английском алфавите 26 букв. Остаток от деления % 26 удерживает позицию в диапазоне от 0 до 25:
print(25 % 26) # 25
print(26 % 26) # 0
print(27 % 26) # 1
После последней позиции мы снова оказываемся в начале. Поэтому Z со сдвигом 1 превращается в A.
Для заглавной буквы преобразование состоит из четырёх действий:
- вычесть код
Aи получить позицию0–25; - прибавить сдвиг;
- применить
% 26; - вернуть код
Aи преобразовать число черезchr().
letter = "Z"
shift = 1
base = ord("A")
position = ord(letter) - base
new_position = (position + shift) % 26
shifted = chr(base + new_position)
print(shifted) # A
Для строчных букв правило такое же, но базой становится ord("a").
✅ Как определить регистр
Символ можно проверить сравнением:
symbol = "G"
if "A" <= symbol <= "Z":
print("Заглавная латинская буква")
elif "a" <= symbol <= "z":
print("Строчная латинская буква")
else:
print("Другой символ")
Пробелы, цифры и знаки препинания обычно оставляют без изменений.
🔐 Как из этого получается шифр Цезаря
Шифр Цезаря проходит по тексту и сдвигает каждую букву на одинаковое число позиций. Например, при сдвиге 3:
A → D
C → F
X → A
Общий маршрут обработки строки:
- создать пустую строку результата;
- перебрать исходный текст циклом
for; - определить тип текущего символа;
- сдвинуть заглавную или строчную букву относительно своей базы;
- остальные символы добавить без изменений;
- вернуть результат после завершения цикла.
Небольшая проверка преобразования одной буквы:
symbol = "X"
shift = 3
base = ord("A")
shifted = chr((ord(symbol) - base + shift) % 26 + base)
print(shifted) # A
Для расшифровки используется то же правило с отрицательным сдвигом. Если текст зашифровали со сдвигом 3, восстановить его можно со сдвигом -3.
Шифр Цезаря подходит для изучения строк и алгоритмов, но не защищает настоящие пароли, токены и другие секретные данные.
⚠️ Частые ошибки
ord() получает целую строку
Обрабатывай текст циклом и передавай в ord() один текущий символ.
Один базовый код для двух регистров
Для A–Z используй ord("A"), для a–z — ord("a").
return находится внутри цикла
Тогда функция завершится после первой буквы. Возвращай результат после цикла.
Пробелы исчезают
Добавляй символ без изменений в ветке else.
🎯 Итог
ord(symbol)превращает один символ в число;chr(code)превращает число обратно в символ;% 26зацикливает позицию внутри английского алфавита;- заглавные и строчные буквы обрабатываются относительно разных баз;
- шифр Цезаря применяет одинаковый циклический сдвиг к каждой букве строки.
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!