Лутц М. - Изучаем Python (1077325), страница 53
Текст из файла (страница 53)
е. списки, словари и другие кортежи), а следовательно, поддерживают произвольное число уровней вложенности. Массив ссылок на объекты Подобно спискам кортежи проще представлять как массивы ссылок на объекты — кортежи хранят указатели (ссылки) на другие объекты, а операция индексирования над кортежами выполняется очень быстро. В табл. 9.1 приводятся наиболее часто используемые операции над кортежами.
В программном коде кортежи записываются как последовательность объектов (точнее, выражений, которые создают объекты), разделенных запятыми, заключенная в круглые скобки. Пустые кортежи определяются как пара пустых круглых скобок. 241 Кортежи в действии Таблица 9.1. Литералы кортежей и операции Операция 11 = (О,) 12 = (О, 'И1', 1.2, 3) 12=0, 'И1', 1.2, 3 Вложенные кортежи Индекс, индекс индекса, срез, длина 13 = ('аос', ('Оег', 'ОЬ1')) 11[>] 13[т][) ] 11[к) ] )вп(11) Конкатенация, повторение 11 ч 12 12 ° 3 Обход в цикле, проверка вхождения гог х тп 1 'арап' 1п 12 Кортежи в действии Как обычно, запустите интерактивный сеанс работы с интерпретатором Ру1]топ, чтобы приступить к исследованию кортежей в действии.
Обратите внимание: в табл. 9.1 отсутствуют методы кортежей (т. е. метод аррепб к кортежам неприменим). Это действительно так, зато кортежи поддерживают обычные операции над последовательностями, которые применяются к строкам и к спискам: а Конкатенация а Повторение а Индексирование, извлечение орава 2) Особенности синтаксиса определения кортежей: запятые и круглые скобки Вторая и четвертая строки в табл. 9.1 заслуживают дополнительных пояснений. Поскольку круглые скобки могут также окружать выражения (глава б), необходимо что-то предпринять, чтобы дать интерпретатору понять, что единственный объект в круглых скобках — это кортеж, а не простое выражение. Если вам действительно необходимо получить кортеж с единственным элементом, нужно просто добавить запятую после этого элемента, перед закрывающей круглой скобкой: »>(1, 2)+(3, 4) (1, 2.
3, 4) >» (1, 2) 4 (1, 2, 1, 2, 1, 2, 1, »> Т = (1, 2, 3, 4) »> Т[0], Т[1:3] (1, (2, 3)) Интерпретация Пустой кортеж Кортеж нз одного элемента (не выражение) Кортеж нз четырех элементов Еще один кортеж нз четырех элементов (тот же самый, что н строкой выше) г4г Глава ок Кортежи, файлы и все остальное в целое ~испо в Кортев, содержащий целое число В виде исключения при определении кортежей интерпретатор позволяет опускать открывающую и закрывающую круглые скобки, если синтаксически конструкция интерпретируется однозначно. Например, в четвертой строке таблицы кортеж создается простым перечислением четырех элементов, разделенных запятыми.
В контексте операции присваивания интерпретатор распознает, что это кортеж, даже при отсутствии круглых скобок. Кто-то может посоветовать вам всегда использовать круглые скобки в кортежах, а кто-то — посоветовать никогда не использовать их (найдутся и те, кто не скажет вам, что с кортежами делать!). Единственное место, где круглые скобки являются обязательными, — при передаче кортежей функциям в виде литералов (где круглые скобки имеют важное значение) и при передаче их инструкции рт[пг (где важное значение имеют запятые). Начинающим программистам можно посоветовать следующее — вероятно, легче использовать круглые скобки, чем выяснять ситуации, когда они могут быть опущены.
Многие также считают, что круглые скобки повышают удобочитаемость сценариев, делая кортежи в программном коде более заметными, но у вас может быть свое собственное мнение на этот счет. Преобразования и неизменяемость Хотя синтаксис литералов отличается, операции, выполняемые над кортежами (последние три строки в табл.
9.1), идентичны операциям, применяемым к строкам и спискам. Единственное отличие состоит в том, что операции +, * и извлечения среза при применении к кортежам возвращают новые кортежи, а также в том, что в отличие от строк, списков и словарей, кортежи не имеют методов. Если, к примеру, необходимо отсортировать содержимое кортежа, его сначала следует преобразовать в список, чтобы превратить его в изменяемый обьект и получить доступ к методу сортировки: В Создается кортев из злеиеитов списка »> х = (40) »> х 40 »> у -" (40, ) »> у (40,) »> т = ('сс', 'аа', »> гвр = )гаг(т) »> гар.вотг() »> гвр ['аа', '00', 'сс', 'ое') »> т = гцр)е(гар) »> т ('аа', 'оэ', 'сс', 'оо') 'ЬЬ') в Создается список из злеиеитов кортевв в Сортировка списка Кортежи э действии Здесь 11эт и тцр1е — это встроенные функции, которые используются для преобразования в список и затем обратно в кортеж.
В действительности обе функции создают новые объекты, но благодаря им создается эффект преобразования. Для преобразования кортежей можно также использовать генераторы списков (1[а$ сотпрге]тепэ1опэ). Например, ниже из кортежа создается список, причем попутно к каждому элементу прибавляется число 20: »>Т=(1,2,3,4,5) »> Е = [х + 20 тот х 1п Т] »> [21, 22, 23, 24, 25] Генераторы списков в действительности являются операциями над последовательностями — они всегда создают новые списки, но они могут использоваться для обхода содержимого любых объектов последовательностей, включая кортежи, строки и другие списки. Как будет показано дальше, они могут применяться даже к программным компонентам, которые физически не являются последовательностями, — к любым объектам, поддерживающим возможность выполнения итераций, включая файлы, которые автоматически читаются строка за строкой.
Кроме того, следует заметить, что правило неизменяемости кортежа применимо только к самому кортежу, но не к объектам, которые он содержит. Например, список внутри кортежа может изменяться как обычно: »>Т=(1, [2, 3], 4) »> т[1] = 'арам' е Ошибка; нельзл изменить сам кортеж турееггог: оо)ест ооеэп'т эцррогт 1тев аэырпвепт (Перепад: ТуреЕггог. объект не поддерживает операцию присеаиаанил элементам) »> Т[1КО] = 'прав' Ф Допустимо: еложенный изменяемый обьект можно изменить »> Т (1, ['прав, 3], 4) Для большинства программ такой одноуровневой неизменяемости для обычного использования кортежей вполне достаточно.
О чем, совершенно случайно, и рассказывается в следующем разделе. Для чего нужны кортежи, когда уже имеются списки? Похоже, что это самый первый вопрос, который задают начинающие программисты, узнав о кортежах: «Зачем нам нужны кортежи, когда у нас уже имеются списки7». Некоторые из причин корнями уходят в прошлое — создатель языка РуФоп является математиком по образованию, который видел кортежи как простые ассоциации объектов, а списки — как структуры данных, допускающие изменения в течение всего времени своего существования. Однако более правильным будет считать, что неизменяемость кортежей обеспечивает своего рода лоддержну целостности, — вы можете 244 Глава 9.
Кортежи, файлы и все остальное быть уверены, что кортеж не будет изменен посредством другой ссылки из другого места в программе, чего нельзя сказать о списках. Тем самым кортежи играют роль объявлений «констант», присутствующих в других языках программирования, несмотря на то, что в языке Ру1Ьоп это понятие связано с объектами, а не с переменными. Кроме того, существуют ситуации, в которых кортежи можно использовать, а списки — нет. Например, в качестве ключей словаря (пример с разреженными матрицами в главе 8).
Некоторые встроенные операции также могут требовать или предполагать использование кортежей, а не списков. Следует запомнить, что списки должны выбираться, когда требуются упорядоченные коллекции, которые может потребоваться изменить. Кортежи могут использоваться и в остальных случаях, когда необходимы фиксированные ассоциации объектов. файлы Возможно, вы уже знакомы с понятием файла — так называются области постоянной памяти в вашем компьютере, которыми управляет операционная система.
Последний основной встроенный тип объектов, который мы исследуем в нашем обзоре, обеспечивает возможность доступа к этим файлам из программ на языке РуФЬоп. Проще говоря, встроенная функция орел создает объект файла, который обеспечивает связь с файлом, размещенным в компьютере. После вызова функции орел можно выполнять операции чтения и записи во внешний файл, используя методы полученного объекта. Встроенное имя 111е является синонимом имени орел, поэтому файлы могут открываться обращением к функции как по имени орел, так и по имени тт1е. Обычно для выполнения операции открытия файла предпочтительнее использовать функцию орел, тогда как имя 111е в основном предназначено для обеспечения соответствия требованиям объектно-ориентированного программирования (описывается далее в этой книге).
По сравнению с типами, с которыми вы уже знакомы, объекты файлов выглядят несколько необычно. Они не являются ни числами, ни последовательностями или отображениями — для задач работы с файлами они предоставляют одни только методы. Вольшинство методов файлов связаны с выполнением операций ввода-вывода во внешние файлы, ассоциированные с объектом, но существуют также методы, которые позволяют переходить на другую позицию в файле, выталкивать на диск буферы вывода и т.