1.1. Общие вопросы
В предыдущей брошюре [1], в разделе 3, говорилось, что одним из основных типов данных в языке Python является тип str. К нему относятся величины, значением которых является последовательность символов. Это может быть конкретная строка символов, которая указывается в кавычках ('карандаш', "Дмитрий", 'h', ' ' и т.п.1), переменная (s, famil и т.п.) или выражение, результатом которого является последовательность символов (im + ' ' + famil и т.п.). В устной речи и при письме, как правило, этот тип данных называют «строковый тип», а сами данные - «строки».
В [1] были описаны также способы задания значений величинам строкового типа:
- с помощью инструкции присваивания:
im = 'Дмитрий'
- с помощью инструкции input():
st = input('Введите строку символов ')
При хранении значения в памяти компьютера символы строки расположены подряд (в соседних ячейках). Модель памяти при этом можно представить в виде:
| Д | м | и | т | р | и | й | |
| Номер символа | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| im | |||||||
Рис . 1.1
Видно, что нумерация отдельных символов в памяти компьютера начинается с нуля. Здесь же напомним, что каждый символ в памяти компьютера хранится в виде двоичного числа - его кода.
Строки можно соединять («склеивать») в одно значение. Такая операция называется «конкатенация». Для конкатенации используется знак (оператор) «+»:
Text = 'Меня зовут' + ' ' + im
Реже используется операция «умножения» величины строкового типа на целое число:
st = 'ABC'
st2 = st * 3 #st2 == 'ABCABCABC'
Видно, что «умножение» в данном случае - это повторение строки заданное число раз.
Можно также сравнивать строки между собой, и не только на предмет их равенства или неравенства:
if derevo > 'дуб':
Вот несколько примеров сравнения строк (во всех случаях результат является истинным):
'a123' > 'a'
'a2' > 'a123'
'a123' > 'aб'
'aб' > 'б'
'б' > 'б2'
'б2' > 'б2д'
'б2д' > 'бб'
'б' > 'а'
Если выписать перечисленные строки в виде:
'a'
'a123'
'a2'
'aб'
'б'
'б2'
'б2д'
'бб'
- то можно установить правило, по которому происходит сравнение двух строк: посимвольно слева направо сравниваются коды соответствующих символов до тех пор, пока не нарушится равенство кодов или не кончится одна из строк (или обе сразу), при этом сразу делается вывод о неравенстве и определяется, какая из строк меньше, а какая - больше. Две величины типа str являются равными, если они равны по длине и совпадают посимвольно.
Именно по такому правилу происходит сравнение строк при их сортировке. Порядок, в котором окажутся строки в результате сортировки, называют «алфавитным» (так расположены, например, слова в словарях).
Но как компьютер «знает», что такое «алфавитный порядок»? И как сравнивать слова, в которых есть и строчные и прописные буквы, а также цифры и другие символы? Оказывается, при сравнении строк используются коды символов.
В кодовой таблице2 прописные буквы стоят раньше строчных и поэтому имеют меньшие коды. Цифры стоят в кодовой таблице по порядку, причем раньше, чем латинские буквы; латинские буквы - раньше, чем русские; заглавные буквы (русские и латинские) - раньше, чем соответствующие строчные.
В Python имеется возможность получить так называемый «срез» строки - последовательность символов, начинающуюся с символа номер nach и заканчивающуюся символом номер kon. Для этого после имени величины строкового типа указать в квадратных скобках значения nach - 1 и kon через двоеточие3.
Пример. Программа для получения слова 'menu' (6-9-й символы строки 'File menu'):
s = 'File menu'
s2 = s[5:9] #Срез строки s
print(s2)
В дальнейшем часть строки будем называть «подстрока».
Чтобы использовать в программе значение отдельного символа строки, нужно указать имя величины и в квадратных скобках - номер символа в памяти компьютера (где, напомним, нумерация начинается с нуля)4.
Примеры:
print(s[5])
print(famil[k])
if st[nom + 1] == 'Д':
…
В любой момент выполнения программы длину строки (количество символов в ней) можно определить с помощью функции len(). В этом примере в переменную L записывается длина строки s:
L = len(s)
В [1], в разделе 2, рассказывалось о том, что к последовательности символов может быть применен метод upper, преобразующий все буквы строки в их написание в верхнем регистре («прописными буквами»). Обратиться к результату выполнения метода можно так:
<строка>.upper()
Например:
famil.upper()
Десятичный эквивалент кода символа можно получить с помощью функции ord():
ord(<символ>)
Имеются и другие функции и методы для работы со строками. О некоторых из них читатель может узнать ниже, а об остальных - по другим источниками.
1 Если строка ограничена одинарными кавычками, внутри нее могут быть двойные кавычки:
s2 = 'Я болельщик клуба "Спартак"'
и наоборот.
2 Кодовая таблица - таблица, сопоставляющая каждому символу некоторое двоичное число - его код.
3 Указаны номера символов nach и kon в заданном значении величины s. Если известны номера символов в памяти компьютера (см. рис . 1.1) nach_pam и kon_pam, то в квадратных скобках записываются значения nach_pam и kon_pam + 1. Такой вариант использован для выделения отдельных слов предложения (см. далее задачи 10-12) и в других программах, использующих срез строки.
4 После того как вы ознакомитесь со списками (см. раздел 2), вы согласитесь с утверждением, что строка в Python рассматривается как список, значением элементов которого является один символ.