справочник по Python. мм isbn 9785932861578 9 785932 861578
Скачать 4.21 Mb.
|
Отображения Объекты отображений представляют произвольные коллекции объектов, которые могут индексироваться другими коллекциями практически про- извольных ключей. В отличие от последовательностей, отображения явля- ются неупорядоченными коллекциями и могут индексироваться числами, строками и другими объектами. Отображения относятся к разряду изме- няемых коллекций. Единственным встроенным типом отображений являются словари, кото- рые представляют собой разновидность таблиц хешей, или ассоциативных массивов. В качестве ключей словаря допускается использовать любые не- изменяемые объекты (строки, числа, кортежи и так далее). Списки, слова- 72 Глава 3. Типы данных и объекты ри и кортежи, содержащие изменяемые объекты, не могут использоваться в качестве ключей (словари требуют, чтобы значения ключей оставались постоянными). Для выборки элементов из объекта отображения используется оператор индексирования по ключу m[k], где k – значение ключа. Если требуемый ключ отсутствует в словаре, возбуждается исключение KeyError. Функция len( m) возвращает количество элементов, хранящихся в отображении. Ме- тоды и операторы, применимые к словарям, перечислены в табл. 3.6. Таблица 3.6. Методы и операторы, поддерживаемые словарями Оператор или метод Описание len( m) Возвращает количество элементов в словаре m. m[k] Возвращает элемент словаря m с ключом k. m[k]=x Записывает в элемент m[k] значение x. del m[k] Удаляет элемент m[k]. k in m Возвращает True, если ключ k присутствует в словаре m. m.clear() Удаляет все элементы из словаря m. m.copy() Создает копию словаря m. m.fromkeys(s [,value]) Создает новый словарь с ключами, перечисленными в по- следовательности s, а все значения устанавливает равны- ми value. m.get(k [,v]) Возвращает элемент m[k], если таковой имеется, в против- ном случае возвращает v. m.has_key(k) Возвращает True, если в словаре m имеется ключ k, в про- тивном случае возвращает False. (Вместо этого метода ре- комендуется использовать оператор in. Доступен только в Python 2.) m.items() Возвращает последовательность пар (key, value). m.keys() Возвращает последовательность ключей. m.pop(k [,default]) Возвращает элемент m[k], если таковой имеется, и удаляет его из словаря; в противном случае возвращает default, если этот аргумент указан, или возбуждает исключение KeyError m.popitem() Удаляет из словаря случайную пару (key, value) и возвра- щает ее в виде кортежа. m.setdefault(k [, v]) Возвращает элемент m[k], если таковой имеется, в про- тивном случае возвращает значение v и создает новый элемент словаря m[k] = v. m.update(b) Добавляет все объекты из b в словарь m. m.values() Возвращает последовательность всех значений в словаре m. Встроенные типы представления данных 73 Б ольшинство методов, перечисленных в табл. 3.6, используются для извле- чения и манипулирования содержимым словарей. Метод m.clear() удаляет все элементы. Метод m.update(b) добавляет в текущее отображение все пары ( key,value) , присутствующие в отображении b. Метод m.get(k [,v]) извлека- ет объект и позволяет указывать необязательное значение по умолчанию v , которое будет возвращаться в случае отсутствия в словаре указанного ключа. Метод m.setdefault(k [,v]) напоминает метод m.get(), за исключением того, что он не только вернет значение v в случае отсутствия запрошенно- го ключа, но и создаст элемент m[k] = v. Если значение v не указано, по умолчанию будет использоваться значение None. Метод m.pop() возвращает элемент и одновременно удаляет его из словаря. Метод m.popitem() использу- ется для удаления содержимого словаря в цикле. Метод m.copy() выполняет поверхностное копирование элементов отображе- ния и помещает их в новое отображение. Метод m.fromkeys(s [,value]) созда- ет новое отображение с ключами, содержащимися в последовательности s. Полученное отображение будет иметь тот же тип, что и оригинал m. В каче- стве значений для всех элементов будет использовано значение None, если в необязательном аргументе value не задано альтернативное значение. Ме- тод fromkeys() определен, как метод класса, поэтому его можно вызывать относительно имени класса, например: dict.fromkeys(). Метод m.items() возвращает последовательность, содержащую пары (key, value) . Метод m.keys() возвращает последовательность всех ключей, а метод m.values() – последовательность всех значений. Единственной безопасной операцией над результатами этих методов являются итерации. В Python 2 результатом этих методов является список, но в Python 3 результатом яв- ляется итератор, позволяющий выполнить обход текущего содержимого отображения. Если программа будет использовать результаты этих мето- дов как итераторы, она будет совместима с обеими версиями Python. Если потребуется сохранить результаты этих методов как обычные данные, их следует скопировать и сохранить в списке. Например, items = list(m. items()) . Если программе достаточно просто получить список всех ключей, лучше использовать инструкцию keys = list(m). Множества Множества – это неупорядоченные коллекции уникальных элементов. В отличие от последовательностей, множества не поддерживают операции индексирования и получения срезов. От словарей их отличает отсутствие ключей, связанных с объектами. Элементы, помещаемые в множество, должны быть неизменяемыми. Существует два типа множеств: set – изме- няемое множество, и frozenset – неизменяемое множество. Оба типа мно- жеств создаются с помощью пары встроенных функций: s = set([1,5,10,15]) f = frozenset([‘a’,37,’hello’]) Обе функции, set() и frozenset(), заполняют создаваемое множество, вы- полняя итерации по значениям, хранящимся в аргументе. Оба типа мно- жеств поддерживают методы, перечисленные в табл. 3.7. 74 Глава 3. Типы данных и объекты Таблица 3.7. Методы и операторы, поддерживаемые множествами Метод Описание len( s) Возвращает количество элементов в множестве s. s.copy() Создает копию множества s. s.difference(t) Разность множеств. Возвращает все элементы из множества s, отсутствующие в t. s.intersection(t) Пересечение множеств. Возвращает все элементы, присутствующие в обоих множествах s и t. s.isdisjoint( t) Возвращает True, если множества s и t не имеют об- щих элементов. s.issubset(t) Возвращает True, если множество s является подмно- жеством t. s.issuperset( t) Возвращает True, если множество s является надмно- жеством t. s.symmetric_difference( t) Симметричная разность множеств. Возвращает все элементы, которые присутствуют в множестве s или t , но не в обоих сразу. s.union( t) Объединение множеств. Возвращает все элементы, присутствующие в множестве s или t. Методы s.difference(t), s.intersection(t), s.symmetric_difference(t) и s.union(t) реализуют стандартные математические операции над множествами. Воз- вращаемое значение имеет тот же тип, что и множество s (set или frozenset). Аргумент t может быть любым объектом языка Python, поддерживающим итерации. В число таких объектов входят множества, списки, кортежи и строки. Эти операции над множествами доступны также в виде математи- ческих операторов, которые подробнее описываются в главе 4. Дополнительно изменяемые множества (тип set) поддерживают методы, перечисленные в табл. 3.8. Таблица 3.8. Методы, поддерживаемые изменяемыми множествами Метод Описание s.add(item) Добавляет элемент item в s. Ничего не делает, если этот элемент уже имеется в множестве. s.clear() Удаляет все элементы из множества s. s.difference_update(t) Удаляет все элементы из множества s, которые при- сутствуют в t. s.discard(item) Удаляет элемент item из множества s. Ничего не де- лает, если этот элемент отсутствует в множестве. s.intersection_update(t) Находит пересечение s и t и оставляет результат в s. s.pop() Возвращает произвольный элемент множества и удаляет его из s. Встроенные типы представления структурных элементов программы 75 Метод Описание s.remove(item) У даляет элемент item из s. Если элемент item отсут- ствует в множестве, возбуждается исключение KeyError . s.symmetric_difference_ update(t) Находит симметричную разность s и t и оставляет результат в s. s.update( t) Добавляет все элементы t в множество s. t может быть другим множеством, последовательностью или любым другим объектом, поддерживающим итерации. Все эти операции изменяют само множество s. Аргумент t может быть лю- бым объектом, поддерживающим итерации. Встроенные типы представления структурных элементов программы Функции, классы и модули в языке Python являются объектами, которы- Python являются объектами, которы- являются объектами, которы- ми можно манипулировать, как обычными данными. В табл. 3.9 перечис- лены типы, которые используются для представления различных элемен- тов самих программ. Таблица 3.9. Встроенные типы Python для представления структурных элементов программ Категория типов Имя типа Описание Вызываемые types.BuiltinFunctionType type object types.FunctionType types.MethodType Встроенные функции и методы Тип встроенных типов и классов Родоначальник всех типов и классов Пользовательские функции Методы классов Модули types.ModuleType Модуль Классы object Родоначальник всех типов и классов Типы type Тип встроенных типов и классов Обратите внимание, что в табл. 3.9 object и type встречаются дважды, пото- му что типы и классы, как и функции, являются вызываемыми объектами. Вызываемые типы Вызываемые типы представляют объекты, поддерживающие возможность их вызова, как функций. Существует несколько разновидностей объектов, обладающих этим свойством, включая пользовательские функции, встро- енные функции, методы экземпляров и классы. 76 Глава 3. Типы данных и объекты Пользовательские функции Пользовательские функции являются вызываемыми объектами, которые создаются на уровне модуля с помощью инструкции def или оператора lambda . Например: def foo(x,y): return x + y ёё bar = lambda x,y: x + y Пользовательская функция f обладает следующими атрибутами: Атрибут Описание f.__doc__ Строка документирования f.__name__ Имя функции f.__dict__ Словарь, содержащий атрибуты функции f.__code__ Скомпилированный байт-код функции f.__defaults__ Кортеж с аргументами по умолчанию f.__globals__ Словарь, определяющий глобальное пространство имен f.__closure__ Кортеж, содержащий данные, связанные с вложенными областями видимости В устаревших версиях Python 2 многие из перечисленных атрибутов имели имена, такие как func_code, func_defaults и так далее. Перечисленные име- на атрибутов совместимы с версиями Python 2.6 и Python 3. Методы Методы – это функции, которые определены внутри класса. Существует три основных типа методов: методы экземпляра, методы класса и статиче- ские методы: class Foo(object): def instance_method(self,arg): инструкции @classmethod def class_method(cls,arg): инструкции @staticmethod def static_method(arg): инструкции Метод экземпляра – это метод, который оперирует экземпляром данного класса. Ссылка на экземпляр передается методу в первом аргументе, кото- рый в соответствии с соглашениями называется self. Метод класса опери- рует самим классом, как объектом. Объект класса передается методу клас- са в первом аргументе cls. Статический метод – это обычная функция, Встроенные типы представления структурных элементов программы 77 которая по некоторым соображениям была помещена в класс. Он не полу- чает ссылку ни на экземпляр класса, ни на сам класс. Методы экземпляра и методы класса представлены специальным типом types.MethodType . Однако, чтобы понять, как действует этот специальный тип, необходимо разобраться с тем, как действует механизм поиска атри- бутов объекта (.). Поиск любого атрибута объекта (.) всегда выполняется как отдельная операция, независимо от операции вызова функции. При фактическом вызове метода выполняются обе операции, но в виде отдель- ных действий. Следующий пример иллюстрирует порядок вызова метода f.instance_method(arg) экземпляра класса Foo из предыдущего листинга: f = Foo() # Создает экземпляр meth = f.instance_method # Отыскивает метод и отмечает отсутствие () meth(37) # Вызов метода В данном примере meth – это связанный метод. Связанный метод – это вы- зываемый объект, который заключает в себе функцию (метод) и экземпляр класса. При вызове связанного метода экземпляр класса передается мето- ду в первом аргументе (self). То есть в этом примере meth можно рассматри- вать, как механизм вызова метода, готовый к использованию, который бу- дет запущен при добавлении к нему оператора () вызова функции. Операция поиска метода может также выполняться непосредственно в са- мом классе. Например: umeth = Foo.instance_method # Поиск instance_method в классе Foo umeth(f,37) # Вызов с явной передачей значения аргумента self В этом примере umeth – это несвязанный метод. Несвязанный метод – это вызываемый объект, который заключает в себе функцию, но предполагает, что ссылка на экземпляр соответствующего типа будет передаваться в пер- вом аргументе вручную. В данном примере в первом аргументе передается экземпляр f класса Foo. Если попытаться передать экземпляр неверного типа, будет возбуждено исключение TypeError. Например: >>> umeth(“hello”,5) Traceback (most recent call last): File “ TypeError: descriptor ‘instance_method’ requires a ‘Foo’ object but received a ‘str’ (Перевод: Трассировочная информация (самый последний вызов – самый нижний): Файл “ TypeError: дескриптор ‘instance_method’ должен быть объектом класса ‘Foo’, получен объект ‘str’ ) >>> Для пользовательских классов связанные и несвязанные методы представ- лены объектами типа types.MethodType, которые являются всего лишь тон- кой оберткой вокруг обычного объекта функции. Методы поддерживают следующие атрибуты: 78 Глава 3. Типы данных и объекты Атрибут Описание m.__doc__ Строка документирования m.__name__ Имя метода m.__class__ Класс, в котором определен данный метод m.__func__ Объект функции, реализующей данный метод m.__self__ Ссылка на экземпляр, ассоциированный с данным методом (None – для несвязанных методов) Одна из важных особенностей Python 3 состоит в том, что несвязанные ме- Python 3 состоит в том, что несвязанные ме- 3 состоит в том, что несвязанные ме- тоды больше не обернуты объектом types.MethodType. Если обратиться к ме- тоду Foo.instance_method, как показано в предыдущих примерах, он будет интерпретироваться, как обычный объект функции, реализующей метод. Более того, в Python 3 больше не выполняется проверка типа аргумента self Встроенные функции и методы Для представления функций и методов, реализованных на языках C и C++, используется объект types.BuiltinFunctionType. Для встроенных методов до- ступны следующие атрибуты: Атрибут Описание b.__doc__ Строка документирования b.__name__ Имя функции/метода b.__self__ Ссылка на экземпляр, ассоциированный с данным методом (для связанных методов) Для встроенных функций, таких как len(), аргумент __self__ устанавлива- ется в значение None, что является признаком функции, которая не связана с каким-либо конкретным объектом. Для встроенных методов, таких как x.append , где x – объект списка, в аргументе __self__ передается ссылка на объект x. Классы и экземпляры как вызываемые объекты Классы и экземпляры также могут действовать, как вызываемые объек- ты. Объект класса создается инструкцией class и может вызываться как функция для создания новых экземпляров. В этом случае аргументы вызо- ва передаются методу __init__() класса для инициализации вновь создан- ного экземпляра. Экземпляр может имитировать поведение функции, если определяет специальный метод __call__(). Если этот метод определен для экземпляра x, то инструкция x(args) вызовет метод x.__call__(args). |