Лутц М. - Изучаем Python (1077325), страница 58
Текст из файла (страница 58)
к. он может привести к сбоям — циклические структуры могут вызывать неожиданное зацикливание программного кода, если вы не все предусмотрели. Например, некоторые программы хранят список или словарь уже посещенных элементов, с помощью которого обнаруживают попадание в цикл. Советы по устранению этих неполадок приводятся в упражнениях к первой части книги, в главе 3; кроме того, решение проблемы приводится также в конце главы 21, в программе гегоадак.ру. Не создавайте циклические ссылки, если они действительно не нужны.
Иногда бывают серьезные основания для создания циклических ссылок, но если ваш программный код не предусматривает их обработку, вам не следует слишком часто заставлять свои объекты ссылаться на самих себя. Т = (1, 2, 3) Т[2! = 4 в Овибка.' т = т[:2] ч (4,) Ф Все в порядке: Т1, 2, 4) Это может показаться лишней работой, но выигрыш в том, что неизме- няемые объекты, такие как кортежи и строки, не порождают приве- денных выше проблем, т.
к. они не могут изменяться непосредственно и не подвержены, как списки, побочным эффектам такого рода. Неизменяемые типы не могут изменяться непосредственно Наконец„вы не можете изменять неизменяемые объекты непосредственно. Вместо этого создайте новый объект — с помощью операций извлечения среза„конкатенации и т. д., и присвойте, если это необходимо, первоначальной переменной: В заключение В заключение В этой главе были исследованы последние два базовых типа объектов— кортежи и файлы.
Мы узнали, что кортежи поддерживают все операции, обычные для последовательностей, но не имеют методов и не позволяют выполнять изменения непосредственно в объекте, потому что они относятся к категории неизменяемых объектов. Мы также узнали, что объекты-файлы возвращаются функцией осел и предоставляют методы чтения и записи данных.
Мы исследовали проблему преобразования объектов РуФЬоп в строку и обратно, чтобы иметь возможность сохранять нх в файле, и познакомились с модулями в1ск1е и зт шов, реализующими дополнительные возможности (сериализация объектов и работа с двоичными данными). В заключение мы рассмотрели некоторые свойства, общие для всех типов объектов (например, разделяемые ссылки) и прошлись по списку часто встречающихся ошибок (ловушек), связанных с типами объектов. В следующей части мы обратимся к теме синтаксиса операторов в языке Ру(Ьоп — здесь мы исследуем все основные процедурные операторы. Следующая глава открывает эту часть книги с введения в общую синтаксическую модель языка Ру(Ьоп, которая применима ко всем типам операторов.
Однако, прежде чем двинуться дальше, ознакомьтесь с контрольными вопросами к главе, а затем проработайте упражнения к этой части, чтобы коротко повторить основные понятия. Операторы в основном всего лишь создают и обрабатывают объекты, поэтому, прежде чем продолжать чтение, вам необходимо проверить владение этой темой, выполнив упражнения. Закрепление пройденного Контрольные вопросы 1. Как определить размер кортежа7 2. Напишите выражение, которое изменит первый элемент в кортеже. Кортеж со значением (4, 5, 6) должен стать кортежем со значением (1. 5,6). 3.
Какое значение используется по умолчанию в аргументе режима обработки файла в функции орел 7 4. Каким модулем можно воспользоваться для сохранения объектов РуФЬоп в файл, чтобы избежать выполнения преобразований объектов в строки вручную? б. Как можно выполнить копирование всех частей вложенной структуры в одной инструкции? 6. В каких случаях интерпретатор рассматривает объект как» истину» 2 7. В чем состоит ваша цель7 266 Глава 9. Кортежи, файлы и все остальное Ответы 1. Встроенная функция 1ел возвращает длину (количество содержащихся элементов) любого контейнерного объекта, включая и кортежи. Это — встроенная функция, а не метод и потому может применяться к самым разным типам объектов.
2. Поскольку кортежи являются неизменяемыми, в действительности их нельзя изменить непосредственно, но можно создать новый кортеж с желаемым значением. Первый элемент заданного кортежа Т = (4, 5, 6) можно изменить, создав новый по частям с помощью операций извлечения среза и конкатенации: Т = (1. ) + Т(1: ). (Не забывайте, что в кортежах из одного элемента обязательно должна присутствовать завершающая запятая.) Также можно было бы преобразовать кортеж в список, выполнить необходимое изменение непосредственно в списке и произвести обратное преобразование в кортеж, но это более дорогостоящая последовательность действий, которая редко используется на практике; просто используйте списки, если заранее известно, что может потребоваться изменить объект непосредственно.
3. Аргумент режима открытия Файла в функции орел по умолчанию имеет значение ' г', т. е. файл открывается для чтения. Чтобы открыть текстовый файл для чтения, достаточно передать функции одно только имя файла. 4. Для сохранения объектов Ру1Ьоп в файле можно воспользоваться модулем р1сх1в, что устранит необходимость явного преобразования объектов в строки.
Модуль втгоот позволяет вЫПОЛНЯтъ похожие действия, но в предположении, что данные хранятся в файле в упакованном двоичном Формате. б. Чтобы скопировать все вложенные части структуры Х, можно импортировать модуль сору и вызвать функцию сору. Оеерсору(Х). Однако такой способ редко можно встретить на практике — ссылок обычно бывает достаточно и, как правило, в большинстве случаев достаточно бывает создать поверхностную копию (например, зс1в1(;), а01ст.саРУ()) б.
Объект рассматривается как»истина», если он является либо ненулевым числом, либо непустым объектом коллекции. Встроенные слова Тгое и Еа1ве по сути являются предопределенными именами числовых значений 1 и О соответственно. 7. В число допустимых ответов входят»Изучить язык Ру1)топ», «Перейти к следующей части книги» или »Найти святую чашу Грааля».
Упражнения ко второй части В этом разделе вам предлагается снова пройтись по основам встроенных объектов. Как и прежде, вам попутно могут встретиться новые понятия, поэтому обязательно сверьтесь с ответами в приложении В, ко- Закрепление пройденного 267 гда закончите (и даже если еще не закончили). Если у вас не так много свободного времени, я рекомендую начать с упражнений 10 и 11 (так как они наиболее практичные), а затем, когда появится время, пройти все упражнения — от первого до последнего. Во всех упражнениях необходимо знание фундаментальных сведений, поэтому постарайтесь выполнить как можно большую их часть.
1. Основы. Поэкспериментируйте в интерактивной оболочке с наиболее часто используемыми операциями, которые вы найдете в таблицах второй части. Для начала запустите интерактивный сеанс работы с интерпретатором РуФЬоп, введите все нижеследующие выражения и попробуйте объяснить происходящее: 2 . ° 1б 2г'5, 2гг50 "ярая" г "ессв" 5 = "Пав" "еббв " г 5 5 * 5 5[:О] "Огееп Ьв ала Вв" Ь ("еббя". 5) ('х',)[0] ( ' х ', ' у ' )[ 1 ] (. = [ 1, 2, 3] + [4, 5, б] Ц:], Ц:О], Ц -2), Ь[-2;] ([1,2,3] + [4,5,5])[2'.4] (([2]. ([3]] Ь геуегве( ); Ь.яег(( ); (яшеех(4) ('а';1, 'Ь':2)['Ь'] 0 = ('х';1, 'у':2, 'г':3) О['уг'] = 0 О['х'] + О['е'] 0[(1,2,3)] = 4 О.хеув( ), О.уа1еев( ), О.лав Кеу((1,2,3)) [[]], ("',[],( ),(),Иоле] 2.
Индексирование и извлечение среза. В интерактивной оболочке создайте список с именем [, который содержит четыре строки или числа (например, [ = [О, 1, 2, 3]). Затем исследуйте следующие случаи; а. Что произойдет, если попытаться получить доступ к элементу, индекс которого выходит за пределы списка (например, Ц 4])? Ь. Что произойдет, если попытаться извлечь срез, выходящий за пределы списка(например, ь (-1000: 100) )? с. Наконец, как отреагирует интерпретатор на попытку извлечь последовательность в обратном порядке, когда нижняя граница больше верхней (например, Ц3:1])? Подсказка: попробуйте 268 Глава 9. Кортежи, файлы и зсе остальное выполнить операцию присваивания такому срезу (Ь[3:1) ['7')) и посмотреть, куда будет помещено значение, Как вы думаете, это то же самое явление, что и при попытке извлечь срез, выходящий за пределы списка2 3.
Индексирование, извлечение среза и инструкция ое]. Создайте дру- гой список [ с четырьмя элементами и присвойте одному из элементов пустой список (например, 1[2] = []). Что произошло7 Затем присвойте пустой список срезу ([[2: 3] = [)). Что случилось на этот раз2 Не забывайте, что операция присваивания срезу сначала удаляет срез, а затем вставляет новое значение в заданную позицию. Инструкция Ое1 удаляет элемент с указанным смещением, ключом, атрибутом или именем.
Используйте ее для удаления элемента вашего списка (например, ле1 [[О)). Что произойдет, если попробовать удалить целый срез (ое1 1[1: ))7 Что произойдет, если срезу присвоить объект, который не является последовательностью ([[1: 2] = 1)7 4. Кортежи. Введите следующие строки: »> Х = 'зраэ' »> У = 'ерзз' >»Х, У" У, Х Как вы думаете, что произойдет с переменными после выполнения этой последовательности действий? 5. Ключи словарей.
Рассмотрите следующий фрагмент: »> 0 = () »> 0[1] = 'в' »> 0[2] = 'Ь' Вы знаете, что словари не поддерживают доступ к элементам по смещениям; попробуйте объяснить происходящее здесь. Может быть, следующий пример прояснит ситуацию7 (Подсказка: к какой категории типов относятся строки, целые числа и кортежи2) »> 0[(1, 2, 3)] ° 'с' »> 0 (1: 'а'. 2: 'Ь'. (1, 2.
3) 'с') 6. Индексирование словарей. Создайте словарь с именем ]> и с тремя записями для ключей '3', 'Ь' и 'с'. Что произойдет, если попытаться обратиться к элементу с несуществующим ключом (О( ' О ' ) )? Что сделает интерпретатор, если попробовать присвоить значение несуществующему ключу(О[ 'о'] = 'зраа')? Как это согласуется с операциями доступа и присваивания элементам списков при использовании индексов, выходящих за их пределы7 Не напоминает ли вам такое поведение правила, применяемые к переменным7 7.
Общие операции. Получите в интерактивной оболочке ответы на следующие вопросы: Закрепление пройденного 2бй а. Что произойдет, если попытаться использовать оператор + с операндами различных типов (например, строка+список, список+кортеж)? Ь. Будет ли работать оператор +, когда один из операндов является словарем7 с. Будет ли работать метод аррепз со списками и со строками? Мож- но ли использовать метод аеуз со списками7 (Подсказка: что предполагает метод аррепз о заданном объекте7) г).