Символы в языке Python
Тип char – это тип данных, служащий для хранения одиночных символов в различных кодировках.
Он широко используется в более низкоуровневых языках программирования, таких как C. Даже строки там являются массивами, состоящими из элементов типа char.
В Python нет отдельного типа для символов. Даже если присвоить переменной значение ‘а’, она будет иметь строковый тип.
Альтернатива char в Python 3
Разработчики языка решили, что нет необходимости выделять под отдельные символы целый тип. На то есть несколько причин:
- Строковый тип предоставляет программисту весь нужный функционал для работы как со строками, так и с символами.
- Python – язык с динамической типизацией, разделение на строковый и символьный тип добавило бы дополнительных проблем с реализацией автоматического определения типов.
Поэтому как бы программист ни пытался, переменные будут иметь строковый тип:
s = ‘a’ print(type(s))
s = ‘Hello’ s = s[0] # Присваиваем переменной элемент ‘H’ print(type(s))
Любой символ в Python является единичной строкой, что позволяет использовать для работы с ним те же функции, что и для строк.
Строка — это неизменяемая последовательность, а так как символ тоже строка, то при попытке изменить его, возбудится исключение:
s = 'О' s[0] = 'А' # Исключение TypeError
Чтобы изменить символ, его необходимо заново присвоить переменной.
Функции
Несмотря на объединение двух типов, язык программирования Python 3 имеет функции для работы именно с символами.
Каждый элемент строки — закодированная последовательность битов. В Python символы могут быть представлены в виде целого числа int. Для работы с их обычным и числовым представлением используют встроенные функции ord() и chr() .
ord()
Функция возвращает числовое представление символа, переданного в качестве аргумента. То есть с её помощью в Python можно определить код символа (аналогичная функция есть и в C для приведения char к int), например:
- ord(‘~’)
результат: 126 - ord(‘¾’)
результат: 190
Функция работает, только если в качестве аргумента передан один символ, при попытке передать строку возбудится исключение TypeError. С её помощью можно получить числовое представление любого символа кодировки Юникод.
chr()
Функция возвращает символ, соответствующий его числовому представлению, которое передается в качестве аргумента:
- chr(126)
результат: ~ - chr(190)
результат: ¾ - chr(11141112)
исключение ValueError
В качестве аргумента можно передать любое целое неотрицательное число вплоть до 1114111. В противном случае возбудится исключение ValueError.
По сути ord() и chr() — это две взаимно обратные функции, которые чаще всего используются вместе.
Экранирование
Экранированные символы — это специальные символы после обратной косой черты «\», выполняющие определенные действия и преобразования.
| Экранированная последовательность | Функция |
| \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'
Строка, в которой подавляется экранирование, не может оканчиваться символом обратного слеша. В противном случае интерпретатор возбудит исключение SyntaxError.
Решить эту проблему можно несколькими способами:
- Дублировать символы экранирования вручную.
- Использовать конкатенацию: s = r»Привет,\nмир» + «\\» .
Что значит символ @ в python?
Переведу ответ с enSO на который указали в комментариях, раз уж подняли вопрос с 18 года. Оригинал ответа плюс добавил ссылки на русском. К сожалению их не так много как хотелось бы.
Символ @ в начале строки используется для декораторов классов, функций и методов.
Документация для детального ознакомления:
Объяснения и примеры:
Наиболее распространенные декораторы, с которыми вы столкнетесь:
Оффтопик, но об этом заходила речь в комментариях, и так же содержится данная информация в оригинальном ответе.
Если знак @ находится в середине строки, то это может означать произведение матриц. Доступные методы — matmul, rmatmul, imatmul
Документация:
UPD (26.05.2021)
Полезно так же будет добавить описание с Wiki (приведен пример для декоратора функции):
Декораторы функций — вызываемые объекты, которые принимают другую функцию в качестве аргумента. Декораторы функций могут производить операции с функцией и возвращают либо саму функцию, либо другую заменяющую её функцию или вызываемый объект. То есть, если в коде ранее был прописан декоратор, названный decorate , то следующий код:
@decorate def target(): print('running target()')
def target(): print(running target()) target = decorate(target)
Пример использования декоратора функции:
>>> def deco(func): . def inner(): . print('running inner()') . return inner … >>> @deco . def target(): . print('running target()') >>> target() running inner() >>> target .inner at 0.10063b598>
Что означает символ в python
Напишите программу, которые выводит исторические кириллические символы, начиная с омеги и заканчивая коппой.
Ѡ Ѣ Ѥ Ѧ Ѩ Ѫ Ѭ Ѯ Ѱ Ѳ Ѵ Ѷ Ѹ Ѻ Ѽ Ѿ Ҁ
С: Следующий символ
D: Символы в заданном интервале
Выведите подряд, без пробелов, все символы, лежащие в таблице ASCII между двумя заданными символами.
ABCD
0123456789
E: isdigit
Для данного символа проверьте, является ли он цифрой.
Решение оформите в виде функции isdigit(c: str) -> bool .
На проверку сдайте только тело функции.
isdigit('0')
True
isdigit('A')
False
Для тех, кто решил эту задачу. У строк в языке Python есть метод isdigit() , то есть использовать его нужно так: s.isdigit() . Если длина строки больше 1, то метод возвращает True , если все символы строки являются цифрами.
Помимо этого есть методы isalpha , isupper , islower , проверяющие, является ли символ буквой, заглавной буквой, строчной буквой. Об этих и других методах можно прочитать в документации.
F: upper
Напишите функцию upper(c: str) -> str , которая переводит символ в верхний регистр, то есть для строчной буквы латинского алфавита возвращает сооветствующую заглавную букву латинского алфавита, а для остальных символов возвращает тот же символ.
upper('f')
upper('F')
upper('4')
G: lower
Напишите функцию lower(s: str) -> str , которая переводит все символы данной строки в нижний регистр.
lower('Hello, world!')
'hello, world!'
Для тех, кто решил эту задачу. У строк в языке Python есть методы upper() и lower() , аналогичные данным. Об этих и других методах можно прочитать в документации.
H: Палиндром
Дано слово, состоящее только из заглавных и строчных латинских букв. Проверьте, верно ли что это слово читается одинаково как справа налево, так и слева направо (то есть является палиндромом), если считать заглавные и строчные буквы не различающимися.
is_palindrome('Radar')
True
is_palindrome('True')
False
I: Значение выражения — 1
Дана непустая строка, состоящая из \(n\) цифр (т.е. однозначных чисел), между которыми стоит \(n-1\) знак операции, каждый из которых может быть либо +, либо -. Вычислите значение данного выражения.
Решение оформите в виде функции evaluate(s: str) -> int , получающей в качестве аргумента строку и возвращающую ее значение.
evaluate('1+2-3')
J: Значение выражения — 2
Дано выражение одно из следующих видов: \(A+B\), \(A-B\) или \(A\ast B\), где \(A\) и \(B\) — целые неотрицательные числа. Определите значение этого выражения.
Решение оформите в виде функции evaluate(s: str) -> int , получающей в качестве аргумента строку и возвращающую ее значение.
evaluate('2*2')
evaluate('100-101')
K: Количество слов
Дана строка, возможно, содержащая пробелы. Определите количество слов в этой строке. Слово — это несколько подряд идущих букв латинского алфавита (как заглавных, так и строчных).
Решение оформите в виде функции count_words(s: str) -> int , возвращающее значение типа int .
count_words('Yesterday, all my troubles seemed so far away')
L: Самое длинное слово
Дана строка. Найдите в этой строке самое длинное слово и выведите его. Если в строке несколько слов одинаковой максимальной длины, выведите первое из них. Решение оформите в виде функции longest_word(s: str) -> str , возвращающей значение типа str . Если в строке нет ни одной буквы, функция возвращает пустую строку.
longest_word('In a hole in the ground there lived a hobbit.')
'ground'
M: Слова с прописной буквы
Дана строка. Измените регистр символов в этой строке так, чтобы первая буква каждого слова была заглавной, а остальные буквы — строчными.
Решение оформите в виде функции capitalize(s: str) -> str .
capitalize('In a hole in the ground there lived a hobbit.')
'In A Hole In The Ground There Lived A Hobbit.'
N: Максимальная буква
Дана строка. Определите максимальную букву, которая встречается в этой строке, при этом заглавные и строчные буквы нужно считать одинаковыми. Под буквой подразумеваются как русские, так и английские буквы, строка может содержать русские и английские буквы.
При решении задачи вам понадобятся методы строк, упомянутые раньше:
s.isalpha() — возвращает True или False , в зависимости от того, является ли символ буквой (все символы строки, если их несколько).
s.upper() — возвращает значение строки, переведённой в верхний регистр.
s.lower() — возвращает значение строки, переведённой в нижний регистр.
Решение оформите в виде функции max_char(s: str) -> str . Функция должна возвращать максимальную букву в верхнем регистре.
Если в данной строке нет символов, являющихся буквами, функция возвращает пустую строку.
max_char('Встретив двусмысленность, отбрось искушение угадать.')
O: Частота появления букв
Дана программа, которая может содержать ASCII-символы и русские буквы. Посчитайте, сколько раз в этой строке встречается каждый возможный символ. Выведите все встречающиеся в этой строке символы в порядке возрастания их кодов, а затем количество вхождений этого символа. Пробелы при этом игнорируйте (считаются только символы, чьи коды больше 32).
Задача должна решаться за однократный проход по данной строке. Для этого создайте список count , в котором значение count[i] будет равно количеству вхождений символа chr(i) в данную строку.
Встретив двусмысленность, отбрось искушение угадать.
, 1 . 1 В 1 а 2 б 1 в 2 г 1 д 2 е 4 и 3 к 1 л 1 м 1 н 3 о 3 р 2 с 6 т 5 у 3 ш 1 ы 1 ь 3
P: Самая частая буква
Дана строка содержащая буквы русского и латинского алфавитов и иные символы. Определите, какая буква (или какие буквы) в этой строке встречается чаще всего. При решении этой задачи заглавные и строчные буквы считаются одинаковыми, а прочие символы, не являющиеся буквами, не учитываются. Буква «Ё» в тексте не встречается. Заглавные и строчные буквы считаются одинаковыми.
Программа должна вывести в первой строке все буквы, которые встречаются чаще всего в исходной строке. Выводить буквы необходимо в заглавном написании, в алфавитном порядке, без пробелов. Во второй строке выведите единственное число — сколько раз в данной строке встречаются эти буквы.
Beautiful is better than ugly. Красивое лучше, чем уродливое.
Q: Анаграммы
Даны две строки. Определите, можно ли получить одну из другой перестановкой символов.
Программа получает на вход две строки, содержащие только ASCII-символы, не содержащие пробелы.
Программа должна вывести слово YES , если одна строка может быть получена из другой перестановкой букв или NO .
eleven_plus_two
twelve_plus_one
Eleven_plus_two
Twelve_plus_one
R: Пробелы после запятой
Question of Life,The Universe, and Everything
Question of Life, The Universe, and Everything
S: Шифр Цезаря
В шифре Цезаря каждый символ заменяется на другой символ, третий по счету в алфавите после данного, с цикличность. То есть символ A заменяется на D, символ B — на E, символ C — на F, . символ Z на C.
Дана строка, зашифруйте ее при помощи шифра Цезаря. Решение оформите в виде функции caesar_cipher(s: str, k: int) -> str , возвращающей новую строку. s — исходная строка, k — величина сдвига. Величина сдвига может быть произвольным целым числом, в том числе и отрицательным.
caesar_cipher('IN A HOLE IN THE GROUND THERE LIVED A HOBBIT.', 3)
'LQ D KROH LQ WKH JURXQG WKHUH OLYHG D KREELW.'
T: Шифр замены — зашифровать сообщение
Шифр замены обобщение шифра Цезаря. Каждая буква сообщения меняется на какую-то другую букву (разные буквы меняются на разные буквы). Символы, не являющиеся буквами, остаются такими же. Ключом шифрования является перестановка: указание того, на какую букву должна быть заменена каждая другая буква.
Вам дана строка, содержащая только заглавные латинские буквы и символы ASCII, не являющиеся буквами. Зашифруйте её при помощи шифра замены.
Решение оформите в виде функции substitution_cipher(msg: str, key: str) -> str , возвращающей новую строку с зашифрованным сообщением. msg — исходное сообщение, key — ключ шифрования.
Ключ шифрования представляет собой строку длиной 26, являющейся перестановкой символов от A до Z. В строке последовательно записаны буквы, в которые переходят буквы A, B, C, . Z исходного сообщения.
substitution_cipher('IN A HOLE IN THE GROUND THERE LIVED A HOBBIT.', 'ABCDIFGHEJKLMNUPQRSTOVWXYZ')
'EN A HULI EN THI GRUOND THIRI LEVID A HUBBET.'
U: Шифр замены — расшифровать сообщение
Расшифруйте сообщение, зашифрованное шифром замены.
Решение оформите в виде функции substitution_decipher(msg: str, key: str) -> str , возвращающей новую строку с расшифрованным сообщением. msg — зашифрованное сообщение, key — ключ шифрования, заданный как в предыдущей задаче.
substitution_decipher('EN A HULI EN THI GRUOND THIRI LEVID A HUBBET.', 'ABCDIFGHEJKLMNUPQRSTOVWXYZ')
'IN A HOLE IN THE GROUND THERE LIVED A HOBBIT.'
V: Значение выражения — 3
Дана строка, содержащая одно или более целых неотрицательных чисел, разделенных знаками “+” или “-”. Вычислите значение этого выражения.
Решение оформите в виде функции evaluate(s) .
evaluate('21+7-10')
W: 12-часовой формат времени
Во многих англоговорящих странах время записывается в 12-часовом формате с указанием одного из двух 12-часовых интервалов: до полудня (a.m.) или после полудня (p.m.). Формально запись времени в 12-часовом формате выглядит, как строка “h:mm x.m.”, где h — число часов от 1 до 12 (однозначное или двухзначное), mm — число минут от 00 до 59, дополненное нулями до двух разрядов, x — одна из двух букв “a” или “p”. Подробней примеры записи времени и их перевод в 24-часовой формат можно найти в википедии.
1:00 a.m.
01:00
12:34 p.m.
12:34
X: IP-адрес
В сети интернет каждому компьютеру присваивается четырехбайтовый код, который принято записывать в виде четырех чисел, каждое из которых может принимать значения от 0 до 255, разделенных точками. Вот примеры правильных IP-адресов:
127.0.0.0 192.168.0.1 255.0.255.255
127.0.0.1
Y: Детская задача
Хорошо известна задача-шутка, в которой требуется продолжить числовую последовательность:
1 11 21 1211 111221 312211 13112221 1113213211 .
Свойства данного ряда изучались математиками, а сама последовательность названа look-and-say sequence.
1211
Z: Шифр перестановки
В шифре перестановки меняется порядок следования букв, но сами буквы не меняются. При шифровании сообщение разбивается на блоки длины \(n\), символы внутри блока переставляются в соответствии с ключом. Ключ — это перестановка длины \(n\).
Дано сообщение и ключ шифрования, зашифруйте сообщение при помощи данного ключа.
Длина ключа может быть строкой длиной \(n\) (\(1 \le n \le 9\)), состоящей из неповторяющихся цифр от 1 до \(n\). Перестановка показывает, на какие позиции переходят символы блока с номерами 1, 2, . \(n\). То есть перестановка вида 51234 означает, что блок длины 5 циклически сдвигается вправо на 1 символ.
При шифровании сообщение разбивается на блоки длины \(n\), если длина сообщения некратна \(n\), то в конец сообщения дописываются точки.
transposition_cipher('IN A HOLE IN THE GROUND THERE LIVED A HOBBIT', '312')
' INHA EOLN IH TGE URO NDETH REVLI EDHA BOB.IT'
Was it a rat I saw?
abca
X: Форматирование текста
- В начале и конце строки не должно быть пробелов.
- Все слова разделяются ровно одним пробелом.
- Точки и запятые пишутся слитно с предыдущим словом, после знака препинания ставится пробел.
Hello , world .
Hello, world.#
Y: Календарь
Напечатайте календарь на месяц. Месяц может состоять из 28, 29, 30, 31 дня. Календарь на месяц состоит из 4, 5 или 6 столбцов, заполненных числами (датами). Ширина каждого столбца — два символа, между столбцами промежуток в один символ. Однозначные числа дополняются пробелом слева. Промежуток между столбцами — один пробел. В каждом столбце должно быть записано хотя бы одно число.
31 3
6 13 20 27
7 14 21 28
1 8 15 22 29
2 9 16 23 30
3 10 17 24 31
4 11 18 25
5 12 19 26
Z: Значение выражения — 4
Строка состоит из целых неотрицательных чисел, разделенных знаками операций “+”, “-” и “*”. Вычислите значение этого выражения выполняя действия по правилам арифметики.
Тесты к этой задаче закрытые.
Символ «->» в определении функций Python
Часто сталкиваются с ситуацией, когда в определении функции Python встречается стрелка «->». Например:
def f(x) -> 123: return x
Этот синтаксис может вызвать недоумение, так как в Python 2 он отсутствовал. Вероятно, было бы логично предположить, что это предусловие, но при попытке протестировать это обнаруживается, что независимо от того, что расположено после стрелки, это никак не влияет на поведение функции.
Символ «->» в определении функций Python используется для указания ожидаемого типа возвращаемого значения. Это называется «аннотацией типов». Это не влияет на выполнение функции, но может быть полезно для разработчиков для понимания, какой тип данных ожидается в качестве возвращаемого значения функции.
Стоит отметить, что Python является языком с динамической типизацией, поэтому аннотации типов являются лишь рекомендацией, а не строгим правилом. То есть, функция может вернуть значение любого типа, независимо от аннотации.
Например, в данном случае:
def f(x) -> str: return x
Функция f(x) ожидается, что вернет строку str . Но даже если функция вернет число или любой другой тип данных, интерпретатор Python не выдаст ошибку.
Таким образом, «->» в определении функций Python — это способ указать ожидаемый тип возвращаемого значения, что может помочь в понимании кода и его дальнейшем использовании.
