Математический анализ. 3е издание
Скачать 4.86 Mb.
|
Неизменяемые типы не могут изменяться непосредственно Наконец, вы не можете изменять неизменяемые объекты непосредст венно. Вместо этого создайте новый объект – с помощью операций из влечения среза, конкатенации и т. д., и присвойте, если это необходи мо, первоначальной переменной: T = (1, 2, 3) T[2] = 4 # Ошибка! T = T[:2] + (4,) # Все в порядке: (1, 2, 4) Это может показаться лишней работой, но выигрыш в том, что неизме няемые объекты, такие как кортежи и строки, не порождают приве денных выше проблем, т. к. они не могут изменяться непосредственно и не подвержены, как списки, побочным эффектам такого рода. В заключение 265 В заключение В этой главе были исследованы последние два базовых типа объектов – кортежи и файлы. Мы узнали, что кортежи поддерживают все опера ции, обычные для последовательностей, но не имеют методов и не по зволяют выполнять изменения непосредственно в объекте, потому что они относятся к категории неизменяемых объектов. Мы также узнали, что объектыфайлы возвращаются функцией open и предоставляют ме тоды чтения и записи данных. Мы исследовали проблему преобразова ния объектов Python в строку и обратно, чтобы иметь возможность со хранять их в файле, и познакомились с модулями pickle и struct, реа лизующими дополнительные возможности (сериализация объектов и работа с двоичными данными). В заключение мы рассмотрели неко торые свойства, общие для всех типов объектов (например, разделяе мые ссылки) и прошлись по списку часто встречающихся ошибок (ло вушек), связанных с типами объектов. В следующей части мы обратимся к теме синтаксиса операторов в язы ке Python – здесь мы исследуем все основные процедурные операторы. Следующая глава открывает эту часть книги с введения в общую син таксическую модель языка Python, которая применима ко всем типам операторов. Однако, прежде чем двинуться дальше, ознакомьтесь с контрольными вопросами к главе, а затем проработайте упражнения к этой части, чтобы коротко повторить основные понятия. Операторы в основном всего лишь создают и обрабатывают объекты, поэтому, прежде чем продолжать чтение, вам необходимо проверить владение этой темой, выполнив упражнения. Закрепление пройденного Контрольные вопросы 1. Как определить размер кортежа? 2. Напишите выражение, которое изменит первый элемент в кортеже. Кортеж со значением (4,5,6) должен стать кортежем со значением (1,5,6) 3. Какое значение используется по умолчанию в аргументе режима обработки файла в функции open? 4. Каким модулем можно воспользоваться для сохранения объектов Python в файл, чтобы избежать выполнения преобразований объек тов в строки вручную? 5. Как можно выполнить копирование всех частей вложенной струк туры в одной инструкции? 6. В каких случаях интерпретатор рассматривает объект как «истину»? 7. В чем состоит ваша цель? 266 Глава 9. Кортежи, файлы и все остальное Ответы 1. Встроенная функция len возвращает длину (количество содержа щихся элементов) любого контейнерного объекта, включая и корте жи. Это – встроенная функция, а не метод и потому может приме няться к самым разным типам объектов. 2. Поскольку кортежи являются неизменяемыми, в действительно сти их нельзя изменить непосредственно, но можно создать новый кортеж с желаемым значением. Первый элемент заданного корте жа T = (4,5,6) можно изменить, создав новый по частям с помощью операций извлечения среза и конкатенации: T = (1,) + T[1:]. (Не за бывайте, что в кортежах из одного элемента обязательно должна присутствовать завершающая запятая.) Также можно было бы пре образовать кортеж в список, выполнить необходимое изменение не посредственно в списке и произвести обратное преобразование в кортеж, но это более дорогостоящая последовательность дейст вий, которая редко используется на практике; просто используйте списки, если заранее известно, что может потребоваться изменить объект непосредственно. 3. Аргумент режима открытия файла в функции open по умолчанию имеет значение 'r', т. е. файл открывается для чтения. Чтобы от крыть текстовый файл для чтения, достаточно передать функции одно только имя файла. 4. Для сохранения объектов Python в файле можно воспользоваться модулем pickle, что устранит необходимость явного преобразова ния объектов в строки. Модуль struct позволяет выполнять похо жие действия, но в предположении, что данные хранятся в файле в упакованном двоичном формате. 5. Чтобы скопировать все вложенные части структуры X, можно им портировать модуль copy и вызвать функцию copy.deepcopy(X). Одна ко такой способ редко можно встретить на практике – ссылок обыч но бывает достаточно и, как правило, в большинстве случаев доста точно бывает создать поверхностную копию (например, aList[:], aDict.copy() ). 6. Объект рассматривается как «истина», если он является либо нену левым числом, либо непустым объектом коллекции. Встроенные слова True и False по сути являются предопределенными именами числовых значений 1 и 0 соответственно. 7. В число допустимых ответов входят «Изучить язык Python», «Пе рейти к следующей части книги» или «Найти святую чашу Грааля». Упражнения ко второй части В этом разделе вам предлагается снова пройтись по основам встроен ных объектов. Как и прежде, вам попутно могут встретиться новые по нятия, поэтому обязательно сверьтесь с ответами в приложении B, ко Закрепление пройденного 267 гда закончите (и даже если еще не закончили). Если у вас не так много свободного времени, я рекомендую начать с упражнений 10 и 11 (так как они наиболее практичные), а затем, когда появится время, пройти все упражнения – от первого до последнего. Во всех упражнениях не обходимо знание фундаментальных сведений, поэтому постарайтесь выполнить как можно большую их часть. 1. Основы. Поэкспериментируйте в интерактивной оболочке с наибо лее часто используемыми операциями, которые вы найдете в табли цах второй части. Для начала запустите интерактивный сеанс рабо ты с интерпретатором Python, введите все нижеследующие выра жения и попробуйте объяснить происходящее: 2 ** 16 2 / 5, 2 / 5.0 "spam" + "eggs" S = "ham" "eggs " + S S * 5 S[:0] "green %s and %s" % ("eggs", S) ('x',)[0] ('x', 'y')[1] 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( ); L L.sort( ); L L.index(4) {'a':1, 'b':2}['b'] D = {'x':1, 'y':2, 'z':3} D['w'] = 0 D['x'] + D['w'] D[(1,2,3)] = 4 D.keys( ), D.values( ), D.has_key((1,2,3)) [[]], ["",[],( ),{},None] 2. Индексирование и извлечение среза. В интерактивной оболочке соз дайте список с именем L, который содержит четыре строки или чис ла (например, L = [0,1,2,3]). Затем исследуйте следующие случаи: a. Что произойдет, если попытаться получить доступ к элементу, индекс которого выходит за пределы списка (например, L[4])? b. Что произойдет, если попытаться извлечь срез, выходящий за пределы списка (например, L[-1000:100] )? c. Наконец, как отреагирует интерпретатор на попытку извлечь последовательность в обратном порядке, когда нижняя грани ца больше верхней (например, L[3:1])? Подсказка: попробуйте 268 Глава 9. Кортежи, файлы и все остальное выполнить операцию присваивания такому срезу ( L[3:1] = ['?'] ) и посмотреть, куда будет помещено значение. Как вы ду маете, это то же самое явление, что и при попытке извлечь срез, выходящий за пределы списка? 3. Индексирование, извлечение среза и инструкция del. Создайте дру гой список L с четырьмя элементами и присвойте одному из элемен тов пустой список (например, L[2] = []). Что произошло? Затем присвойте пустой список срезу (L[2:3] = []). Что случилось на этот раз? Не забывайте, что операция присваивания срезу сначала уда ляет срез, а затем вставляет новое значение в заданную позицию. Инструкция del удаляет элемент с указанным смещением, ключом, атрибутом или именем. Используйте ее для удаления элемента ва шего списка (например, del L[0]). Что произойдет, если попробовать удалить целый срез (del L[1:])? Что произойдет, если срезу присво ить объект, который не является последовательностью (L[1:2] = 1)? 4. Кортежи. Введите следующие строки: >>> X = 'spam' >>> Y = 'eggs' >>> X, Y = Y, X Как вы думаете, что произойдет с переменными после выполнения этой последовательности действий? 5. Ключи словарей. Рассмотрите следующий фрагмент: >>> 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. Общие операции. Получите в интерактивной оболочке ответы на следующие вопросы: Закрепление пройденного 269 a. Что произойдет, если попытаться использовать оператор + с опе рандами различных типов (например, строка+список, спи сок+кортеж)? b. Будет ли работать оператор +, когда один из операндов является словарем? c. Будет ли работать метод append со списками и со строками? Мож но ли использовать метод keys со списками? (Подсказка: что предполагает метод append о заданном объекте?) d. Наконец, какой тип объекта будет получен, когда операция кон катенации применяется к двум спискам или двум строкам? 8. Индексирование строк. Определите строку S из четырех символов: S = "spam" . Затем введите следующее выражение: S[0][0][0][0][0]. Можете ли вы объяснить, что произошло на этот раз? (Подсказка: не забывайте, строки – это коллекции символов, а символы в языке Python представлены односимвольными строками.) Будет ли это выражение работать, если применить его к списку, такому как ['s', 'p', 'a', 'm'] ? Почему? 9. Неизменяемые типы. Определите еще раз строку S из четырех сим волов: S = "spam". Напишите операцию присваивания, которая из менила бы строку на "slam", используя только операции извлечения среза и конкатенации. Возможно ли выполнить то же самое дейст вие с использованием операций индексирования и конкатенации? С помощью присваивания по индексу элемента? 10. Вложенные структуры. Создайте структуру данных для представ ления вашей личной информации: имя (имя, фамилия, отчество), возраст, должность, адрес, электронный адрес и номер телефона. При построении структуры вы можете использовать любые комби нации встроенных объектов (списки, кортежи, словари, строки, числа). Затем попробуйте обратиться к отдельным элементам структуры по индексам. Являются ли какиенибудь объекты более предпочтительными для данной структуры? 11. Файлы. Напишите сценарий, который создает и открывает для за писи новый файл с именем myfile.txt, и запишите в него строку " Hello file world!" . Затем напишите другой сценарий, который от крывает файл myfile.txt, читает и выводит на экран его содержи мое. Запустите поочередно эти сценарии из командной строки. Появился ли новый файл в каталоге, откуда были запущены сцена рии? Что произойдет, если указать другой каталог в имени файла, которое передается функции open? Примечание: методы записи в файлы не добавляют символ новой строки к записываемым стро кам. Добавьте символ \n явно в конец вашей строки, если хотите по лучить в файле полностью завершенную строку. 12. Функция dir. Попробуйте ввести следующие выражения в интерак тивной оболочке. Начиная с версии 1.5, функция dir была обобщена 270 Глава 9. Кортежи, файлы и все остальное так, что она выводит все атрибуты любого объекта, который вас мо жет заинтересовать. Если вы пользуетесь более ранней версией ин терпретатора, тот же эффект можно получить с использованием ме тода __methods__. Если вы пользуетесь интерпретатором Python 2.2, скорее всего функция dir окажется единственным работающим ин струментом. []._ _methods_ _ # 1.4 или 1.5 dir([]) # 1.5 и более поздние версии {}._ _methods_ _ # Словарь dir({}) III Инструкции и синтаксис 10 Введение в инструкции языка Python Теперь, когда вы познакомились с базовыми встроенными типами объ ектов языка Python, мы начинаем исследование фундаментальных форм инструкций. Как и в предыдущей части книги, мы начнем с об щего представления синтаксиса инструкций и затем, в нескольких сле дующих главах, более подробно рассмотрим конкретные инструкции. Выражаясь простым языком, инструкции – это то, что вы пишете, чтобы сообщить интерпретатору, какие действия должна выполнять ваша программа. Если программа «выполняет какието действия», то инструкции – это способ указать, какие именно действия должна вы полнять программа. Python – это процедурный язык программирова ния, основанный на использовании инструкций; комбинируя инструк ции, вы задаете процедуру, которую выполняет интерпретатор в соот ветствии с целями программы. Структура программы на языке Python Другой способ понять роль инструкций состоит в том, чтобы вновь вер нуться к иерархии понятий, представленной в главе 4, в которой рас сказывалось о встроенных объектах и выражениях, управляющих ими. Эта глава рассматривает следующую ступень иерархии: 1. Программы делятся на модули. 2. Модули содержат инструкции. 3. Инструкции состоят из выражений. 4. Выражения создают и обрабатывают объекты. Синтаксис языка Python по сути построен на инструкциях и выраже ниях. Выражения обрабатывают объекты и встраиваются в инструк ции. Инструкции представляют собой более крупные логические блоки 274 Глава 10. Введение в инструкции языка Python программы – они напрямую используют выражения для обработки объектов, которые мы рассматривали в предыдущих главах. Кроме того, инструкции – это место, где создаются объекты (например, в ин струкциях присваивания), а в некоторых инструкциях создаются со вершенно новые виды объектов (функции, классы и т. д.). Инструк ции всегда присутствуют в модулях, которые сами управляются инст рукциями. Инструкции в языке Python В табл. 10.1 приводится набор инструкций языка Python. 1 В этой части книги рассматриваются инструкции, которые в таблице расположены от начала и до инструкций break и continue. Ранее неофициально вам уже были представлены некоторые из инструкций, присутствующих в табл. 10.1. В этой части книги будут описаны подробности, опущен ные ранее; вашему вниманию будут представлены остальные процедур ные инструкции языка Python, а также будет рассмотрена общая син таксическая модель. Инструкции, расположенные в табл. 10.1 ниже, имеют отношение к крупным блокам программы – функциям, клас сам, модулям и исключениям и заключают в себе крупные понятия программирования, поэтому каждой из них будет посвящен отдельный раздел. Более экзотические инструкции, такие как exec (которая ком пилирует и выполняет программный код в строке), раскрываются да лее в книге или в стандартной документации по языку Python. Таблица 10.1. Инструкции языка Python 1 Строго говоря, в Python 2.5 инструкция yield превратилась в выражение, а инструкции try/except и try/finally были объединены (ранее это были от дельные инструкции, теперь же допускается одновременно использовать и except и finally в одной инструкции try). Кроме того, в Python 2.6 появи лась новая инструкция управления контекстом with/as – грубо говоря, она представляет собой альтернативу операциям try/finally, имеющим отно шение к исключениям (в 2.5 инструкция with/as является необязательным расширением, которое недоступно, пока явно не будет подключено инст рукцией from __future__ import with_statement). За дополнительной инфор мацией обращайтесь к руководству по языку Python. В будущей версии 3.0 инструкции print и exec превратятся в функции и появится новая инструк ция nonlocal, назначение которой будет напоминать назначение сущест вующей ныне инструкции global. Инструкция Роль Пример Присваивание Создание ссылок a, b, c = 'good', 'bad', 'ugly' Вызовы Запуск функций log.write("spam, ham\n") Вывод объектов print 'The Killer', joke if/elif/else Операция выбора if "python" in text: print text История о двух if 275 История о двух if Прежде чем углубиться в детали какойлибо конкретной инструкции из табл. 10.1, я хочу обратить ваше внимание на синтаксис инструк ций в языке Python, показав, как не надо писать программный код, чтобы у вас была возможность сравнить его с другими синтаксически ми моделями, которые, возможно, вы видели ранее. for/else Обход последовательности в цикле for x in mylist: print x while/else Циклы общего назначения while X > Y: print 'hello' pass Пустая инструкциязапол нитель while True: pass break, continue Переходы в циклах while True: if not line: break try/except/finally Обработка исключений try: action() except: print 'action error' raise Возбуждение исключений raise endSearch, location import, from Доступ к модулям import sys from sys import stdin def, return, yield Создание функций def f(a, b, c=1, *d): return a+b+c+d[0] def gen(n): for i in n, yield i*2 class Создание объектов class subclass(Superclass): staticData = [] global Пространства имен def function( ): global x, y x = 'new' del Удаление ссылок del data[k] del data[i:j] del obj.attr del variable exec Запуск фрагментов про граммного кода exec "import " + modName exec code in gdict, ldict assert Отладочные проверки assert X > Y with/as Менеджеры контекста (2.6) with open('data') as myfile: process(myfile) |