Символы и строки в Python
Коды символов
Любой текст состоит из символов. Символ — это некоторый значок, изображение. Один и тот же символ можно записать по-разному, например, два человека по-разному напишут от руки букву «A», и даже в компьютерном представлении одна и та же буква будет выглядеть по-разному, если ее отображать разными шрифтами, при этом это будет все равно один и тот же символ. Верно и другое: разные символы могут быть записаны одинаково, например, вот две разные буквы, одна — латинского алфавита, другая - русского: «A» и «А». Несмотря на то, что они выглядят одинаково, удобней считать их разными символами.
Итак, способ хранения текстовой информации в компьютере не связан напрямую с изображением этого текста. Вместо символов хранятся их номера - числовые коды, а вот то, как выглядит символ с данным числовым кодом на экране напрямую зависит от того, какой используется шрифт для отображения символов. При этом, разумеется, следовало бы договориться о единообразном способе кодирования символов числовыми кодами, иначе текст, записанный на одном компьютере, невозможно будет прочитать на другом компьютере.
Первоначально договорились под кодирование одного символа отвести один байт, то есть 8 бит информации. Таким образом можно было закодировать 256 различных значений, то есть в записи текста можно использовать 256 различных символов. Этого достаточно, чтобы отобразить все символы латинского алфавита, цифры, знаки препинания и некоторые другие символы. Стандарт, указывающий, какие числовые коды соответствуют каким основным символам, называется ASCII. В таблицу ASCII включены символы с кодами от 0 до 127, то есть ASCII - это семибитный код. Вот так выглядит таблица ASCII:
При этом символы с кодами, меньшими 32 - это специальные управляющие символы, которые не отображаются на экране. Например, для того, чтобы обозначить конец строки в системе Linux используется один символ с кодом 10, а в системе Windows - два подряд идущих символа с кодами 13 и 10, символы с кодами 48-57 соответствуют начертанию арабских цифр (обратите внимание, символ с кодом 0 - это вовсе не символ, отображающийся на экране, как «0»), символы с кодами 65-90 - заглавные буквы буквы латинского алфавита, а если к их кодам прибавить 32, то получатся строчные буквы латинского алфавита. В промежутках между указанными диапазонами находятся знаки препинания, математические операции и прочие символы.
Но в ASCII-таблицы нет русских букв! А также нет букв сотен других национальных алфавитов. Первоначально для отображения букв национальных алфавитов использовали вторую половину возможного значения байта, то есть символы с кодами от 128 до 255. Это приводило к множеству проблем, например, поскольку 128 значений явно недостаточно для того, чтобы отобразить символы всех национальных алфавитов (даже недостаточно для того, чтобы отобразить символы одного алфавита, например, китайской письменности. Поэтому в настоящее время для кодирования символов используется стандарт Unicode, последняя версия 6.0 которого (октябрь, 2010) включает свыше 109000 различных символов. Естественно, для кодирования Unicode-символов недостаточно одного байта на символ, поэтому используются многобайтовые кодировки (для представления одного символа необходимо несколько байт).
Язык программирования Python — современный язык, поэтому он работает исключительно с Unicode-символами.
Код символа можно определить при помощи функции ord. Эта функция получает на вход строку, которая должна состоять ровно из одного символа. Функция возвращает код этого символа. Например, ord('A') вернет число 65.
Обратная функция получения по числовому коду его номера называется chr.
Сравнение символов
Поскольку для символов заданы их числовые коды, то их можно сравнивать при помощи операций сравения. Поскольку символы алфавита идут подряд, то результат их сравнения будет соответствовать лексикографическому порядку, но можно сравнивать между собой не только буквы алфавита, но и два произвольных символа.
Также в питоне определены и операции сравнения строк, которые также сравниваются в лексикографическом порядке.
Строки и списки
Строки в языке Питон, в отличии от списков, являются неизменными объектами, то есть в отличии от списков нельзя изменить отдельный символ строки: операция A[i] = ... является допустимой, если A список, и недопустимой, если A — строка.
Один символ в строке можно поменять, если создать новую строку, например, следующий код меняет i-й символ строки на символ @.
A = A[:i] + '@' + A[i+1:]
К сожалению, подобное изменение требует время, пропорциональное длине строки.
Преобразование строки S в список символов A:
A = list(S)
Преобразование списка символов в строку:
S = ' '.join(A)
Задача №111300. ASCII-код символа
Считайте со стандартного ввода символ и выведите его код.
Входные данные
Программа получает на вход один символ с кодом от 33 до 126.
Выходные данные
Нужно вывести одно число - код считанного символа
Примеры
Ввод | Вывод |
A | 65 |
Решение
print(ord(input()))
Задача №111301. Символ с данным ASCII-кодом
Считайте со стандартного ввода целое число и выведите ASCII-символ с таким кодом. Решите эту задачу с использованием только одной переменной типа int.
Входные данные
Программа получает на вход число от 33 до 126.
Выходные данные
Нужно вывести символ, который имеет введенный код.
Примеры
Ввод | Вывод |
65 | A |
Решение
print(chr(int(input())))
Задача №111303. Символы в заданном интервале
Выведите подряд, без пробелов, все символы, лежащие в таблице ASCII между двумя заданными символами.
Входные данные
Программа получает на вход два символа, каждый в отдельной строке и должна вывести строку, начинающуюся первым из заданных символов и заканчивающуюся вторым.
Примеры
Ввод | Вывод |
A D |
ABCD |
Ввод | Вывод |
0 9 |
0123456789 |
Решение
s1 = input()
s2 = input()
for i in range(ord(s1), ord(s2) + 1):
print(chr(i), end='')
Задача №111306. Сменить регистр символа
Напишите функцию CaseChange (c), меняющую регистр символа, то есть переводящую заглавные буквы в строчные, а строчные - в заглавные, остальные символы не меняющие. В решении нельзя использовать циклы. В решении нельзя использовать константы с неочевидным значением.
Входные данные
Считайте один символ со стандартного ввода
Выходные данные
Выведите результат работы данной функции
Примеры
Ввод | Вывод |
b | B |
Ввод | Вывод |
c | C |
Ввод | Вывод |
F | f |
Решение
def CaseChange(c):
if c.isupper():
return c.lower()
if c.islower():
return c.upper()
return c
a = input()
ans = CaseChange(a)
print(ans)
Задача №111308. Палиндром
Дано слово, состоящее только из заглавных и строчных латинских букв. Проверьте, верно ли что это слово читается одинаково как справа налево, так и слева направо (то есть является палиндромом), если считать заглавные и строчные буквы не различающимися. Выведите слово YES, если слово является палиндромом и слово NO, если не является.
Решение оформите в виде функции IsPalindrome (S), возвращающей значение типа bool. При решении этой задачи нельзя пользоваться вспомогательными массивами или строками.
Примеры
Ввод | Вывод |
Radar | YES |
Ввод | Вывод |
YES | NO |
Решение
def IsPalindrome(S):
if S.lower() == S.lower()[::-1]:
return True
S = input()
if IsPalindrome(S):
print("YES")
else:
print("NO")
Задача №111312. Шифр Цезаря
В шифре Цезаря каждый символ заменяется на другой символ, третий по счету в алфавите после данного, с цикличность. То есть символ A заменяется на D, символ B - на E, символ C - на F, ..., символ Z на C. Аналогично строчные буквы заменяются на строчные буквы. Все остальные символы не меняются.
Дана строка, зашифруйте ее при помощи шифра Цезаря. Решение оформите в виде функции CaesarCipher (S, k), возвращающей новую строку. <сode> S — исходная строка, k — величина сдвига. Функцию нужно вызывать со значением k = .
Указание: сделайте функцию CaesarCipherChar(c, k), шифрующую один символ.
Примеры
Ввод | Вывод |
In a hole in the ground there lived a hobbit. | Lq d kroh lq wkh jurxqg wkhuh olyhg d kreelw. |
Решение
def CaesarCipherChar(c, k):
a = "abcdefghijklmnopqrstuvwxyz"
a2 = a.upper()
if c.isupper():
return (a2[(a2.index(c) + k) % len(a2)])
elif c.islower():
return (a[(a.index(c) + k) % len(a)])
else:
return c
def CaesarCipher(s, k):
res = ''
for c in s:
res += CaesarCipherChar(c, k)
return (res)
S = input()
print(CaesarCipher(S, 3))
Задача №111316. Слова с прописной буквы
Дана строка. Измените регистр символов в этой строке так, чтобы первая буква каждого слова была заглавной, а остальные буквы - строчными.
Решение оформите в виде функции Capitalize (S), возвращающей новую строку.
Примеры
Ввод | Вывод |
In a hole in the ground there lived a hobbit. | In A Hole In The Ground There Lived A Hobbit. |
Решение
def Capitalize(S):
ans = ''
for i in range(0, len(S)):
if S[i].isupper() and S[i - 1].isalpha() == True and i != 0:
ans += S[i].lower()
elif S[i].islower() and S[i - 1].isalpha() == False or i == 0:
ans += S[i].upper()
else:
ans += S[i]
return ans
S = input()
print(Capitalize(S))
Задача №111319. Самая частая буква
Дана строка, возможно, содержащая пробелы. Определите, какая буква латинского алфавита (или какие буквы) в этой строке встречается чаще всего. При решении этой задачи заглавные и строчные буквы считаются одинаковыми, а прочие символы, не являющиеся буквами, не учитываются.
Программа должна вывести в первой строке все буквы, которые встречаются чаще всего в исходной строке. Выводить буквы необходимо в заглавном написании, в алфавитном порядке, без пробелов. Во второй строке выведите единственное число - сколько раз в данной строке встречаются эти буквы.
При решении этой задачи нельзя пользоваться вложенными циклами. Входная строка должна обрабатываться за один проход.
Примеры
Ввод | Вывод |
- We all live in the Yellow Submarine! | EL 5 |
Решение
s = input()
s = s.upper()
q = [chr(i) for i in range(65, 91)]
res = 0
letters = ''
for i in range(len(q)):
if s.count(q[i]) > res:
res = s.count(q[i])
letters = q[i]
if s.count(q[i]) == res and letters != q[i]:
letters += q[i]
print(letters)
print(res)