Главная страница

Математический анализ. 3е издание


Скачать 4.86 Mb.
Название3е издание
АнкорМатематический анализ
Дата04.02.2022
Размер4.86 Mb.
Формат файлаpdf
Имя файлаpython_01.pdf
ТипДокументы
#351981
страница16 из 98
1   ...   12   13   14   15   16   17   18   19   ...   98
S # Строка из 4 символов
'Spam'
>>> S[1:3] # Срез строки S начиная со смещения 1 и до 2 (не 3)
'pa'
Проще всего можно представить себе срез как способ извлечения цело
го столбца из строки за один шаг. В общем виде синтаксис операции получения среза выглядит как X[I:J] и означает: «извлечь из X все, счи
тая со смещения I и до смещения J, но не включая его». В качестве ре
зультата возвращается новый объект. Например, последняя операция из примера выше вернет все символы строки S со смещениями с 1 по 2

118
Глава 4. Введение в типы объектов языка Python
(то есть 31 штук) в виде новой строки. В результате получается срез,
или выборка двух символов из середины.
При выполнении операции получения среза левая граница по умолча
нию принимается равной нулю, а правая – длине последовательности,
к которой применяется операция. В результате мы получаем следую
щие наиболее распространенные варианты использования:
>>> S[1:] # Все, кроме первого элемента (1:len(S))
'pam'
>>> S # Сама строка S без изменений
'Spam'
>>> S[0:3] # Все, кроме последнего элемента
'Spa'
>>> S[:3] # То же, что и S[0:3]
'Spa'
>>> S[: 1] # Еще раз все, кроме последнего элемента, но проще (0:1)
'Spa'
>>> S[:] # Все содержимое S, как обычная копия (0:len(S))
'Spam'
Обратите внимание, что в качестве границ срезов можно использовать отрицательные индексы и что последняя операция фактически созда
ет копию всей строки. Как мы узнаем позднее, нет смысла копировать строки таким способом, но такая форма копирования очень удобна при работе с другими последовательностями, такими как списки.
Наконец, будучи последовательностями, строки поддерживают опера
цию конкатенации, которая записывается в виде знака плюс (объеди
нение двух строк в одну строку), и операцию повторения (новая стро
ка создается за счет многократного повторения другой строки):
>>> S
'Spam'
>>> S + 'xyz' # Конкатенация
'Spamxyz'
>>> S # S остается без изменений
'Spam'
>>> S * 8 # Повторение
'SpamSpamSpamSpamSpamSpamSpamSpam'
Обратите внимание, что знак плюс (+) имеет различное значение для разных объектов: для чисел – сложение, а для строк – конкатенация.
Это универсальное свойство языка Python, которое далее в книге будет названо полиморфизмом, означает, что фактически выполняемая опе
рация зависит от объектов, которые принимают в ней участие. Как бу
дет показано, когда мы приступим к изучению динамической типиза
ции, такой полиморфизм в значительной степени обеспечивает выра
зительность и гибкость программного кода на языке Python. Посколь
ку отсутствуют ограничения, связанные с типами, операции в языке
Python обычно в состоянии автоматически обрабатывать объекты са
мых разных типов, при условии, что они поддерживают совместимый

