1.5 Строковый тип данных#
Объявление строк#
В программировании помимо чисел часто придется сталкиваться и с работой с текстом. Например, при вводе пользовательских данных, чтении файлов или выводе информации на экран мы имеем дело с текстом. Для работы с текстом в Python используется тип данных str, который представляет собой строку символов.
Для создания объекта типа str необходимо будет заключить нужный текст в кавычки. В качестве кавычек могут использоваться одинарные ', двойные ", тройные одинарные ''' и тройные двойные """. Например:
# Ключевой момент - с двух концов строки должны использоваться одинаковые кавычки
my_string = 'simple string'
my_string = 'string with " '
my_string = "string with ' "
my_string = """ string with ' and " """
my_string = ''' string with ' and " '''
Ранее мы уже встречали, что тройные одинарные или двойные кавычки могут использоваться для документирования (Docstring). Также они могут использоваться и для создания обычных текстовых переменных. В таком случае особенность их использования заключается в том, что текст можно записывать в несколько строк, в отличие от вариантов с использованием ' и ".
my_string = """
Определение текста может быть сделано в несколько строк
"""
my_string = '''
Первая строка текста
Вторая строка текста
'''
При объявлении строк перед открывающими кавычками может появиться ещё дополнительный символ - префикс.
В качестве префикса могут быть использованы следующие символы:
b - указывает, что строка должна восприниматься как набор байтов, а не набор символов.
r - указывает, что строка не содержит никаких специальных символов.
u - указывает, что строка является набором символов Юникод. В Python 3 это является стандартным состоянием строк, и данный префикс практически не используется
Наиболее полезным для нас будет префикс r, он очень актуален для объявления переменных, являющихся путями к директории или файлу. Рассмотрим некоторые специальные символы, которые могут встретиться в тексте:
\ - символ экранирования - заменяет последующий специальный символ на обычный текст
\n - перенос строки
\t - табуляция
\v - вертикальная табуляция
Кавычки также считаются специальными символами
„ - апостроф
« - кавычки
Рассмотрим несколько примеров, как специальные символы могут повлиять на строки:
# Представим, что у нас есть файл на сетевом хранилище.
# Попробуем вывести на печать строку, чтобы понять, как её будет видеть пользователь
print('\\nas-storage\test.txt')
\nas-storage est.txt
# Повторим то же самое, добавив префикс r
print(r'\\nas-storage\test.txt')
\\nas-storage\test.txt
Экранирование
Экранирование также может использоваться при создании текста, внутри которого должны встречаться кавычки
my_string = " string with \" "
my_string
string with "
Срезы и обращение по индексу#
Любой текст, любую строку можно представить как последовательность отдельных символов. Python позволяет обращаться к отдельным элементам этой последовательности или выделять из неё подпоследовательности. Для этого каждому символу в строке присваивается свой индекс, и дальше эти индексы используются, чтобы обозначить, какая часть строки требуется. Примечательно, что в отличие от многих других языков программирования в Python одновременно присутствует как прямая индексация, так и обратная. При прямой индексации символам по порядку присваиваются положительные числа начиная с 0 от первого символа к последнему. При обратной - по порядку присваиваются отрицательные числа начиная с -1 от последнего символа к первому.
# Индексация строк
# +---+---+---+---+---+
# | H | e | l | l | o |
# +---+---+---+---+---+
# 0 1 2 3 4 # Прямая индексация
# -5 -4 -3 -2 -1 # Обратная индексация
my_string = "Hello"
Для обращения по индексу после строки необходимо поставить [ ] и указать в них нужный индекс. [ ] могут ставиться и после только что объявленной строки, и после имени переменной, которая указывает на строку.
"Hello"[0]
'H'
my_string[0]
'H'
my_string[-1] # вернет последний символ
'o'
Похожим образом работает выделение подстрок. В Python такая операция называется срез. Для получения среза также используются [ ], однако внутри указывается уже не одно число, а может указываться несколько чисел, параметров, разделенных :.
В общем случае срез выглядит следующим образом:
строка[начало среза : конец среза : шаг среза]
Отметим, что граница конца среза всегда указывается не включительно. При этом любой из параметров может отсутствовать.
Если отсутствует индекс начала среза, то срез начинается с 0 индекса
Если отсутствует индекс конца среза, то срез заканчивается последним элементом
Если отсутствует шаг среза, то считается, что он равен 1
Посмотрим примеры работы срезов:
my_string[1:4] # вернет символы с первого включительно по четвертый не включительно
'ell'
my_string[1:] # вернет все символы начиная с первого включительно
'ello'
my_string[:2] # вернет символы с нулевого включительно до второго не включительно
'He'
my_string[0:4:2] # вернет символы с нулевого включительно до четвертого не включительно с заданным шагом - 2
'Hl'
my_string[::-1] # вернет все символы с заданным шагом (каждый первый в обратном порядке)
'olleH'
Арифметика строк#
После того как мы определили строку, с ней можно выполнить несколько простых операций из тех, которые уже рассматривались. Так, со строками можно выполнять сложение - операция конкатенации, умножение на число, а также операции сравнения.
Начнем со сложения. Конкатенация выполняется только между двумя строками, то есть мы можем сложить строку со строкой, но не можем сложить строку с числом.
"Hello," + "World"
'Hello,World'
Умножение работает, только когда мы пытаемся умножить строку на число. В таком случае мы, по сути, указываем, сколько раз должна быть повторена строка.
"Hello " * 10
'Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello '
# Как и в математике, порядок множителей значения не имеет
10 * " Hello"
' Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello'
При операциях сравнения мы всегда сравниваем строки друг с другом. Для самого сравнения используется лексикографический порядок, то есть строки сравниваются посимвольно, начиная с первого символа. Если первые символы двух строк равны, то сравнение продолжается со следующего символа, и так далее, пока не будет найдено отличие.
Лексикографический порядок можно описать следующим образом:
Символы
Цифры
Заглавные буквы латинского алфавита
Прописные буквы латинского алфавита
Заглавные буквы кириллицы
Прописные буквы кириллицы
"!" < "1"
True
"1" < "Q"
True
"Q" < "q"
True
"q" < "Й"
True
"Й" < "й"
True
"abc" < "abd"
True