Главная » Просмотр файлов » Марк Лутц - Изучаем Python, Четвертое издание

Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 77

Файл №1184811 Марк Лутц - Изучаем Python, Четвертое издание (Марк Лутц - Изучаем Python, Четвертое издание) 77 страницаМарк Лутц - Изучаем Python, Четвертое издание (1184811) страница 772020-08-21СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 77)

Дополнительнуюинформацию о подобных инструментах вы найдете в специализированной литературе по языку Python и в Сети.Примечание, касающееся различий между версиями: В версииPython 2.5 и в более ранних имя open встроенной функции фактически было синонимом имени типа file, а файлы, с технической точки зрения, можно было открыть вызовом функции openили file (хотя предпочтительнее использовать функцию open).В Python 3.0 имя file больше недоступно, потому что оно дублирует имя open.Пользователи Python 2.6 могут также использовать имя fileкак имя типа объекта файла для создания дочерних классов прииспользовании объектно-ориентированного стиля программирования (описывается ниже в этой книге).

В Python 3.0 файлыизменились�����������������������������������������������������������������������������������������������радикально�������������������������������������. �����������������������������������Классы, которые могут использовать-301Пересмотренный перечень категорий типовся в качестве родительских, для реализации собственных типовфайлов, находятся в модуле io.

За дополнительной информацией обращайтесь к документации по этому модулю или к исходным текстам доступных классов. Попробуйте также вызватьфункцию type(F), передав ей объект открытого файла F.Пересмотренный перечень категорий типовТеперь, когда мы познакомились со всеми встроенными базовыми типамиязыка Python в действии, давайте завершим наше турне рассмотрением некоторых общих для них свойств.

В табл. 9.3 приводится классификация всехрассмотренных типов по категориям, которые были введены ранее. Напомнюнекоторые положения:•• Над объектами одной категории могут выполняться одни и те же операции, например над строками, списками и кортежами можно выполнятьоперации для последовательностей, такие как конкатенация и определение длины.•• Непосредственное изменение допускают только изменяемые объекты (списки, словари и множества) – вы не сможете непосредственно изменить числа, строки и кортежи.•• Файлы экспортируют только методы, поэтому понятие изменяемости к нимпо-настоящему неприменимо – хотя они могут изменяться при выполненииоперации записи, но это не имеет никакого отношения к ограничениям типов в языке Python.•• В категорию «Числа» в табл. 9.3 входят все числовые типы: целые (длинныецелые, в Python 2.6), вещественные, комплексные, фиксированной точности и рациональные.•• В категорию «Строки» в табл. 9.3 входят строки типа str, а также bytes (вверсии 3.0) и unicode (в версии 2.6).

Строковый тип bytearray в������������������������������� ��������������версии�������� 3.0 от���носится к изменяемым типам.•• Множества напоминают словари, в которых ключи не имеют значений. Элементы множеств не отображаются на значения и неупорядочены, поэтомумножества нельзя отнести ни к отображениям, ни к последовательностям.Тип frozenset – это неизменяемая версия типа set.•• Вдобавок к вышесказанному, в версиях Python���������������������������������������������������������������� 2.6 и 3.0 все типы, перечисленные в табл. 9.3, обладают методами, которые обычно реализуют операции, характерные для определенного типа.Таблица 9.3.

Классификация объектовТип объектовКатегорияИзменяемый?Числа (все)ЧислаНетСтрокиПоследовательностиНетСпискиПоследовательностиДаСловариОтображенияДаКортежиПоследовательностиНет302Глава 9. Кортежи, файлы и все остальноеТаблица 9.3 (продолжение)Тип объектовКатегорияИзменяемый?ФайлыРасширенияПонятие неприменимоМножестваМножестваДаФиксированные множества Множества(frozenset)bytearray (3.0)ПоследовательностиНетДаПридется держать в уме: перегрузка операторовВ шестой части книги мы увидим, что объекты, реализованные с помощью классов, могут свободно попадать в любую из этих категорий.Например, если нам потребуется реализовать новый тип объектов последовательностей, который был бы совместим со встроенными типамипоследовательностей, мы могли бы описать класс, который перегружаетоператоры индексирования и конкатенации:class MySequence:def __getitem__(self, index):# Вызывается при выполнении операции self[index]def __add__(self, other):# Вызывается при выполнении операции self + otherи так далее.