Строки
119
интерфейс (как в данном случае операция +). В языке Python идея по
лиморфизма является ключевой концепцией, которую мы будем рас
сматривать далее в этой книге.
Неизменяемость
Обратите внимание: в предыдущих примерах ни одна из использован
ных операций не изменяла оригинальную строку. Все операции над строками в результате создают новую строку, потому что строки в язы
ке Python являются неизменяемыми – после того, как строка будет создана, ее нельзя изменить. Например, вы не сможете изменить стро
ку присвоением значения одной из ее позиций, но вы всегда можете создать новую строку и присвоить ей то же самое имя. Поскольку Py
thon очищает память, занятую не нужными больше объектами (как будет показано позднее), такой подход не так уж неэффективен, как могло бы показаться на первый взгляд:
>>> S
'Spam'
>>> S[0] = 'z' # Неизменяемые объекты нельзя изменить
...текст сообщения об ошибке опущен...
TypeError: 'str' object does not support item assignment
>>> S = 'z' + S[1:] # Но с помощью выражений мы можем
# создавать новые объекты
>>> S
'zpam'
Все объекты в языке Python либо относятся к классу неизменяемых,
либо нет. Если говорить о базовых типах, то числа, строки и кортежи являются неизменяемыми, а списки и словари – нет (они легко могут изменяться в любой своей части). Помимо всего, неизменяемость мо
жет рассматриваться как гарантия, что некоторый объект будет оста
ваться постоянным на протяжении работы программы.
Методы, специфичные для типа
Все строковые операции, которые мы до сих пор рассматривали, в дей
ствительности являются операциями над последовательностями, то есть эти операции могут использоваться для работы с любыми после
довательностями языка Python, включая списки и кортежи. Однако,
помимо операций, универсальных для последовательностей, строки также имеют свои собственные операции, выполненные в виде мето+
дов
(функции, присоединенные к объекту, которые запускаются выра
жением вызова).
Например, метод строк find выполняет поиск подстроки в строке (он возвращает смещение переданной ему подстроки или 1, если поиск не увенчался успехом), а метод replace производит глобальный поиск с за
меной:

120
Глава 4. Введение в типы объектов языка Python
>>> S.find('pa') # Поиск смещения подстроки
1
>>> S
'Spam'
>>> S.replace('pa', 'XYZ') # Замена одной подстроки другой
'SXYZm'
>>> S
'Spam'
И снова, независимо от имен этих строковых методов, мы не изменя
ем, применяя методы, оригинальную строку, а создаем новую, т. к.
строки являются неизменяемыми, и это следует учитывать. Строко
вые методы – это первый уровень в комплекте инструментальных средств обработки текста языка Python. Другие методы позволяют разбивать строки на подстроки по определенному символуразделите
лю (достаточно удобно для простых случаев разбора строк), преобразо
вывать регистр символов, проверять тип содержимого строк (цифры,
алфавитные символы и т. д.) и отсекать пробельные символы с обоих концов строк.
>>> line = 'aaa,bbb,ccccc,dd'
>>> line.split(',') # Разбивает строку по разделителю и создает список строк
['aaa', 'bbb', 'ccccc', 'dd']
>>> S = 'spam'
>>> S.upper() # Преобразование символов в верхний и в нижний регистр
'SPAM'
>>> S.isalpha() # Проверка содержимого: isalpha, isdigit и т. д.
True
>>> line = 'aaa,bbb,ccccc,dd\n'
>>> line = line.rstrip() # Удаляет завершающие пробельные символы
>>> line
'aaa,bbb,ccccc,dd'
Следует заметить, что в отличие от универсальных операций, приме
няемых к последовательностям, строковые методы могут применяться только к строкам и ни к каким другим объектам. Следует понимать, что инструментальные средства языка Python делятся на несколько уров
ней: универсальные операции, которые могут применяться к несколь
ким типам, реализованы в виде встроенных функций и выражений (на
пример, len(X), X[0]), а операции, специфичные для определенного ти
па, реализованы в виде методов (например, aString.upper()). Выбор тре
буемых инструментов из всех этих категорий станет более простым по мере изучения языка Python, а в следующем разделе приводится не
сколько рекомендаций, которые вы сможете использовать уже сейчас.
Получение помощи
Методы, представленные в предыдущем разделе, являются лишь не
большой частью того, что доступно при работе со строковыми объекта

