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. Символы

  2. Цифры

  3. Заглавные буквы латинского алфавита

  4. Прописные буквы латинского алфавита

  5. Заглавные буквы кириллицы

  6. Прописные буквы кириллицы

"!" < "1"
True
"1" < "Q"
True
"Q" < "q"
True
"q" < "Й"
True
"Й" < "й"
True
"abc" < "abd"
True