Точно так же можно было бы создать новый изменяемыйили неизменяемый объект, выборочно реализовав методы, вызываемыедля выполнения операций непосредственного изменения (например, длявыполнении операций присваивания self[index] = value вызывается метод __setitem__). Существует также возможность выполнять реализациюновых объектов на других языках программирования, таких как C, в ви­де расширений. Чтобы определить выбор между множествами операцийнад числами, последовательностями и отображениями, необходимо бу­дет подставить указатели на функции C в ячейки структуры.Гибкость объектовВ этой части книги были представлены несколько составных типов объектов(коллекции с компонентами). В общем случае:•• Списки, словари и кортежи могут хранить объекты любых типов.•• Списки, словари и кортежи допускают произвольную вложенность.•• Списки и словари могут динамически увеличиваться и уменьшаться.Поскольку составные типы объектов в языке Python поддерживают любыеструктуры данных, они прекрасно подходят для представления в программахданных со сложной структурой.

Например, значениями элементов словареймогут быть списки, которые могут содержать кортежи, которые в свою очередьмогут содержать словари, и так далее. Вложенность может быть произвольной303Ссылки и копииглубины, какая только потребуется, чтобы смоделировать структуру обрабатываемых данных.Рассмотрим пример с вложенными компонентами. В следующем примере определяется три вложенных составных объекта последовательностей, как показано на рис. 9.1. Для обращения к отдельным элементам допускается использовать столько индексов, сколько потребуется.

В языке Python разыменованиеиндексов производится слева направо и на каждом шаге извлекается объектна более глубоком уровне. Структура данных на рис. 9.1 может показаться излишне сложной, но она иллюстрирует синтаксис, который используется длядоступа к данным:>>> L = [‘abc’, [(1, 2), ([3], 4)], 5]>>> L[1][(1, 2), ([3], 4)]>>> L[1][1]([3], 4)>>> L[1][1][0][3]>>> L[1][1][0][0]3[0][1][0][2][1]abc[0]5[1][0][1][0]1243Рис. 9.1. Дерево вложенных объектов со смещениями их компонентов,созданное с помощью литерального выражения [‘abc’, [(1, 2), ([3], 4)], 5].

 Синтаксически вложенные объекты внутри реализованы в виде ссылок  (то есть в виде указателей) на отдельные участки памятиСсылки и копииВ главе 6 говорилось, что при выполнении операции присваивания всегда сохраняется ссылка на объект, а не копия самого объекта. В большинстве случаев именно это нам и требуется. Однако в процессе выполнения операцийприсваивания может быть создано несколько ссылок на один и тот же объект,поэтому очень важно понимать, что изменения, произведенные в изменяемом304Глава 9.

Кортежи, файлы и все остальноеобъекте с помощью одной ссылки, отразятся и на других ссылках, указывающих на этот же объект. Если такой порядок вещей является нежелательным,необходимо явно сообщить интерпретатору, чтобы он создал копию объекта.Мы изучили это явление в главе 6, но ситуация может обостриться, когдав игру вступят крупные объекты. Например, в следующем примере создаетсясписок, который присваивается переменной X, затем создается другой список,включающий ссылку на список X, который присваивается переменной L. Далеесоздается словарь D, который содержит еще одну ссылку на список X:>>> X = [1, 2, 3]>>> L = [‘a’, X, ‘b’]>>> D = {‘x’:X, ‘y’:2}# Встроенная ссылка на объект XВ этот момент в программе появляется три ссылки на список, который был создан первым: из переменной X, из элемента списка, соответствующего переменной L, и из элемента словаря, соответствующего переменной D.