Строки
121
ми. Вообще эта книга не является исчерпывающим источником ин
формации о методах объектов. Чтобы получить дополнительную ин
формацию, вы всегда можете воспользоваться функцией dir, которая возвращает список всех доступных атрибутов заданного объекта. По
скольку методы являются атрибутамифункциями, они также присут
ствуют в списке:
>>> dir(S)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
'__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__',
'__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__',
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__rmod__', '__rmul__', '__setattr__', '__str__', 'capitalize', 'center',
'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index',
'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper',
'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex',
'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines',
'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
Скорее всего, вам не понадобятся имена из этого списка, содержащие символы подчеркивания, до того момента, пока мы не приступим к изу
чению возможности перегрузки операторов в классах, – они представ
ляют собой реализацию строкового объекта и доступны для поддерж
ки настроек. Вообще ведущие и завершающие символы подчеркива
ния используются для обозначения механизмов внутренней реализа
ции. Имена без символов подчеркивания в этом списке обозначают методы строковых объектов.
Функция dir возвращает лишь имена методов. Чтобы узнать назначе
ние того или иного метода, можно передать его имя функции help:
>>> help(S.index)
Help on builtin function index:
(Справка о встроенной функции index:)
index(...)
S.index(sub [,start [,end]]) > int
Like S.find() but raise ValueError when the substring is not found.
(Сходна с функцией S.find(), но вызывает ошибку ValueError, если подстрока не найдена)
Функция help – один из немногих интерфейсов к системе программно
го кода Python, который поставляется в составе интерпретатора под названием PyDoc – инструмент, который позволяет извлекать описа
ние из объектов. Далее в этой же книге вы узнаете, что PyDoc позволя
ет отображать информацию в формате HTML.
Можно запросить информацию и для самого строкового объекта (на
пример, help(S)), но в этом случае вы можете получить больше инфор
мации, чем хотелось бы, – описание всех строковых методов. Часто бывает удобнее запрашивать информацию о конкретном методе, как это было продемонстрировано выше.

122
Глава 4. Введение в типы объектов языка Python
За дополнительной информацией всегда можно обратиться к справоч
ному руководству по стандартной библиотеке или к печатным спра
вочным изданиям, но функции dir и help в языке Python представляют собой самое первое средство получения доступа к документации.
Другие способы представления строк
К этому моменту мы познакомились с операциями над последователь
ностями и методами, специфичными для строк. Однако, кроме этого,
язык программирования Python предоставляет несколько различных способов представления строк в программном коде, которые мы будем исследовать позднее (включая служебные символы, которые представ
лены, например, в виде последовательностей, начинающихся с симво
ла обратного слеша):
>>> S = 'A\nB\tC' # \n – это символ "конец строки", \t – символ табуляции
>>> len(S) # Каждая из этих пар соответствует единственному символу
5
>>> ord('\n') # В ASCII \n – это байт с числовым значением 10
10
>>> S = 'A\0B\0C' # \0 – это двоичный ноль, не является завершителем строки
>>> len(S)
5
Язык Python допускает заключать строки в кавычки или в апострофы
(они означают одно и то же). Кроме того, имеется специальная форма определения многострочных строковых литералов – тройные кавычки или апострофы. Когда используется такая форма, все строки в про
граммном коде объединяются в одну строку, а там, где в исходном тек
сте выполняется переход на новую строку, вставляется символ «конец строки». Это незначительное синтаксическое удобство весьма полезно для оформления в сценариях на языке Python крупных блоков текста,
таких как разметка HTML или XML:
>>> msg = """
aaaaaaaaaaaaa
bbb'''bbbbbbbbbb""bbbbbbb'bbbb
cccccccccccccc"""
>>> msg
'\naaaaaaaaaaaaa\nbbb\'\'\'bbbbbbbbbb""bbbbbbb\'bbbb\ncccccccccccccc'
Кроме того, Python предоставляет поддержку «неформатированных»
строковых литералов, в которых символ обратного слеша интерпрети
руется как обычный символ (они начинаются с символа r), а также поддержку строк с символами Юникода, обеспечивающих интерна
ционализацию (такие строки начинаются с символа u и состоят из многобайтовых символов). С технической точки зрения строка с сим
волами Юникода представляет собой иной тип данных, отличный от обычной строки, но он поддерживает те же самые строковые опера

