М. Лутц - Изучаем Python (4-е издание)- 2011 (1126907), страница 80
Текст из файла (страница 80)
Мы исследовали проблему преобразования объектов Python в строку и обратно, чтобыиметь возможность сохранять их в файле, и познакомились с модулями pickleи struct, реализующими дополнительные возможности (сериализация объектов и работа с двоичными данными). В заключение мы рассмотрели некоторые свойства, общие для всех типов объектов (например, разделяемые ссылки), и прошлись по списку часто встречающихся ошибок (ловушек), связанныхс типами объектов.В следующей части мы обратимся к теме синтаксиса инструкций в языкеPython – здесь мы исследуем все основные процедурные инструкции.
Следующая глава открывает эту часть книги с введения в общую синтаксическуюмодель языка Python, которая применима ко всем типам операторов. Однако прежде чем двинуться дальше, ознакомьтесь с контрольными вопросамик главе, а затем проработайте упражнения к этой части, чтобы коротко повторить основные понятия. Операторы в основном всего лишь создают и обрабатывают объекты, поэтому прежде чем продолжать чтение, вам необходимопроверить владение этой темой, выполнив упражнения.316Глава 9. Кортежи, файлы и все остальноеЗакрепление пройденногоКонтрольные вопросы1.
Как определить размер кортежа? Почему этот инструмент стоит обособленно?2. Напишите выражение, которое изменит первый элемент в кортеже. Кортежсо значением (4,5,6) должен стать кортежем со значением (1,5,6).3. Какое значение используется по умолчанию в аргументе режима обработкифайла в функции open?4. Каким модулем можно воспользоваться для сохранения объектов Pythonв файл, чтобы избежать выполнения преобразований объектов в строкивручную?5. Как можно выполнить копирование всех частей вложенной структурыв одной инструкции?6. В каких случаях интерпретатор рассматривает объект как «истину»?7. В чем состоит ваша цель?Ответы1.
Встроенная функция len возвращает длину (количество содержащихся элементов) любого контейнерного объекта, включая и кортежи. Это – встроенная функция, а не метод, и потому может применяться к самым разнымтипам объектов. Вообще говоря, встроенные функции и операторы выражений зачастую могут применяться к объектам самых разных типов; методы являются более узкоспециализированными инструментами, которыемогут применяться только к объектам одного типа, однако некоторые типымогут иметь одноименные методы (например, методом index обладают списки и кортежи).2. Поскольку кортежи являются неизменяемыми, в действительности ихнельзя изменить непосредственно, но можно создать новый кортеж с желаемым значением.
Первый элемент заданного кортежа T = (4,5,6) можноизменить, создав новый по частям с помощью операций извлечения срезаи конкатенации: T = (1,) + T[1:]. (Не забывайте, что в кортежах из одного элемента обязательно должна присутствовать завершающая запятая.) Такжеможно было бы преобразовать кортеж в список, выполнить необходимое изменение непосредственно в списке и произвести обратное преобразованиев кортеж, но это более дорогостоящая последовательность действий, которая редко используется на практике; просто используйте списки, если заранее известно, что может потребоваться изменить объект непосредственно.3. Аргумент режима открытия файла в функции open по умолчанию имеетзначение ‘r’, то есть файл открывается для чтения в текстовом режиме.
Чтобы открыть текстовый файл для чтения, достаточно передать функции однотолько имя файла.4. Для сохранения объектов Python в файле можно воспользоваться модулемpickle, что устранит необходимость явного преобразования объектов в строки. Модуль struct позволяет выполнять похожие действия, но в предположении, что данные хранятся в файле в упакованном двоичном формате.Закрепление пройденного3175.
Чтобы скопировать все вложенные части структуры X, можно импортировать модуль copy и вызвать функцию copy.deepcopy(X). Однако такой способредко можно встретить на практике – ссылок обычно бывает достаточно и,как правило, в большинстве случаев достаточно бывает создать поверхностную копию (например, aList[:], aDict.copy()).6. Объект рассматривается как «истина», если он является либо ненулевымчислом, либо непустым объектом коллекции. Встроенные слова True и Falseпо сути являются предопределенными именами числовых значений 1 и 0 соответственно.7. В число допустимых ответов входят «Изучить язык Python», «Перейтик следующей части книги» или «Найти святую чашу Грааля».Упражнения ко второй частиВ этом разделе вам предлагается снова пройтись по основам встроенных объектов. Как и прежде, вам попутно могут встретиться новые понятия, поэтомуобязательно сверьтесь с ответами в приложении B, когда закончите (и дажеесли еще не закончили).Если у вас не так много свободного времени, я рекомендую начать с упражнений 10 и 11 (так как они наиболее практичные), а затем, когда появится время,пройти все упражнения от первого до последнего.
Во всех упражнениях необходимо знание фундаментальных сведений, поэтому постарайтесь выполнитькак можно большую их часть.1. Основы. Поэкспериментируйте в интерактивной оболочке с наиболее частоиспользуемыми операциями, которые вы найдете в таблицах второй части. Для начала запустите интерактивный сеанс работы с интерпретаторомPython, введите все нижеследующие выражения и попробуйте объяснитьпроисходящее.
Обратите внимание, что в некоторых строках точка с запятой используется как разделитель инструкций, что позволяет уместитьв одной строке несколько инструкций, например: в строке X=1;X выполняется присваивание значения переменной и последующий его вывод (подробнее о синтаксисе инструкций рассказывается в следующей части книги).Кроме того, запомните, что запятая между выражениями обычно означаетсоздание кортежа, даже в отсутствие круглых скобок: выражение X,Y,Z –это кортеж из трех элементов, который интерпретатор выведет, заключивв круглые скобки.2 ** 162 / 5, 2 / 5.0“spam” + “eggs”S = “ham”“eggs “ + SS * 5S[:0]“green %s and %s” % (“eggs”, S)‘green {0} and {1}’.format(‘eggs’, S)(‘x’,)[0](‘x’, ‘y’)[1]318Глава 9.
Кортежи, файлы и все остальноеL = [1,2,3] + [4,5,6]L, L[:], L[:0], L[-2], L[-2:]([1,2,3] + [4,5,6])[2:4][L[2], L[3]]L.reverse( ); LL.sort( ); LL.index(4){‘a’:1, ‘b’:2}[‘b’]D = {‘x’:1, ‘y’:2, ‘z’:3}D[‘w’] = 0D[‘x’] + D[‘w’]D[(1,2,3)] = 4list(D.keys()), list(D.values()), (1,2,3) in D[[]], [“”,[],( ),{},None]2. Индексирование и извлечение среза. В интерактивной оболочке создайтесписок с именем L, который содержит четыре строки или числа (например,L = [0,1,2,3]).
Затем исследуйте следующие случаи – они могут никогда невстретиться вам на практике, но они заставят вас задуматься об основахреализации, что может оказаться полезным в практических ситуациях:•• Что произойдет, если попытаться получить доступ к элементу, индекскоторого выходит за пределы списка (например, L[4])?•• Что произойдет, если попытаться извлечь срез, выходящий за пределысписка (например, L[-1000:100])?•• Наконец, как отреагирует интерпретатор на попытку извлечь последовательность в обратном порядке, когда нижняя граница больше верхней(например, L[3:1])? Подсказка: попробуйте выполнить операцию присваивания такому срезу (L[3:1] = [‘?’]) и посмотреть, куда будет помещенозначение. Как вы думаете, это то же самое явление, что и при попыткеизвлечь срез, выходящий за пределы списка?3.
Индексирование, извлечение среза и инструкция del. Создайте другой список L с четырьмя элементами и присвойте одному из элементов пустой список (например, L[2] = []). Что произошло? Затем присвойте пустой списоксрезу (L[2:3] = []). Что случилось на этот раз? Не забывайте, что операцияприсваивания срезу сначала удаляет срез, а затем вставляет новое значениев заданную позицию.Инструкция del удаляет элемент с указанным смещением, ключом, атрибутом или именем.
Используйте ее для удаления элемента вашего списка (например, del L[0]). Что произойдет, если попробовать удалить целый срез (delL[1:])? Что произойдет, если срезу присвоить объект, который не являетсяпоследовательностью (L[1:2] = 1)?4. Кортежи. Введите следующие строки:>>> X = ‘spam’>>> Y = ‘eggs’>>> X, Y = Y, XКак вы думаете, что произойдет с переменными X и Y после выполнения этойпоследовательности действий?Закрепление пройденного3195. Ключи словарей. Рассмотрите следующий фрагмент:>>> D = {}>>> D[1] = ‘a’>>> D[2] = ‘b’Вы знаете, что словари не поддерживают доступ к элементам по смещениям; попробуйте объяснить происходящее здесь.
Может быть, следующийпример прояснит ситуацию? (Подсказка: к какой категории типов относятся строки, целые числа и кортежи?)>>> D[(1, 2, 3)] = ‘c’>>> D{1: ‘a’, 2: ‘b’, (1, 2, 3): ‘c’}6. Индексирование словарей. Создайте словарь с именем D и с тремя записямидля ключей ‘a’, ‘b’ и ‘c’. Что произойдет, если попытаться обратиться к элементу с несуществующим ключом (D{‘d’})? Что сделает интерпретатор, еслипопробовать присвоить значение несуществующему ключу (D[‘d’] = ‘spam’)?Как это согласуется с операциями доступа и присваивания элементам списков при использовании индексов, выходящих за их пределы? Не напоминает ли вам такое поведение правила, применяемые к переменным?7.