Эта ситуацияизображена на рис. 9.2.ИменаОбъектыLXD1?3Рис. 9.2. Разделяемые ссылки на объект: поскольку переменная X, элементсписка L и элемент словаря D ссылаются на один и тот же список, то  изменения, произведенные с помощью X, отразятся также на L и DТак как списки относятся к категории изменяемых объектов, изменения в объекте списка, произведенные с помощью любой из трех ссылок, также отразятсяна других двух ссылках:>>> X[1] = ‘surprise’# Изменяет все три ссылки!>>> L[‘a’, [1, ‘surprise’, 3], ‘b’]>>> D{‘x’: [1, ‘surprise’, 3], ‘y’: 2}Ссылки – это более высокоуровневый аналог указателей в других языках программирования. И хотя вы не можете извлечь непосредственное значение самойссылки, тем не менее одну и ту же ссылку можно сохранить более чем в одномместе (в переменных, в списках и так далее).

Это полезная особенность – выможете передавать крупные объекты между компонентами программы без выполнения дорогостоящей операции копирования. Однако, когда действительнонеобходимо создать копию объекта, вы можете запросить их:305Ссылки и копии•• Выражение извлечения среза с пустыми пределами (L[:]) создает копию последовательности.•• Метод словарей и множеств copy создает копию словаря (D.copy()).•• Некоторые встроенные функции, такие как list, создают копию списка(list(L)).•• Модуль copy, входящий в состав стандартной библиотеки, создает полныекопии объектов.Например, предположим, что у нас имеются список и словарь, и для нас нежелательно изменение их значений посредством других переменных:>>> L = [1,2,3]>>> D = {‘a’:1, ‘b’:2}Чтобы предотвратить такую возможность, достаточно связать с другими переменными копии объектов вместо того, чтобы связать с ними сами объекты:>>> A = L[:]>>> B = D.copy()# Вместо A = L (или list(L))# Вместо B = D (то же относится и к множествам)В этом случае изменения, произведенные с помощью других переменных, повлияют на копии, а не на оригиналы:>>> A[1] = ‘Ni’>>> B[‘c’] = ‘spam’>>>>>> L, D([1, 2, 3], {‘a’: 1, ‘b’: 2})>>> A, B([1, ‘Ni’, 3], {‘a’: 1, ‘c’: ‘spam’, ‘b’: 2})Если вернуться к первоначальному примеру, то избежать побочных эффектов,связанных со ссылками, можно, использовав выражение извлечения среза изоригинального списка:>>> X = [1, 2, 3]>>> L = [‘a’, X[:], ‘b’]>>> D = {‘x’:X[:], ‘y’:2}# Встроенные копии объекта XЭто меняет картину, представленную на рис. 9.2 – L и D теперь ссылаются надругие списки, отличные от X.

Теперь изменения, выполненные с помощью переменной X, отразятся только на самой переменной X, но не на L и D; точно также изменения в L или D никак не будут воздействовать на X.Одно замечание по поводу копий: выражение извлечения среза с пустыми значениями пределов и метод словаря copy создают поверхностные копии – тоесть они не копируют вложенные структуры данных, даже если таковые присутствуют. Если необходима полная копия структуры произвольной глубинывложенности, следует использовать стандартный модуль copy: добавьте инструкцию import copy и вставьте выражение X = copy.deepcopy(Y), которое создастполную копию объекта Y со сколь угодно большой глубиной вложенности.

Этафункция выполняет рекурсивный обход объектов и копирует все составныечасти. Однако такой подход используется намного реже (потому что для этогоприходится писать дополнительный программный код). Обычно ссылки – этоименно то, что нам требуется, в противном случае чаще всего применяются такие способы копирования, как операция извлечения среза и метод copy.306Глава 9. Кортежи, файлы и все остальноеСравнивание, равенство и истинаЛюбые объекты языка Python поддерживают операции сравнения: проверкана равенство, относительная величина и так далее.

Характеристики

Тип файла
PDF-файл
Размер
12,21 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6274
Авторов
на СтудИзбе
316
Средний доход
с одного платного файла
Обучение Подробнее