Списки
123
ции. В последующих главах мы встретимся с этими специальными формами строк.
Поиск по шаблону
Прежде чем двинуться дальше, хочется заметить, что ни один из стро
ковых объектов не поддерживает возможность обработки текста на ос
нове шаблонов. Рассмотрение инструментов, выполняющих поиск текста по шаблону, выходит за рамки этой книги, но для читателей,
знакомых с другими языками сценариев, будет интересно узнать, как выполняется поиск по шаблону в языке Python – для этого необходимо импортировать модуль с именем re. Этот модуль содержит аналогич
ные функции для выполнения поиска, разбиения и замены, но за счет использования шаблонов мы можем использовать более общие вариан
ты решения задач:
>>> import re
>>> match = re.match('Hello[ \t]*(.*)world', 'Hello Python world')
>>> match.group(1)
'Python '
В этом примере выполняется поиск строки, начинающейся со слова
«Hello», вслед за которым следуют ноль или более символов табуля
ции или пробелов, за которыми могут следовать произвольные симво
лы, которые будут сохранены, как группа совпадения, и завершаю
щаяся словом «world». Если такая подстрока будет найдена, части ее,
соответствующие шаблону, заключенному в круглые скобки, будут доступны в виде групп. Например, следующий шаблон извлекает три группы, разделенные символами слеша:
>>> match = re.match('/(.*)/(.*)/(.*)', '/usr/home/lumberjack')
>>> match.groups()
('usr', 'home', 'lumberjack')
Поиск по шаблону реализован в виде чрезвычайно сложного механиз
ма обработки текста, но в языке Python имеется поддержка еще более сложных механизмов, включая возможность обработки естественного языка человеческого общения. Впрочем, для этого руководства я и так сказал уже достаточно об обработке строк, поэтому теперь мы перей
дем к рассмотрению другого типа.
Списки
Списки – это самое общее представление последовательностей, реали
зованных в языке Python. Списки – это упорядоченные по местополо
жению коллекции объектов произвольных типов, размер которых не ограничен. Кроме того, в отличие от строк, списки являются изменяе
мыми – они могут модифицироваться как с помощью операций при
сваивания по смещениям, так и с помощью разнообразных методов ра
боты со списками.

124
Глава 4. Введение в типы объектов языка Python
Операции над последовательностями
Поскольку списки являются последовательностями, они поддерживают все операции над последовательностями, которые обсуждались в разде
ле, посвященном строкам. Единственное отличие состоит в том, что результатом таких операций являются списки, а не строки. Напри
мер, для списка, состоящего из трех элементов:
>>> L = [123, 'spam', 1.23] # Список из трех объектов разных типов
>>> len(L) # Число элементов в списке
3
Мы можем обращаться к элементам списка по их индексам, получать срезы и т. д., точно так же, как и в случае со строками:
>>> L[0] # Доступ к элементу списка по его индексу
123
>>> L[: 1] # Операция получения среза возвращает новый список
[123, 'spam']
>>> L + [4, 5, 6] # Операция конкатенации также возвращает новый список
[123, 'spam', 1.23, 4, 5, 6]
>>> L # Наши действия не привели к изменению оригинального списка
[123, 'spam', 1.23]
Методы, специфичные для типа
Списки в языке Python являются аналогом массивов в других языках программирования, но они обладают более широкими возможностя
ми. С одной стороны, они не ограничены одним типом элементов, на
пример, только что рассмотренный список содержит три элемента со
вершенно разных типов (целое число, строку и число с плавающей точкой). Кроме того, размер списков не ограничен, благодаря чему они могут увеличиваться и уменьшаться по мере необходимости в резуль
тате выполнения операций, характерных для списков:
>>> L.append('NI') # Увеличение: в конец списка добавляется новый объект
>>> L
[123, 'spam', 1.23, 'NI']
>>> L.pop(2) # Уменьшение: удаляется элемент из середины списка
1.23
>>> L # Инструкция "del L[2]" также удалит элемент списка
[123, 'spam', 'NI']
В данном примере метод append увеличивает размер списка и вставляет в конец новый элемент. Метод pop (или эквивалентная ему инструкция del
) удаляет из списка элемент с заданным смещением, что приводит к уменьшению списка. Другие методы списков позволяют вставлять новые элементы в произвольное место списка (insert), удалять эле
мент, заданный значением (remove), и т. д. Так как списки являются

Списки
125
изменяемыми, большинство методов списков не создают новый спи
сок, а изменяют оригинальный список:
>>> M = ['bb', 'aa', 'cc']
>>> M.sort()
>>> M
['aa', 'bb', 'cc']
>>> M.reverse()
>>> M
['cc', 'bb', 'aa']
Метод sort, использованный в этом примере, по умолчанию упорядочи
вает элементы списка по возрастанию, а метод reverse – по убыванию.
В обоих случаях происходит непосредственное изменение самого списка.
1   ...   12   13   14   15   16   17   18   19   ...   98


написать администратору сайта