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

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


Скачать 4.86 Mb.
Название3е издание
АнкорМатематический анализ
Дата04.02.2022
Размер4.86 Mb.
Формат файлаpdf
Имя файлаpython_01.pdf
ТипДокументы
#351981
страница27 из 98
1   ...   23   24   25   26   27   28   29   30   ...   98
reply = """
Greetings...
Hello %(name)s!
Your age squared is %(age)s
"""
>>> values = {'name': 'Bob', 'age': 40}
>>> print reply % values
Greetings...
Hello Bob!
Your age squared is 40
Этот способ также часто используется в комбинации со встроенной функцией vars, которая возвращает словарь, содержащий все перемен
ные, существующие на момент ее вызова:
>>> food = 'spam'
>>> age = 40

204
Глава 7. Строки
>>> vars()
{'food': 'spam', 'age': 40, ...и еще множество других... }
Если применить эту функцию в правой части оператора форматирова
ния, можно отформатировать значения, обращаясь к ним по именам переменных (то есть по ключам словаря):
>>> "%(age)d %(food)s" % vars()
'40 spam'
Словари во всех подробностях мы будем изучать в главе 8. А в главе 5
вы найдете примеры использования спецификаторов %x и %o для преоб
разования значений в шестнадцатеричное и восьмеричное строковое представление.
Строковые методы
В дополнение к операторам выражений строки предоставляют набор
методов
, реализующих более сложные операции обработки текста.
Методы – это простые функции, которые связаны с определенными объектами. Формально они являются атрибутами, присоединенными к объектам, которые ссылаются на функции. В языке Python методы являются специфичными для типов объектов: строковые методы, на
пример, работают только с строковыми объектами.
Если говорить более точно, функции – это пакеты программного кода,
а вызовы методов объединяют в себе выполнение двух операций (из
влечение атрибута и вызов функции).
Извлечение атрибута
Выражение в форме object.attribute означает: «извлечь значение атрибута attribute из объекта object».
Вызов функции
Выражение в форме function(arguments) означает: «вызвать про
граммный код функции function, передав ему ноль или более объек
товаргументов, разделенных запятыми, и вернуть значение функ
ции».
Объединение этих двух действий позволяет вызвать метод объекта.
Выражение вызова метода object.method(arguments) вычисляется слева направо, то есть интерпретатор сначала извлекает метод объекта, а за
тем вызывает его, передавая ему входные аргументы. Если метод воз
вращает какойлибо результат, он становится результатом всего выра
жения вызова метода.
Как будет много раз показано в этой части книги, большинство объек
тов обладает методами, которые можно вызвать, и все они доступны с использованием одного и того же синтаксиса вызова метода. Чтобы вызвать метод объекта, вам потребуется существующий объект. Да
вайте перейдем к рассмотрению некоторых примеров.

Строковые методы
205
Примеры использования строковых методов:
изменение строк
В табл. 7.4 приводятся шаблоны вызова встроенных строковых методов
(более полный и обновленный перечень методов вы найдете в руковод
стве по стандартной библиотеке языка Python или воспользовавшись функцией help в интерактивной оболочке, передав ей любую строку).
Строковые методы, представленные в этой таблице, реализуют высоко
уровневые операции, такие как разбиение и слияние, преобразование регистра символов, проверка типа содержимого и поиск подстроки.
Таблица 7.4. Строковые методы
Теперь давайте поработаем над программным кодом, который демон
стрирует некоторые наиболее часто используемые методы в действии и попутно иллюстрирует основные приемы обработки текста, приме
няемые в языке Python. Как уже говорилось ранее, строки являются неизменяемыми объектами, поэтому их невозможно изменить непо
средственно. Чтобы из существующей строки сконструировать новое текстовое значение, необходимо создать новую строку с помощью та
ких операций, как извлечение подстроки и конкатенация. Например,
чтобы изменить два символа в середине строки, можно использовать такой способ:
>>> S = 'spammy'
>>> S = S[:3] + 'xx' + S[5:]
S.capitalize()
S.ljust(width)
S.center(width)
S.lower()
S.count(sub [, start [, end]])
S.lstrip()
S.encode([encoding [,errors]])
S.replace(old, new [, maxsplit])
S.endswith(suffix [, start [, end]])
S.rfind(sub [,start [,end]])
S.expandtabs([tabsize])
S.rindex(sub [, start [, end]])
S.find(sub [, start [, end]])
S.rjust(width)
S.index(sub [, start [, end]])
S.rstrip()
S.isalnum() S.split([sep
[,maxsplit]])
S.isalpha() S.splitlines([keepends])
S.isdigit()
S.startswith(prefix [, start [, end]])
S.islower()
S.strip()
S.isspace()
S.swapcase()
S.istitle()
S.title()
S.isupper()
S.translate(table [, delchars])
S.join(seq)
S.upper()

