Строки в Python
В этом руководстве вы научитесь создавать, форматировать, изменять и удалять строки в Python. А еще познакомитесь с различными строковыми операциями и функциями.
Что такое строка
Строка — это последовательность символов.
Символ — это просто одиночный символ. Например, в английском языке 26 символов, букв.
Компьютер работает не с символами, а с числами в двоичной записи. Вы видит на экране символы, но компьютер хранит и обрабатывает их как комбинацию нулей и единиц.
Преобразование символа в число называется кодированием, а обратный процесс — декодированием. О самых известных стандартах кодирования вы, скорее всего, слышали. Это ASCII и Unicode.
В Python каждая строка — это последовательность символов Юникода, поскольку он позволяет использовать символы из всех языков мира и обеспечивает единообразие кодировки.
Как создать строку
Если заключить набор символов в одинарные ''
или двойные ""
кавычки с двух сторон, получится строка. В Python можно использовать и тройные кавычки ''''''
, но их обычно используют для многострочных строк и строк документации.
# все способы ниже эквиваленты: они делают одно и то же
my_string = 'Привет'
print(my_string)
my_string = "Привет"
print(my_string)
my_string = '''Привет'''
print(my_string)
# тройные кавычки позволяют создавать многострочные строки
my_string = """Привет, добро пожаловать
в мир Python"""
print(my_string)
Вывод:
Привет
Привет
Привет
Привет, добро пожаловать
в мир Python
Как получить доступ к символам в строке
1. По индексу
Получить доступ к отдельным символам в строке можно стандартным способом — по индексу.
Примечание. Первый элемент в строке (то есть первый символ) Python имеет индекс 0.
Индекс всегда должен быть целым числом, поэтому тип float
не подойдет. Использование в качестве индекса числа с плавающей точкой приведет к ошибке TypeError.
Если вы попытаетесь получить доступ к символу с индексом, который больше длины строки, Python выдаст ошибку IndexError.
Индекс не обязательно должен быть положительным числом. Python поддерживает и «отрицательную индексацию». Индекс -1 ссылается на последний символ, -2 — на предпоследний и так далее.
2. С помощью среза
Получить доступ к символам в строке можно и с помощью слайсинга (от англ. «нарезание»). Таким способом удобно получать набор символов в заданном диапазоне.
Срезы задаются с помощью квадратных скобов []
и 2-3 аргументов через двоеточие :
.
my_collection[старт:стоп:шаг]
string = 'codechick'
print('string = ', string)
#первый символ
print('string[0] = ', string[0])
#последний символ
print('string[-1] = ', string[-1])
#срез от 2 до 5 символа
print('string[1:5] = ', string[1:5])
#срез от 6 до предпоследнего символа
print('string[5:-2] = ', string[5:-2])
Вывод:
string = codechick
string[0] = c
string[-1] = k
string[1:5] = odec
string[5:-2] = hi
Если мы попытаемся получить доступ к символу с индексом вне допустимого диапазона или использовать не целые числа, получим ошибку.
Помните строку my_string?
# длина строки my_string = 6 символов, а мы пытаемся получить 15 символ
>>> my_string[15]
...
IndexError: string index out of range
# индекс должен быть целым числом
>>> my_string[1.5]
...
TypeError: string indices must be integers
Как изменить или удалить строку
Строка — неизменяемый тип данных. Это значит, что мы не можем изменить элементы строки после создания. Зато можем переназначать разные строки одной и той же переменной.
>>> my_string = 'codechick'
>>> my_string[5] = 'a'
...
TypeError: 'str' object does not support item assignment
>>> my_string = 'Python'
>>> my_string
'Python'
По той же причине нельзя удалять символы из строки. Зато можно полностью удалить строку: для этого используйте ключевое слово del
.
>>> del my_string[1]
...
TypeError: 'str' object does not support item deletion
>>> del my_string
>>> my_string
...
NameError: name 'my_string' is not defined
Строковые операции
Строки — один из самых часто используемых типов данных в Python, поэтому для работы с ними существует куча встроенных операций.
Конкатенация строк
Конкатенация — это объединение двух или более строк в одну.
Эту операцию в Python выполняет оператор +
. А с помощью оператора *
можно повторить строку заданное количество раз — «умножить» строку на число.
string1 = 'Привет, '
string2 ='мир!'
# используем +
print('string1 + string2 = ', string1 + string2)
# используем *
print('string1 * 3 =', string1 * 3)
Вывод:
string1 + string2 = Привет, мир!
string1 * 3 = Привет, Привет, Привет,
Если просто написать рядом два строковых литерала, они тоже объединятся в одну строку. Еще можно использовать круглые скобки. Давайте рассмотрим пример.
>>> # два строковых литералы записаны вместе
>>> 'Привет, ''мир!'
'Привет, мир!'
>>> # круглые скобки объединяют строковые литералы
>>> s = ('Привет, '
... 'мир')
>>> s
'Привет, мир'
Итерирование по строке
В Python можно «пройтись» по строке, то есть перебрать все символы в ней. Для этого нужно использовать цикл for.
count = 0
for letter in 'Привет, мир!':
if (letter == 'и'):
count += 1
print(count, 'буквы «и» в данной строке')
Вывод:
2 буквы «и» в данной строке
Проверка на вхождение
В Python можно проверить, находится ли данная подстрока в строке или нет с помощью операторов членства in
и not in
.
>>> 'chick' in 'codechick'
True
>>> 'code' not in 'codechick'
False
Функции для работы со строками
Практически все встроенные функции, которые работают с последовательностями, точно так же работают со строками.
Самые полезные:
enumerate()
— позволяет перебирать строку, отслеживая индекс текущего элемента.len()
— возвращает длину строки.
string = 'кодер'
# enumerate()
list_enumerate = list(enumerate(string))
print('list(enumerate(string) = ', list_enumerate)
# считаем количество символов
print('len(string) = ', len(string))
Вывод:
list(enumerate(string) = [(0, 'к'), (1, 'о'), (2, 'д'), (3, 'е'), (4, 'р')]
len (string) = 5
Методы строк
|
Разбивает строки по заданном разделителю (по умолчанию — пробел) |
|
«Собирает» строку из списка с разделителем |
|
Поиск подстроки в строке. Возвращает индекс первого вхождения слева. Если подстроки в строке нет, возвращает -1 |
|
Поиск подстроки в строке. Возвращает индекс первого вхождения. Если подстроки в строке нет, возвращает ValueError |
|
Замена шаблона в строке |
|
Проверяет, состоит ли строка из цифр. Возвращает True или False |
|
Проверяет, состоит ли строка из букв. Возвращает True или False |
|
Проверяет, состоит ли строка из символов в нижнем регистре. Возвращает True или False |
|
Проверяет, состоит ли строка из символов в верхнем регистре. Возвращает True или False |
|
Преобразует строку к верхнему регистру |
|
Преобразует строку к нижнему регистру |
|
Преобразует символ в ASCII-код |
|
Преобразует ASCII-код в символ |
>>> "CoDeCHicK".lower()
'codechick'
>>> "CoDeCHicK".upper()
'CODECHICK'
>>> "Эта инструкция разобьет строку и засунет элемент в список".split()
['Эта', 'инструкция', 'разобьет', 'строку', 'и', 'засунет', 'элемент', 'в', 'список']
>>> ' '.join(['Эта', 'инструкция', 'соберет', 'все', 'слова', 'в', 'одну', 'строку'])
'Эта инструкция соберет все слова в одну строку'
>>> 'Счастливого Рождества!r'.find('ож')
13
>>> 'Счастливого Рождества!'.replace('Счастливого', 'Чудесного')
'Чудесного Рождества!'
Как форматировать строки
Управляющие последовательности
Допустим, нам нужно напечатать на экран такое сообщение: He said, "What's there?"
(Он сказал: «Что там?»). Проблема в том, что в этом тексте есть и двойные, и одинарные кавычки (апостроф), поэтому мы не можем использовать их для создания строки — это приведет к ошибке SyntaxError.
>>> print("He said, "What's there?"")
...
SyntaxError: invalid syntax
>>> print('He said, "What's there?"')
...
SyntaxError: invalid syntax
Эта проблема больше актуальная для английского языка, поскольку в русском не используют апострофы, но знать, как ее решить, надо всем.
Есть два способа обойти эту проблему: использовать тройные кавычки или escape-последовательности — их еще иногда называют управляющими последовательностями.
Вот, как это выглядит на практике.
# с помощью тройных кавычке
print('''He said, "What's there?"''')
# escape-последовательность и одинарные кавычки
print('He said, "What\'s there?"')
# escape-последовательность и двойные кавычки
print("He said, \"What's there?\"")
Вывод:
He said, "What's there?"
He said, "What's there?"
He said, "What's there?"
Список escape-последовательностей
Управляющая последовательность |
Описание |
|
Экранирование обратного слэша |
|
Экранирование одинарной кавычки |
|
Экранирование двойной кавычки |
|
Звуковой сигнал или предупреждение |
|
Возврат на одну позицию |
|
Перенос строки на новую |
|
Возврат каретки |
|
Горизонтальный Tab |
|
Вертикальный Tab |
|
Восьмеричное значение |
|
Шестнадцатеричное значение |
>>> print("C:\\Python32\\Lib")
C:\Python32\Lib
>>> print("Это сообщение печатается\на двух строках")
Это сообщение печатается
на двух строках
Игнорирование управляющих последовательностей
Чтобы Python проигнорировал escape-последовательность в строке, можно написать перед этой строкой r
или R
.
>>> print("Это \nхороший пример")
Это
хороший пример
>>> print(r"Это \nхороший пример")
Это \nхороший пример
Метод format()
Метод format()
— очень гибкий и мощный инструмент для форматирования строк. В качестве заполнителей используются фигурные скобки {}
.
Чтобы задать порядок, можно использовать позиционные аргумент и аргументы в виде ключевых слов. Давайте рассмотрим эти способы на примере.
# порядок по умолчанию
default_order = "{}, {} и {}".format('Петя','Ваня','Катя')
print('\n--- Порядок по умолчанию ---')
print(default_order)
# порядок с позиционными аргументами
positional_order = "{1}, {0} и {2}".format('Петя','Ваня','Катя')
print('\n--- Позиционный порядок ---')
print(positional_order)
# порядок по ключевым словам
keyword_order = "{s}, {b} и {j}".format(j='Петя',b='Петя',s='Катя')
print('\n--- Порядок по ключевым словам ---')
print(keyword_order)
Вывод:
--- Порядок по умолчанию ---
Петя, Ваня и Катя
--- Позиционный порядок ---
Ваня, Петя и Катя
--- Порядок по ключевым словам ---
Катя, Ваня и Петя
У метода format()
есть дополнительные настройки. Они отделяются от имени поля двоеточием :
. Например, строку можно выровнять по левому краю <
, по правому краю >
или центрировать ее ^
.
Точно так же можно форматировать целые числа в их двоичные, шестнадцатеричные записи и т. д. А числа с плавающей точкой можно округлять или отображать в экспоненциальной записи.
>>> # форматирование целых чисел
>>> "Двоичное запись числа {0} = {0:b}".format(12)
'Двоичная запись числа 12 = 1100'
>>> # форматирование чисел с плавающей точкой
>>> "Экспоненциальное представление: {0:e}".format(1566.345)
'Экспоненциальное представление: 1.566345e+03'
>>> # округление
>>> "Одна треть = {0:.3f}".format(1/3)
'Одна треть = 0.333'
>>> # выравнивание строк
>>> "|{:<10}|{:^10}|{:>10}|".format('масло', 'булка', 'колбаса')
'|масло | булка | колбаса|'