Ранее мы уже познакомились со строками, рассматривая их как один из простых типов данных наряду с целочисленными и вещественными числами. Строка представляет собой последовательность символов, окруженную либо одинарными, либо двойными кавычками.
В Python отсутствует специальный тип данных для символов. Вместо этого, строки можно рассматривать как объекты, которые представляют собой цепочку из подстрок длиной от одного символа и более. В отличие от списков, к структурам данных строки в Python обычно не относят. Это связано с тем, что структуры данных обычно состоят из более простых элементов, а строкам не требуется более простой тип, поскольку в Python отсутствует отдельный символьный тип.
Как и списки, строки в Python представляют собой последовательности упорядоченных элементов. Это позволяет извлекать из них отдельные символы и создавать срезы.
>>> s = "Hello, World!" >>> s[0] 'H' >>> s[7:] 'World!' >>> s[::2] 'Hlo ol!'
В приведенном примере происходит извлечение каждого второго символа. Отметим, что можно извлекать срезы с шагом и из списков.
Особенность строк по сравнению со списками заключается в их неизменяемости. В Python невозможно изменить отдельный символ или срез в строке:
>>> s[-1] = '.'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
Интерпретатор указывает, что объекты типа str не предусматривают изменения их элементов.
Если требуется изменить строку, нужно создать новую, объединив части старой строки:
>>> s = s[0:-1] + '.' >>> s 'Hello, World.'
Здесь используется подстрока из начальной строки, которая объединяется с другой строкой. Новая строка присваивается переменной s
,
и предыдущее значение теряется.
Методы строк
Язык Python предоставляет множество методов для работы со строками. Посмотреть их список можно, используя команду
dir(str)
, а подробности о каждом методе получить через
help(str.имя_метода)
. Рассмотрим наиболее интересные из них.
Методы split() и join()
С помощью метода split() можно разбивает строку на элементы, используя пробелы в качестве разделителей, что позволяет получить список слов. Этот метод незаменим, если вы хотите разделить строку, введенную пользователем, на отдельные слова или числа для последующей обработки.
>>> s = input()
red blue orange white
>>> s
'red blue orange white'
>>> sl = s.split()
>>> sl
['red', 'blue', 'orange', 'white']
>>> s
'red blue orange white'
Результат использования split() можно сохранить в переменной s, посредством
s = s.split()
. В этом случае исходная строка исчезнет. Если вам она не нужна, то создавать дополнительную переменную не обязательно.
Метод split() также позволяет указать строку-разделитель, по которой будет происходить разделение:
>>> s.split('e') ['r', 'd blu', ' orang', ' whit', ''] >>> '40030023'.split('00') ['4', '3', '23']
Метод join() применяется для обратного действия — объединения элементов списка в строку. Так как это метод строки, строка-разделитель указывается перед вызовом метода, а список следует заключить в скобки:
>>> '-'.join(sl) 'red-blue-orange-white'
Если разделитель не нужен, используется пустая строка:
>>> ''.join(sl) 'redblueorangewhite'
Методы find() и replace()
Эти методы работают с подстроками. Метод find() используется для поиска подстроки в строке, возвращая индекс её первого символа. Если подстрока отсутствует, возвращается -1.
>>> s 'red blue orange white' >>> s.find('blue') 4 >>> s.find('green') -1
Поиск можно ограничить заданным интервалом строки, указав начальный и конечный индексы. Если конечный индекс не указан, поиск продолжается до конца строки:
>>> letters = 'ABCDACFDA' >>> letters.find('A', 3) 4 >>> letters.find('DA', 0, 6) 3
Здесь поиск производится начиная с третьего индекса и до конца строки, а также с нулевого до шестого.
Обратите внимание: find() возвращает только первое вхождение. Метод
letters.find('A', 3)
не находит последний 'A', так как до него уже встретился
'A' на позиции 4.
Метод replace() заменяет одну подстроку другой:
>>> letters.replace('DA', 'NET') 'ABCNETCFNET'
Исходная строка не изменяется:
>>> letters 'ABCDACFDA'
Для сохранения результата необходимо присвоить его новой переменной:
>>> new_letters = letters.replace('DA', 'NET') >>> new_letters 'ABCNETCFNET'
Метод format()
Метод format(), часто используемый в функции print(), применяется непосредственно к строкам для их обновления. После изменения строка передается в функцию:
>>> print("This is a {0}. It's {1}.".format("ball", "red")) This is a ball. It's red.
Метод предоставляет множество возможностей, остановимся на основных:
>>> size1 = "length - {}, width - {}, height - {}" >>> size1.format(3, 6, 2.3) 'length - 3, width - 6, height — 2.3'
Если фигурные скобки внутри строки пусты, аргументы подставляются по порядку. Но при наличии индексов в скобках, последовательность можно изменить:
>>> size2 = "height - {2}, length - {0}, width - {1}" >>> size2.format(3, 6, 2.3) 'height - 2.3, length - 3, width - 6'
Также возможно использование слов-ключей для аргументов:
>>> info = "This is a {subj}. It's {prop}." >>> info.format(subj="table", prop="small") "This is a table. It's small."
И пример форматирования вещественных чисел:
>>> "{1:.2f} {0:.3f}".format(3.33333, 10/6) '1.67 3.333'
Практическая работа
- Вводится строка, содержащая как строчные, так и заглавные буквы. Требуется преобразовать её так, чтобы строчные буквы стали заглавными, а заглавные — строчными. К примеру, исходная строка "aB!cDEf" преобразуется в "Ab!CdeF". Для этого можно использовать цикл for, строковые методы upper() и lower(), а также isupper() и islower() для проверки регистра.
- Метод isdigit() позволяет проверить, состоит ли строка исключительно из цифр. Напишите программу, запрашивающую ввод двух целых чисел для последующего отображения их суммы. При вводе некорректных данных программа должна продолжать запрашивать ввод, не завершаясь с ошибкой. Использование обработчика исключений try-except не допускается.