Python chr(): как получить символ по его коду
Функция chr() в Python принимает целое число и возвращает строку из одного символа, чей номер в таблице Unicode равен этому числу. Ниже разобраны допустимый диапазон, коды латиницы и кириллицы, обратная функция ord(), генерация алфавита, простой шифр и ошибки, которые возникают при неверном аргументе.

Содержание статьи
Синтаксис и допустимые значения
У функции один обязательный аргумент - целое число, номер символа (кодовая точка Unicode). Результат всегда строка длиной 1.
chr(i)
print(chr(97)) # a
print(chr(65)) # A
print(chr(1200)) # Ұ (казахская буква)
print(chr(8364)) # €Допустимый диапазон от 0 до 1 114 111 включительно, в шестнадцатеричной записи от 0x0 до 0x10FFFF. Это весь кодовый простор Unicode, поэтому chr() умеет вернуть любой символ: латинскую или греческую букву, иероглиф, математический знак, эмодзи. Число можно записывать в любой системе счисления, например chr(0x41) тоже вернет 'A'.
Первые 128 кодов совпадают с таблицей ASCII. Числа от 0 до 31 и 127 соответствуют управляющим символам, которые не печатаются, например chr(10) - перевод строки '\n', chr(9) - табуляция.
Коды часто нужных символов
Держать в голове всю таблицу не нужно, но несколько опорных значений помогают быстро писать и проверять код.
| Символы | Коды | Шестнадцатеричные |
|---|---|---|
| цифры 0-9 | 48-57 | 0x30-0x39 |
| латиница A-Z | 65-90 | 0x41-0x5A |
| латиница a-z | 97-122 | 0x61-0x7A |
| кириллица А-Я | 1040-1071 | 0x410-0x42F |
| кириллица а-я | 1072-1103 | 0x430-0x44F |
| Ё и ё | 1025 и 1105 | 0x401 и 0x451 |
| пробел | 32 | 0x20 |
Обратите внимание на строки с буквой ё: она лежит отдельно от основного блока кириллицы. Это частая причина ошибок в программах, которые перебирают русский алфавит по кодам. Разница между строчной и заглавной латинской буквой ровно 32, а у основной кириллицы тоже 32.
Пара chr() и ord()
Функция ord() делает обратное преобразование: принимает строку из одного символа и возвращает его код. Вместе они позволяют выполнять арифметику над символами.
print(ord('А')) # 1040
print(chr(ord('А'))) # А
print(chr(ord('a') + 1)) # b - следующая буква
print(chr(ord('a') - 32)) # A - заглавная через сдвиг кода
print(ord('7') - ord('0')) # 7 - цифра из символаПреобразование регистра сдвигом кода годится для учебных задач, но в реальном коде используют методы upper() и lower(): они правильно обрабатывают букву ё и символы других языков. Подробнее о методах строк читайте в разделе работа со строками.
Генерация алфавита
С помощью chr() и range() алфавит получается одной строкой. Для латиницы проще взять готовые константы string.ascii_lowercase и string.ascii_uppercase, а для кириллицы готовой константы нет.
ru = ''.join(chr(c) for c in range(ord('а'), ord('я') + 1))
print(ru) # абвгдежзийклмнопрстуфхцчшщъыьэюя
print(len(ru)) # 32: без буквы ё
ru_full = ru[:6] + 'ё' + ru[6:]
print(len(ru_full)) # 33Так как ё не входит в диапазон, ее приходится вставлять вручную после буквы е. Без этого шага программа проверки слов или подсчета букв будет терять все слова с ё.
Шифр Цезаря на chr() и ord()
Классическая учебная задача: сдвинуть каждую букву на k позиций по алфавиту, а после z продолжить с начала. Номер буквы в алфавите получают вычитанием кода первой буквы, сдвиг по кругу делает остаток от деления.
def caesar(text, k):
result = []
for ch in text:
if 'a' <= ch <= 'z':
pos = (ord(ch) - ord('a') + k) % 26
result.append(chr(pos + ord('a')))
else:
result.append(ch)
return ''.join(result)
secret = caesar('hello, world', 3)
print(secret) # khoor, zruog
print(caesar(secret, -3)) # hello, worldЗнаки препинания и пробелы проходят без изменений. Для расшифровки достаточно вызвать функцию с отрицательным сдвигом. Похожие упражнения собраны в разделе задачи на строки.
Ошибки при вызове chr()
Функция строго проверяет аргумент, и неправильный вызов сразу заканчивается исключением.
chr(-1)илиchr(1114112)-ValueError: chr() arg not in range(0x110000), число за пределами Unicode.chr(65.0)-TypeError: 'float' object cannot be interpreted as an integer, дробное число не подходит даже с нулевой дробной частью.chr('65')- та же ошибкаTypeErrorдля строки, сначала нужно преобразовать ее черезint().
Еще одна частая проблема не связана с самой функцией: символ создается без ошибок, но при выводе в консоль Windows с кодировкой cp1251 появляется UnicodeEncodeError. Помогает запуск с переменной окружения PYTHONIOENCODING=utf-8 или режим UTF-8 (python -X utf8). Причины таких ошибок разбирает статья о кодировке строк.
chr() или escape-последовательность
Если код символа известен заранее, его можно записать прямо в строковом литерале. Функция chr() нужна тогда, когда код вычисляется во время работы программы.
print('\u0041') # A, четыре hex-цифры
print('\U0001F600' == chr(0x1F600)) # True
print('\N{EURO SIGN}') # €, по имени символа
print(chr(0x2116)) # №Шестнадцатеричную запись кода для escape-последовательности удобно получить функцией hex(): hex(ord('№')) вернет '0x2116'. Полное описание функции есть в документации Python.
Частые вопросы
Короткие ответы на вопросы о функции chr().
Чем chr() отличается от ord()?
chr() превращает число в символ, ord() превращает символ в число. Они взаимно обратны: chr(ord(c)) == c для любого символа.
Как получить символ по коду ASCII?
Так же, через chr(): коды ASCII от 0 до 127 совпадают с первыми кодами Unicode. Отдельной функции для ASCII в Python 3 нет, а функция unichr() осталась только во второй версии языка.
Как вывести все символы в диапазоне кодов?
Переберите диапазон и соберите строку: ''.join(chr(i) for i in range(start, end + 1)). Для управляющих кодов ниже 32 удобнее выводить repr(chr(i)), иначе они не будут видны.
Почему chr() возвращает квадратик вместо символа?
Python вернул правильный символ, но шрифт консоли или редактора не содержит его изображения. Проверьте результат через ord() или выведите его в программе с другим шрифтом.