206
Глава 7. Строки
>>> S
'spaxxy'
При этом, если требуется только заменить подстроку, можно восполь
зоваться методом replace:
>>> S = 'spammy'
>>> S = S.replace('mm', 'xx')
>>> S
'spaxxy'
Метод replace является более универсальным, чем предполагает этот программный код. Он принимает в качестве аргумента оригинальную подстроку (любой длины) и строку (любой длины) замены и выполняет глобальный поиск с заменой:
>>> 'aa$bb$cc$dd'.replace('$', 'SPAM')
'aaSPAMbbSPAMccSPAMdd'
В этой роли метод replace может использоваться как инструмент реа
лизации поиска с заменой по шаблону (например, замены символов формата). Обратите внимание, что на этот раз мы просто выводим ре
зультат на экран, а не присваиваем его переменной – присваивать ре
зультат переменной необходимо только в том случае, если потребуется сохранить результат дальнейшего использования.
Если необходимо заменить одну подстроку фиксированного размера,
которая может появиться в любом месте, можно также выполнить опе
рацию замены или отыскать подстроку с помощью метода find и затем воспользоваться операциями извлечения подстроки:
>>> S = 'xxxxSPAMxxxxSPAMxxxx'
>>> where = S.find('SPAM') # Поиск позиции
>>> where # Подстрока найдена со смещением 4
4
>>> S = S[:where] + 'EGGS' + S[(where+4):]
>>> S
'xxxxEGGSxxxxSPAMxxxx'
Метод find возвращает смещение, по которому найдена подстрока (по умолчанию поиск начинается с начала строки), или значение 1, если искомая подстрока не найдена. Другой вариант использования метода replace заключается в передаче третьего аргумента, который опреде
ляет число производимых замен:
>>> S = 'xxxxSPAMxxxxSPAMxxxx'
>>> S.replace('SPAM', 'EGGS') # Заменить все найденные подстроки
'xxxxEGGSxxxxEGGSxxxx'
>>> S.replace('SPAM', 'EGGS', 1) # Заменить одну подстроку
'xxxxEGGSxxxxSPAMxxxx'
Обратите внимание: метод replace возвращает новую строку. Так как строки являются неизменяемыми, методы никогда в действительно

Строковые методы
207
сти не изменяют оригинальную строку, даже если они называются
«replace» (заменить)!
Тот факт, что операция конкатенации и метод replace всякий раз соз
дают новые строковые объекты, может оказаться недостатком их ис
пользования для изменения строк. Если в сценарии производится множество изменений длинных строк, вы можете повысить произво
дительность сценария, преобразовав строку в объект, который допус
кает внесение изменений:
>>> S = 'spammy'
>>> L = list(S)
>>> L
['s', 'p', 'a', 'm', 'm', 'y']
Встроенная функция list (или функцияконструктор объекта) создает новый список из элементов любой последовательности – в данном слу
чае «разрывая» строку на символы и формируя из них список. Обла
дая строкой в таком представлении, можно производить необходимые изменения, не вызывая создания новой копии строки при каждом из
менении:
>>> L[3] = 'x' # Этот прием допустим для списков, но не для строк
>>> L[4] = 'x'
>>> L
['s', 'p', 'a', 'x', 'x', 'y']
Если после внесения изменений необходимо выполнить обратное пре
образование (чтобы, например, записать результат в файл), можно ис
пользовать метод join, который «собирает» список обратно в строку:
>>> S = ''.join(L)
>>> S
'spaxxy'
Метод join на первый взгляд может показаться немного странным.
Так как он является строковым методом (а не методом списка), он вы
зывается через указание желаемой строкиразделителя. Метод join объединяет строки из списка, вставляя строкуразделитель между элементами списка. В данном случае при получении строки из списка используется пустая строкаразделитель. В более общем случае можно использовать произвольную строкуразделитель:
>>> 'SPAM'.join(['eggs', 'sausage', 'ham', 'toast'])
'eggsSPAMsausageSPAMhamSPAMtoast'
Примеры методов строк: разбор текста
Еще одна распространенная роль, которую играют методы строк, – это простейший разбор текста, то есть анализ структуры и извлечение подстрок. Для извлечения подстрок из фиксированных смещений можно использовать прием извлечения срезов:

