Тип char – это тип данных, служащий для хранения одиночных символов в различных кодировках.
Он широко используется в более низкоуровневых языках программирования, таких как C. Даже строки там являются массивами, состоящими из элементов типа char.
В Python нет отдельного типа для символов. Даже если присвоить переменной значение ‘а’, она будет иметь строковый тип.
Альтернатива char в Python 3
Разработчики языка решили, что нет необходимости выделять под отдельные символы целый тип. На то есть несколько причин:
- Строковый тип предоставляет программисту весь нужный функционал для работы как со строками, так и с символами.
- Python – язык с динамической типизацией, разделение на строковый и символьный тип добавило бы дополнительных проблем с реализацией автоматического определения типов.
Поэтому как бы программист ни пытался, переменные будут иметь строковый тип:
-
s = 'a' print(type(s)) <class 'str'>
-
s = 'Hello' s = s[0] # Присваиваем переменной элемент 'H' print(type(s)) <class 'str'>
Любой символ в Python является единичной строкой, что позволяет использовать для работы с ним те же функции, что и для строк.
Строка — это неизменяемая последовательность, а так как символ тоже строка, то при попытке изменить его, возбудится исключение:
s = 'О' s[0] = 'А' # Исключение TypeError
Функции
Несмотря на объединение двух типов, язык программирования Python 3 имеет функции для работы именно с символами.
Каждый элемент строки — закодированная последовательность битов. В Python символы могут быть представлены в виде целого числа int. Для работы с их обычным и числовым представлением используют встроенные функции ord()
и chr()
.
ord()
Функция возвращает числовое представление символа, переданного в качестве аргумента. То есть с её помощью в Python можно определить код символа (аналогичная функция есть и в C для приведения char к int), например:
ord('~')
результат: 126ord('¾')
результат: 190
Функция работает, только если в качестве аргумента передан один символ, при попытке передать строку возбудится исключение TypeError. С её помощью можно получить числовое представление любого символа кодировки Юникод.
chr()
Функция возвращает символ, соответствующий его числовому представлению, которое передается в качестве аргумента:
chr(126)
результат: ~chr(190)
результат: ¾chr(11141112)
исключение ValueError
Экранирование
Экранированные символы — это специальные символы после обратной косой черты «\», выполняющие определенные действия и преобразования.
Экранированная последовательность | Функция |
\n | Переход на новую строку |
\t | Табуляция |
\r | Возврат каретки в начало строки |
\x | Числа в шестнадцатеричном представлении |
\o | Числа в восьмеричном представлении |
\0 | Нулевой символ |
\’ | Апостроф |
\» | Двойная кавычка |
\\ | Обратный слэш |
Экранированные символы также называются escape-последовательностями, с их помощью можно, например, форматировать строки —
s = "Привет,\n\"Сергей\"" print(s) #Выведет: Привет, "Сергей"
Подавление экранирования
Иногда программисту нужно, чтобы обратный слеш не превращал элементы в escape-последовательности, например, при работе с путями к файлам. Для этого необходимо использовать сразу две косых черты: «C:\\Users\\Public».
Когда программист хочет использовать обратный слеш для вывода, но не подавляет экранирование, в некоторых случаях даже возбуждается исключение. В следующем примере есть синтаксическая ошибка из-за того, что с «\U» начинается записть 32-битного символа Юникода (с «\u» — 16-битного). После него должна быть последовательность из 8 цифр, поэтому возникла ошибка:
s = "C:\Users\Public" SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
Чтобы избежать этого, используют приём подавления экранирования:
s = r"C:\Users\Public" print(s) C:\Users\Public
Подавить экранирование можно с помощью «r», который ставится перед началом строки (до кавычек). На самом деле интерпретатор, видя перед строкой «r», автоматически дублирует каждый символ обратного слеша. Если использовать это в интерактивном режиме, мы увидим:
>>> s = r"C:\Users\Public" >>> s 'C:\\Users\\Public'
Решить эту проблему можно несколькими способами:
- Дублировать символы экранирования вручную.
- Использовать конкатенацию:
s = r"Привет,\nмир" + "\\"
.