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 "
Длина строки#
Для определения количества символов в строке используется встроенная функция len(). Она принимает строку и возвращает целое число — количество символов в ней:
len("Строка")
6
my_string = "Ещё одна строка"
len(my_string)
15
Функция len() считает все символы, включая пробелы и знаки препинания. Для пустой строки результат будет равен 0:
len("")
0
Срезы и обращение по индексу#
Любой текст, любую строку можно представить как последовательность отдельных символов. 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'
При операциях сравнения мы всегда сравниваем строки друг с другом. Для самого сравнения используется лексикографический порядок, то есть строки сравниваются посимвольно, начиная с первого символа. Если первые символы двух строк равны, то сравнение продолжается со следующего символа, и так далее, пока не будет найдено отличие.
Порядок символов определяется их кодами в таблице Unicode. Каждый символ имеет свой числовой код, и сравнение строк — это просто сравнение этих кодов. На практике это означает:
Спецсимволы (
!,#,$и т.д.) идут раньше цифр и буквЦифры (
0–9) идут раньше буквЗаглавные буквы латиницы (
A–Z) идут раньше строчных (a–z)Буквы кириллицы также имеют свои коды и располагаются после латиницы
Не нужно запоминать точный порядок — достаточно понимать принцип: сравниваются числовые коды символов, а не их визуальное представление.
"!" < "1"
True
"1" < "Q"
True
"Q" < "q"
True
"q" < "Й"
True
"Й" < "й"
True
"abc" < "abd"
True
Оператор in#
Для проверки наличия подстроки в строке используется оператор in - слева от оператора указывается, что ищем, а справа от оператора указывается, где ищем. Оператор возвращает True, если подстрока найдена, и False в противном случае:
"Moscow" in "Moscow, Russia"
True
"Paris" in "Moscow, Russia"
False
Оператор in чувствителен к регистру:
"moscow" in "Moscow, Russia"
False
Для отрицания используется оператор not in:
"Paris" not in "Moscow, Russia"
True