208
Глава 7. Строки
>>> line = 'aaa bbb ccc'
>>> col1 = line[0:3]
>>> col3 = line[8:]
>>> col1
'aaa'
>>> col3
'ccc'
В этом примере поля данных располагаются в фиксированных позици
ях и потому могут быть легко извлечены из оригинальной строки.
Этот прием может использоваться, только если анализируемые компо
ненты располагаются в известных фиксированных позициях. Если для разделения полей используется некоторый разделитель, можно воспользоваться методом разбиения строки на компоненты. Этот при
ем используется, когда искомые данные могут располагаться в произ
вольных позициях внутри строки:
>>> line = 'aaa bbb ccc'
>>> cols = line.split()
>>> cols
['aaa', 'bbb', 'ccc']
Строковый метод split преобразует строку в список подстрок, окру
жающих строкиразделители. В предыдущем примере мы не указали строкуразделитель, поэтому в данном случае по умолчанию в качест
ве разделителей принимаются пробельные символы – строка разбива
ется на группы по символам пробела, табуляции или перевода строки,
и в результате мы получили список подстрок. В других случаях дан
ные могут отделяться другими разделителями. В следующем примере производится разбиение (и, следовательно, разбор) строки по символу запятой, который обычно используется для отделения данных, извле
ченных из баз данных:
>>> line = 'bob,hacker,40'
>>> line.split(',')
['bob', 'hacker', '40']
Разделители могут содержать более одного символа:
>>> line = "i'mSPAMaSPAMlumberjack"
>>> line.split("SPAM")
["i'm", 'a', 'lumberjack']
Хотя оба способа, основанные на извлечении подстрок и разбиении строк, имеют определенные ограничения, они работают достаточно быстро и могут использоваться для разбора текстовой информации в простых случаях.
Другие часто используемые методы строк в действии
Другие строковые методы имеют более специфическое предназначение,
например, удаляют пробельные символы в конце текстовой строки, вы

Строковые методы
209
полняют преобразование регистра символов, проверяют характер со
держимого строки и проверяют наличие подстроки в конце строки:
>>> line = "The knights who sy Ni!\n"
>>> line.rstrip()
'The knights who sy Ni!'
>>> line.upper()
'THE KNIGHTS WHO SY NI!\n'
>>> line.isalpha()
False
>>> line.endswith('Ni!\n')
True
Для достижения тех же результатов в некоторых случаях могут исполь
зоваться альтернативные приемы – с использованием оператора провер
ки вхождения in можно проверить присутствие подстроки, например,
а функция получения длины строки и операция извлечения подстроки могут использоваться для имитации действия функции endswith:
>>> line
'The knights who sy Ni!\n'
>>> line.find('Ni') != 1 # Поиск с использованием вызова метода или выражения
True
>>> 'Ni' in line
True
>>> sub = 'Ni!\n'
>>> line.endswith(sub) # Проверка наличия подстроки в конце строки
True # с помощью метода или операции извлечения подстроки
>>> line[ len(sub):] == sub
True
Для работы со строками существует достаточно много методов, однако мы не будем рассматривать их все. Некоторые методы вы увидите да
лее в этой книге, а за дополнительной информацией вы можете обра
титься к руководству по библиотеке языка Python и другим источни
кам информации или просто поэкспериментировать с ними в интерак
тивном режиме.
Обратите внимание: ни один из строковых методов не поддерживает шаблоны, для обработки текста с использованием шаблонов необходи
мо использовать модуль re, входящий в состав стандартной библиоте
ки языка Python, – дополнительный инструмент, начальные сведения о котором приводились в главе 4, а полное его обсуждение выходит да
леко за рамки этой книги. Тем не менее, несмотря на это ограничение,
строковые методы иногда оказываются эффективнее, чем функции модуля re.
Оригинальный модуль string
История развития строковых методов достаточно запутанна. В тече
ние первого десятилетия существования Python в состав стандартной

