Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 73
Текст из файла (страница 73)
Объекты-файлы – это широко используемые многофункциональные инструменты для работы с файлами – краткий обзор файлов, который приводится здесь, будет дополнен примерами их использования в последующих главахэтой книги.Кроме того, эта глава завершает данную часть книги рассмотрением свойств,общих для объектов всех базовых типов, с которыми мы познакомились, – понятия равенства, сравнения, копирования объектов и так далее. Мы такжекратко познакомимся и с другими типами объектов, присутствующими в арсенале Python, – несмотря на то, что мы рассмотрели все основные встроенныетипы, спектр объектов в языке Python гораздо шире, чем я давал вам основания полагать к этому моменту. В заключение мы закроем эту часть книги изучением связанных с типами объектов ловушек, в которые часто попадаютсяпрограммисты, и исследуем некоторые примеры, которые позволят вам поэкспериментировать с освоенными идеями.1КортежиПоследний тип коллекций в нашем обзоре – это кортежи.
Кортежи представляют собой простые группы объектов. Они действуют точно так же, как списки, за исключением того, что не допускают непосредственного изменения (ониявляются неизменяемыми) и в литеральной форме записываются как последовательность элементов в круглых, а не в квадратных скобках. Хотя корте1После детального изучения удобно пользоваться краткими справочниками, например представленными в справочном разделе официального сайта проекта Python.Особо стоит отметить Мастерскую отца-основателя Python (Python Workshop byGuido van Rossum). Презентация доступна по адресу: http://www.python.org/doc/essays/ppt/acm-ws/. – Примеч.
перев.285Кортежижи и не поддерживают многих методов списков, тем не менее они обладаютбольшинством свойств, присущим спискам. Ниже коротко рассматриваютсяих свойства. Кортежи:Это упорядоченные коллекции объектов произвольных типовПодобно строкам и спискам, кортежи являются коллекциями объектов,упорядоченных по позициям (то есть они обеспечивают упорядочение своего содержимого слева направо).
Подобно спискам, они могут содержать объекты любого типа.Обеспечивают доступ к элементам по смещениюПодобно строками и спискам, доступ к элементам кортежей осуществляется по смещению (а не по ключу) – они поддерживают все операции, которыеоснованы на использовании смещения, такие как индексирование и извлечение среза.Относятся к категории неизменяемых последовательностейПодобно строкам и спискам, кортежи являются последовательностямии поддерживают многие операции над последовательностями.
Однако, подобно строкам, кортежи являются неизменяемыми объектами, поэтомуони не поддерживают никаких операций непосредственного изменения, которые применяются к спискам.Имеют фиксированную длину, гетерогенны и поддерживают произвольноечисло уровней вложенностиПоскольку кортежи являются неизменяемыми объектами, вы не можетеизменить размер кортежа, минуя процедуру создания копии. С другой стороны, кортежи могут хранить другие составные объекты (то есть списки,словари и другие кортежи), а следовательно, поддерживают произвольноечисло уровней вложенности.Массивы ссылок на объектыПодобно спискам, кортежи проще представлять, как массивы ссылок наобъекты, – кортежи хранят указатели (ссылки) на другие объекты, а операция индексирования над кортежами выполняется очень быстро.В табл. 9.1 приводятся наиболее часто используемые операции над кортежами.В программном коде кортежи записываются как последовательность объектов(точнее, выражений, которые создают объекты), разделенных запятыми, заключенная в круглые скобки.
Пустые кортежи определяются как пара пустыхкруглых скобок.Таблица 9.1. Литералы кортежей и операцииОперацияИнтерпретация()Пустой кортежT = (0,)Кортеж из одного элемента (не выражение)T = (0, ‘Ni’, 1.2, 3)Кортеж из четырех элементовT = 0, ‘Ni’, 1.2, 3Еще один кортеж из четырех элементов(тот же самый, что и строкой выше)T = (‘abc’, (‘def’,‘ghi’))Вложенные кортежи286Глава 9. Кортежи, файлы и все остальноеТаблица 9.1 (продолжение)ОперацияИнтерпретацияT = tuple(‘spam’)Создание кортежа из итерируемого объектаT[i]Индекс, индекс индекса, срез, длинаT[i][j]T[i:j]len(T)Конкатенация, повторениеT1 + T2T * 3Обход в цикле, проверка вхожденияfor x in T: print(x)‘spam’ in t2[x ** 2 for x in T]Методы кортежей в версиях 2.6 и 3.0: поиск,подсчет вхожденийT.index(‘Ni’)T.count(‘Ni’)Кортежи в действииКак обычно, запустите интерактивный сеанс работы с интерпретаторомPython, чтобы приступить к исследованию кортежей в действии.
Обратитевнимание: как указано в табл. 9.1, кортежи не обладают методами, которыеимеются у списков (например, кортежи не имеют метода append). Зато кортежиподдерживают обычные операции над последовательностями, которые применяются к строкам и к спискам:>>> (1, 2) + (3, 4)(1, 2, 3, 4)# Конкатенация>>> (1, 2) * 4(1, 2, 1, 2, 1, 2, 1, 2)# Повторение>>> T = (1, 2, 3, 4)>>> T[0], T[1:3](1, (2, 3))# Индексирование, извлечение срезаОсобенности синтаксиса определения кортежей: запятыеи круглые скобкиВторая и четвертая строки в табл. 9.1 заслуживают дополнительных пояснений.
Поскольку круглые скобки могут также окружать выражения (глава 5),необходимо что-то предпринять, чтобы дать интерпретатору понять, что единственный объект в круглых скобках – это кортеж, а не простое выражение.Если вам действительно необходимо получить кортеж с единственным элементом, нужно просто добавить запятую после этого элемента, перед закрывающей круглой скобкой:>>> x = (40)>>> x40# Целое число287Кортежи в действии>>> y = (40,)>>> y(40,)# Кортеж, содержащий целое числоВ виде исключения при определении кортежей интерпретатор позволяет опускать открывающую и закрывающую круглые скобки, если синтаксическиконструкция интерпретируется однозначно. Например, в четвертой строкетаблицы кортеж создается простым перечислением четырех элементов, разделенных запятыми.
В контексте операции присваивания интерпретатор распознает, что это кортеж, даже при отсутствии круглых скобок.Кто-то может посоветовать всегда заключать кортежи в круглые скобки, а ктото – посоветовать никогда не использовать их (найдутся и те, кто вообще ничего не скажет, что делать с кортежами!). Единственное место, где круглыескобки являются обязательными, – при передаче кортежей функциям в виделитералов (где круглые скобки имеют важное значение) и при передаче их инструкции print в версии Python 2.X (где важное значение имеют запятые).Начинающим программистам можно посоветовать следующее – вероятно,легче использовать круглые скобки, чем выяснять ситуации, когда они могутбыть опущены. Многие также считают, что круглые скобки повышают удобочитаемость сценариев, делая кортежи в программном коде более заметными,но у вас может быть свое собственное мнение на этот счет.Преобразования, методы и неизменяемостьНесмотря на отличия в синтаксисе литералов, операции, выполняемые надкортежами (последние три строки в табл. 9.1), идентичны операциям, применяемым к строкам и спискам.
Единственное отличие состоит в том, что операции +, * и извлечения среза при применении к кортежам возвращают новыекортежи, а также в том, что в отличие от строк, списков и словарей, кортежиимеют сокращенный набор методов. Если, к примеру, необходимо отсортировать содержимое кортежа, его сначала следует преобразовать в список, чтобыпревратить в изменяемый объект и получить доступ к методу сортировки илизадействовать новую функцию sorted, которая принимает объекты любых типов последовательностей (и не только):>>> T = (‘cc’, ‘aa’, ‘dd’, ‘bb’)>>> tmp = list(T)# Создать список из элементов кортежа>>> tmp.sort()# Отсортировать списка>>> tmp[‘aa’, ‘bb’, ‘cc’, ‘dd’]>>> T = tuple(tmp)# Создать кортеж из элементов списка>>> T(‘aa’, ‘bb’, ‘cc’, ‘dd’)>>> sorted(T)[‘aa’, ‘bb’, ‘cc’, ‘dd’]# Или использовать встроенную функцию sortedЗдесь list и tuple – это встроенные функции, которые используются для преобразования в список и затем обратно в кортеж.
В действительности обе функциисоздают новые объекты, но благодаря им создается эффект преобразования.Для преобразования кортежей можно также использовать генераторы списков. Например, ниже из кортежа создается список, причем попутно к каждому элементу прибавляется число 20:288Глава 9. Кортежи, файлы и все остальное>>> T = (1, 2, 3, 4, 5)>>> L = [x + 20 for x in T]>>> L[21, 22, 23, 24, 25]Генераторы списков в действительности являются операциями над последовательностями – они всегда создают новые списки, но они могут использоватьсядля обхода содержимого любых объектов последовательностей, включая кортежи, строки и другие списки.