Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 35
Текст из файла (страница 35)
Весь синтаксис языка Python следует этому общему принципу.В дополнение к простой возможности индексирования по номеру позиции, последовательности поддерживают более общую форму индексирования, известную как получение среза (slicing), которая обеспечивает возможность извлечения за одну операцию целого сегмента (среза). Например:>>> S‘Spam’>>> S[1:3]‘pa’# Строка из 4 символов# Срез строки S начиная со смещения 1 и до 2 (не 3)Проще всего можно представить себе срез как способ извлечения целого столбца из строки за один шаг. В общем виде синтаксис операции получения срезавыглядит как: X[I:J], и означает: «извлечь из X все, начиная со смещения I и досмещения J, но не включая его». В качестве результата возвращается новыйобъект.
Например, последняя операция из примера выше вернет все символыстроки S со смещениями с 1 по 2 (то есть 3 – 1 символов) в виде новой строки.В результате получается срез, или «выборка» двух символов из середины.128Глава 4. Введение в типы объектов языка PythonПри выполнении операции получения среза левая граница по умолчанию принимается равной нулю, а правая – длине последовательности, к которой применяется операция. В результате мы получаем следующие наиболее распространенные варианты использования:>>> S[1:]‘pam’>>> S‘Spam’>>> S[0:3]‘Spa’>>> S[:3]‘Spa’>>> S[:-1]‘Spa’>>> S[:]‘Spam’# Все, кроме первого элемента (1:len(S))# Сама строка S без изменений# Все, кроме последнего элемента# То же, что и S[0:3]# Еще раз все, кроме последнего элемента, но проще (0:-1)# Все содержимое S, как обычная копия (0:len(S))Обратите внимание, что в качестве границ срезов можно использовать отрицательные индексы и что последняя операция фактически создает копию всейстроки.
Как мы узнаем позднее, нет смысла копировать строки таким способом, но такая форма копирования очень удобна при работе с другими последовательностями, такими как списки.Наконец, будучи последовательностями, строки поддерживают операцию конкатенации, которая записывается в виде знака плюс (объединение двух строкв одну строку), и операцию повторения (новая строка создается за счет многократного повторения другой строки):>>> S‘Spam’>>> S + ‘xyz’# Конкатенация‘Spamxyz’>>> S# S остается без изменений‘Spam’>>> S * 8# Повторение‘SpamSpamSpamSpamSpamSpamSpamSpam’Обратите внимание, что знак плюс (+) имеет различное значение для разныхобъектов: для чисел – сложение, а для строк – конкатенация. Это универсальное свойство языка Python, которое далее в книге будет называться полиморфизмом, означает, что фактически выполняемая операция зависит от объектов, которые принимают в ней участие.
Как будет показано, когда мы приступим к изучению динамической типизации, такой полиморфизм в значительной степени обеспечивает выразительность и гибкость программного кода наязыке Python. Поскольку отсутствуют ограничения, связанные с типами, операции в языке Python обычно в состоянии автоматически обрабатывать объекты самых разных типов, при условии, что они поддерживают совместимый интерфейс (как в данном случае операция +). В языке Python идея полиморфизмаявляется ключевой концепцией, которую мы будем рассматривать далее в этойкниге.НеизменяемостьОбратите внимание: в предыдущих примерах ни одна из использованных операций не изменяла оригинальную строку. Все операции над строками в ре-129Строкизультате создают новую строку, потому что строки в языке Python являютсянеизменяемыми – после того, как строка будет создана, ее нельзя изменить.Например, вы не сможете изменить строку присвоением значения одной из еепозиций, но вы всегда можете создать новую строку и присвоить ей то же самоеимя.
Поскольку Python очищает память, занятую ненужными больше объектами (как будет показано позднее), такой подход не так уж неэффективен, какмогло бы показаться на первый взгляд:>>> S‘Spam’>>> S[0] = ‘z’# Неизменяемые объекты нельзя изменить...текст сообщения об ошибке опущен...TypeError: ‘str’ object does not support item assignment>>> S = ‘z’ + S[1:] # Но с помощью выражений мы можем создавать новые объекты>>> S‘zpam’Все объекты в языке Python либо относятся к классу неизменяемых, либо нет.Если говорить о базовых типах, то числа, строки и кортежи являются неизменяемыми, а списки и словари – нет (они легко могут изменяться в любой своейчасти). Помимо всего неизменяемость может рассматриваться как гарантия,что некоторый объект будет оставаться постоянным на протяжении работыпрограммы.Методы, специфичные для типаВсе строковые операции, которые мы до сих пор рассматривали, в действительности являются операциями над последовательностями, то есть эти операции могут использоваться для работы с любыми последовательностями языкаPython, включая списки и кортежи.
Однако помимо операций, универсальныхдля последовательностей, строки также имеют свои собственные операции, реализованные в виде методов (функций, присоединенных к объекту, которыезапускаются выражением вызова).Например, метод строк find выполняет поиск подстроки в строке (он возвращает смещение переданной ему подстроки или -1, если поиск не увенчался успехом), а метод replace производит глобальный поиск с заменой:>>> S.find(‘pa’)# Поиск смещения подстроки1>>> S‘Spam’>>> S.replace(‘pa’, ‘XYZ’) # Замена одной подстроки другой‘SXYZm’>>> S‘Spam’И снова независимо от имен этих строковых методов, применяя методы, мыне изменяем оригинальную строку, а создаем новую, т. к.
строки являются неизменяемыми, и это следует учитывать. Строковые методы – это первый уровень в комплекте инструментальных средств обработки текста языка Python.Другие методы позволяют разбивать строки на подстроки по определенномусимволу-разделителю (достаточно удобно для простых случаев разбора строк),преобразовывать регистр символов, проверять тип содержимого строк (цифры,130Глава 4. Введение в типы объектов языка Pythonалфавитные символы и так далее) и отсекать пробельные символы с обоих концов строк.>>> line = ‘aaa,bbb,ccccc,dd’>>> line.split(‘,’) # Разбивает строку по разделителю и создает список строк[‘aaa’, ‘bbb’, ‘ccccc’, ‘dd’]>>> S = ‘spam’>>> S.upper()# Преобразование символов в верхний и в нижний регистр‘SPAM’>>> S.isalpha()True# Проверка содержимого: isalpha, isdigit и так далее>>> line = ‘aaa,bbb,ccccc,dd\n’>>> line = line.rstrip() # Удаляет завершающие пробельные символы>>> line‘aaa,bbb,ccccc,dd’Кроме того, строки поддерживают операции подстановки, известные как форматирование и доступные как в виде выражений (существовали изначально),так и в виде методов строк (появились в версиях 2.6 и 3.0):>>> ‘%s, eggs, and %s’ % (‘spam’, ‘SPAM!’)# Выражение (во всех версиях)‘spam, eggs, and SPAM!’>>> ‘{0}, eggs, and {1}’.format(‘spam’, ‘SPAM!’) # Метод (2.6, 3.0)‘spam, eggs, and SPAM!’Следует заметить, что в отличие от универсальных операций, применяемыхк последовательностям, строковые методы могут применяться только к строкам и ни к каким другим объектам, хотя некоторые типы могут иметь методы с похожими именами.
Следует понимать, что инструментальные средстваязыка Python������������������������������������������������������������������������������������������������������������������������������делятся на несколько уровней: универсальные операции, которые могут применяться к нескольким типам, реализованы в виде встроенныхфункций и выражений (например, len(X), X[0]), а операции, специфичные дляопределенного типа, реализованы в виде методов (например, aString.upper()).Выбор требуемых инструментов из всех этих категорий станет более простымпо мере изучения языка Python, а в следующем разделе приводится несколькорекомендаций, которые вы сможете использовать уже сейчас.Получение помощиМетоды, представленные в предыдущем разделе, являются лишь небольшойчастью того, что доступно при работе со строковыми объектами.
Вообще, этакнига не является исчерпывающим источником информации о методах объектов. Чтобы получить дополнительную информацию, вы всегда можете воспользоваться функцией dir, которая возвращает список всех доступных атрибутов заданного объекта. Предположим, что переменная S по-прежнему остается строкой; ниже приводится список ее атрибутов в Python 3.0 (в Python 2.6этот список немного отличается):>>> dir(S)[‘__add__’, ‘__class__’, ‘__contains__’, ‘__delattr__’, ‘__doc__’, ‘__eq__’,‘__format__’, ‘__ge__’, ‘__getattribute__’, ‘__getitem__’, ‘__getnewargs__’,‘__gt__’, ‘__hash__’, ‘__init__’, ‘__iter__’, ‘__le__’, ‘__len__’, ‘__lt__’,‘__mod__’, ‘__mul__’, ‘__ne__’, ‘__new__’, ‘__reduce__’, ‘__reduce_ex__’,131Строки‘__repr__’, ‘__rmod__’, ‘__rmul__’, ‘__setattr__’, ‘__sizeof__’, ‘__str__’,‘__subclasshook__’, ‘_formatter_field_name_split’, ‘_formatter_parser’,‘capitalize’, ‘center’, ‘count’, ‘encode’, ‘endswith’, ‘expandtabs’, ‘find’,‘format’, ‘index’, ‘isalnum’,’isalpha’, ‘isdecimal’, ‘isdigit’, ‘isidentifier’,‘islower’, ‘isnumeric’, ‘isprintable’, ‘isspace’, ‘istitle’, ‘isupper’, ‘join’,‘ljust’, ‘lower’, ‘lstrip’, ‘maketrans’, ‘partition’, ‘replace’, ‘rfind’, ‘rindex’,‘rjust’, ‘rpartition’, ‘rsplit’, ‘rstrip’, ‘split’, ‘splitlines’, ‘startswith’,‘strip’, ‘swapcase’, ‘title’, ‘translate’, ‘upper’, ‘zfill’]Скорее всего, вам не понадобятся имена из этого списка, содержащие символыподчеркивания, до того момента, пока мы не приступим к изучению возможности перегрузки операторов в классах, – они представляют собой реализацию строкового объекта и доступны для поддержки специализации.