210
Глава 7. Строки библиотеки входил модуль string, который содержал функции, во многом напоминающие современные строковые методы. В ответ на требования пользователей в версии Python 2.0 эти функции были пре
образованы в методы строковых объектов. Однако изза большого объема программного кода, уже написанного к тому времени, ориги
нальный модуль string был сохранен для обеспечения обратной со
вместимости.
Ныне вы должны использовать не оригинальный модуль string, а при
менять строковые методы. Фактически, как предполагается, ориги
нальные строковые функции, соответствующие методам, будут убра
ны из состава стандартной библиотеки языка Python в версии 3.0, ко
торая должна быть выпущена после выхода в свет этого издания. Од
нако, поскольку использование модуля string еще можно встретить в старом программном коде, мы коротко рассмотрим его.
В версии Python 2.5 попрежнему существует два способа использова
ния расширенных операций над строками: посредством вызова мето
дов и вызовом функций модуля string, которым в качестве аргумента передается объект строки. Например, допустим, что переменная X ссы
лается на объект строки, тогда вызов метода объекта будет выглядеть следующим образом:
X.method(arguments)
что эквивалентно вызову аналогичной функции из модуля string
(представим, что этот модуль уже был импортирован):
string.method(X, arguments)
В следующем примере демонстрируется порядок использования метода:
>>> S = 'a+b+c+'
>>> x = S.replace('+', 'spam')
>>> x
'aspambspamcspam'
Чтобы выполнить ту же самую операцию с помощью модуля string, не
обходимо импортировать модуль (по крайней мере, один раз) и пере
дать функции объект:
>>> import string
>>> y = string.replace(S, '+', 'spam')
>>> y
'aspambspamcspam'
Поскольку подход, основанный на применении модуля, был стандар
том на протяжении многих лет, а строки являются одним из централь
ных компонентов большинства программ, при анализе существующих программ вам в программном коде наверняка встретятся оба варианта работы со строками.
И, тем не менее, при создании новых программ вместо функций уста
ревшего модуля вы должны использовать строковые методы. Для это

Общие категории типов
211
го есть и другие серьезные основания помимо того, что многие функ
ции модуля string будут исключены из состава стандартной библиоте
ки с выходом Python 3.0. Одна из таких причин – схема вызова модуля требует от вас импортировать модуль string (при использовании стро
ковых методов ничего импортировать не нужно). Другая причина за
ключается в том, что при использовании функций модуля с клавиату
ры приходится вводить на несколько символов больше (когда модуль загружается с использованием инструкции import, а не from). И нако
нец, функции модуля выполняются несколько медленнее, чем методы
(в настоящее время функции модуля отображаются на вызовы мето
дов, в результате чего производятся дополнительные вызовы).
Оригинальный модуль string скорее всего останется в составе Python
3.0, потому что в нем присутствуют дополнительные средства работы со строками, включая предопределенные строковые константы и сис
тему шаблонных объектов (которая не описывается в этой книге; за дополнительной информацией обращайтесь к руководству по библио
теке языка Python). Если вы не хотите модифицировать свой про
граммный код после выхода версии 3.0, вы должны смотреть на базо
вые строковые функции как на призраки прошлого.
Общие категории типов
Теперь, когда мы исследовали строки, первый объект из коллекции языка Python, сделаем паузу, чтобы дать определение некоторым об
щим концепциям, применимым к большинству типов, которые будут рассматриваться дальше. Оказывается, что операции над встроенны
ми типами работают одинаково в случае применения их к типам одной категории, поэтому нам необходимо лишь определить эти категории.
К настоящему моменту мы исследовали только числа и строки, но так как они относятся к двум из трех основных категорий в языке Python,
то вы знаете о других типах гораздо больше, чем могли бы подумать.
Типы одной категории имеют общий набор операций
Как вы уже знаете, строки представляют собой неизменяемые последо
вательности: они не могут быть изменены непосредственно (неизменяе+
мые
) и являются упорядоченными коллекциями элементов, доступ к которым может осуществляться по величине смещения (последова+
тельности
). Оказывается, над последовательностями, которые мы бу
дем рассматривать в этой части книги, могут выполняться те же опера
ции, которые были продемонстрированы в этой главе, – конкатенация,
доступ к элементам по индексам, обход элементов в цикле и т. д. Фор
мально в языке Python существует три категории типов (и операций):
Числа
Поддерживают операции сложения, умножения и т. д.

1   ...   23   24   25   26   27   28   29   30   ...   98


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