Лутц М. - Изучаем Python (1077325), страница 168
Текст из файла (страница 168)
Решения упражнений Часть 1. Введение Упражнения находятся в главе 3, в разделе вУпражнения к первой части». 1. Взаимодействие. Предположим, что настройка РуФ)>оп выполнена правильно, тогда сеанс взаимодействия с интерактивной оболочкой должен выглядеть примерно так, как показано ниже (вы можете запустить интерактивную оболочку любым способом, по своему усмотрению — в ПЭЬЕ, из системной командной строки и т. д.): % русьоп ...строки с информацией об авторских правах.
»> "Неыо Иог1й" 'НеПо Ног1а. '' »> Ф Длл вихода используйте Стг1-0 или Стг1-7, или закройте окно 2. Программы. Содержимое файла (то есть модуля) тос(и!в1.ру и сеанс взаимодействия с командной оболочкой операционной системы должны выглядеть, как показано ниже: рг1пт 'НеПа еосц1е иог1й ' % рук%оп еозо1е1.ру НеПо аопц1е иог1й Вы можете запустить этот файл любым другим способом — щелчком мыши на ярлыке файла, с помощью пункта меню Кип-ьйзп Иода(е (Запустить-+Запустить модуль) и т. д. 3. Модули, Следующий пример сеанса взаимодействия иллюстрирует запуск модуля при его импортировании: % руепоп »> 1ерогс еоец1е1 уву Решения упражнений Не11о вааа1е ногИ.' »> Не забывайте: чтобы запустить модуль еще раз в течение этого же сеанса работы в интерактивной оболочке, необходимо перезагрузить его.
Просьба переместить файл в другой каталог и снова импортировать его содержит одну хитрость: если интерпретатор Ру!)аоп создал в первоначальном каталоге файл тос(и1е).рус, при импорте он будет использовать этот файл, даже если файл с исходным программным кодом (.ру) будет перемещен в другой каталог, расположенный за пределами пути поиска модулей. Если интерпретатор имел доступ к файлу с исходным программным кодом, он автоматически создаст файл .рус, содержащий байт-код скомпилированной версии модуля.
Подробнее о модулях рассказывается в пятой части книги. 4. Сценарии. Предположим, что ваша платформа поддерживает интерпретацию комбинации символов з!, решение этого упражнения должно выглядеть примерно так, как показано ниже ( на вашем компьютере в строке р! может потребоваться указать другой путь): а)/авг/1оса1/ып/ругпоп (или а!/авг/ып/епу ру1поп) рггп1 'Неыо вааа1е ног1О' ' % ааааа +х воаа1е1, ру % вооа1е1. Ру Не11о воаа1е ногИ' б. Ошибки. Ниже показано, какие сообщения об ошибках будут получены по завершении этого упражнения.
В действительности вы вызываете исключения — по умолчанию при возникновении исключений интерпретатор завершает работу программы и выводит сообщение об ошибке вместе содержимым стека вызовов на экран. Информация из стека показывает, в каком месте программы произошло исключение. В седьмой части книги вы узнаете, как перехватывать исключения с помощью инструкции тгу и как обрабатывать их. Вы также увидите, что в состав Ру!Ьоп входит полноценный отладчик исходного программного кода, обладающий возможностями анализа ошибок после возникновения исключения. А пока обратите внимание, что в случае появления ошибок РуФоп выводит вполне информативные сообщения (вместо того чтобы просто аварийно завершать программу вообще без каких-либо сообщений): % аут%оп »> 1 / О тгасеоася (Тппегвовг 1авг); Е!1е тюа1а!п>", 1>пе 1, Тп > 7егоаауьваопЕггог: !пгедег Шиш>оп ог воаа1о (7егаа!и!в>опЕггог: целочисленное деление или деление по модулю) »> 789 Решения упражнений лять такие зацикливания и внимательно изучать действия про- граммы, чтобы избежать зацикливания.
Хотите верьте, хотите нет, но циклические структуры данных ино- гда могут быть полезны [но не тогда, когда выводятся на экран!). Часть! 1. Типы и операции Упражнения находятся в главе 9, в разделе «Упражнения ко второй части«, Основы. Ниже приводятся результаты, которые вы должны получить, с некоторыми комментариями к ним. Обратите внимание, что здесь иногда используется символ;, чтобы поместить несколько инструкций в одну строку.
Символ; — это разделитель инструкции: а Числа »> 2 * ° !6 65536 »> 2 / 5, 2 / 5.0 № / усекает целие числа, а с плавающей точкой - нет (О, 0.40000000000000002) в Строки № Конкатенация »> "дгееп Мз апа Кз" М ("вддз", 3) № Форматирование 'дгееп ецдз апо пащ' № Кортежи й Списки »> ( (1,2,3] + [4,5,6] № Операции над спискаии »> Ц Е[:], ([:О], [[-2], Ц-2:] ([1, 2.
3, 4, 5, 6], (1, 2, 3, 4, 5, 6], [], 5, [5, 6]) »> ((1,2,3]+[4,5,6])(2.'4] (3 4] »> (Ц2], Цз]] [3, 4] »> "зращ" + "ецдз зраще99з »> 3 саащ »> "еддз " + 3 'е99з паа' »> 3 ° 5 'пащпащпащпащпащ' >» 3(:О] »> ('х',)(О] элемента 'х' »> ('х, У Н1] элементов У № Повторение № Пустой срез с первого элемента - [О;О] № Индексирование кортежа, состоящего из одного № Индексирование кортежа, состоящего из двух № Извлечение по смещениям с сохрэнениеи в списке 790 Приложение В »> (. гечегвв( ); [6, 5, 4, 3, 2, 1] »> ь.вогт(); [1, 2, 3, 4, 5, 6] »> (. 1поех(4) 3 № Метод: обратное упорядочивание злеиентов в списке № Метод: сортировка элеиентов в списке № Метод, сиеюение первого вкохдения 4 (поиск) в Словари »> ( 'а'; 1, 'Ь'; 2)[ ' Ь' ] № Извлечение элемента словаря по клю~у 2 »> 0 = ('х':1, 'у':2, 'т.':3) >» О['и'] - "0 № Создаст новую запись »> О['х'] + О['и'] 1 »> 0[(1,2,3)] 4 № Использование кортеиа в качестве № ключа (неизиеняеинй) »> 0 ('и': О, 'т': 3, 'у': 2, (1, 2, 3): 4, 'х'.
'1) »> О.хауз(), О.ча)чав(), О.ьав хеу((1,2,3)) № метода (['и', 'г', 'у', (1, 2, 3), 'х ], [О, 3, 2, 4, 1), 1) в Пустив объекте »> [[ П ["",[] (),(),Иола] № Мноиество пустих объектов ( [[ ] ], [ ' ', [ ], ( ), ( ), Иопв ] ) 2. Индексирование и извлечение среза. Если попытатъся получить доступ к элементу, индекс которого выходит за пределы списка (например, ([4]), будет возбуждено исключение — интерпретатор всегда проверяет выход за пределы последователъностей.
С другой стороны, операция извлечения среза с использованием индексов, выходящих за пределы последователъности (например, [[-1000: 100]), будет выполнена без ошибок, потому что интерпретатор Ру()ьоп всегда корректирует срезы, выходящие за пределы, так, чтобы они соответствовали границам последовательности (пределы устанавливаются равными нулю и длине последователъности, если это необходимо). Извлечение последовательности в обратном порядке, когда нижняя граница больше верхней (например, [[3; 1]), в действительности работать не будет.
Вы получите пустой срез (( ]), потому что интерпретатор скорректирует границы среза так, чтобы нижняя граница оказалась меньше или равна верхней границе (например, выражение ЦЗ: 1] будет преобразовано в выражение С[3: 3]- пустая позиция со смещением 3). Срезы в языке Ру(]1оп всегда извлекаются слева направо, даже при использовании отрицательных индексов (они сначала будут преобразованы в положительные индексы за счет добавления длины последовательности). Обратите внимание, что в РуФ](оп 2.5 появились срезы с тремя пределами: выражение [[3;1; -1] на самом деле извлекает срез справа налево: Решения упражнений 791 »> 1 = [1, 2, 3, 4] »> 1[4] ТгасеаасК ([ппегаовт 1авт): Ег 1е "<втоца>". 1>пе 1, 1п > 1псехЕггог: 1)в1 1псех оц1 от гавре (1псехЕггог: выход индекса ва пределы списка) »> Е[-1000;100] [1, 2, 3, 4] »> [[3;1] [] »> [1, 2, 3, 4] »> 1[эг1] ['2'] »> Е [1, 2, 3, 'о', 4] 3.
Индексирование, извлечение среза и инструкция гуе]. Сеанс взаимодействия с интерпретатором должен выглядеть примерно так, как показано ниже. Обратите внимание, что присваивание пустого списка по указанному смещению приведет к сохранению объекта пустого списка в этой позиции, но присваивание пустого списка срезу приведет к удалению этого среза. Операция присваивания срезу ожидает получить другую последовательность, в противном случае будет получено сообщение о неверном типе операнда — она вставляет элементы, находящиеся внутри этой последовательности, а не саму последовательность: »> 1 = [1,2,3,4] »> 1[2] = [] »> [1, 2, [], 4] »> [[2:3] = П »> [ [1, 2, 4] »> Се1 1[0] >» [2, 4] »> Ве1 [[1:] »> [2] »> [[1:2] = 1 ТгасеоасК (тппегаовт 1авг) ет1е "<втотп>", 1гпе 1, гп т турееггог: тпеда1 агдцаепт туре гог оц1!т-гп орегаттоп (ТуреЕггог: неверный тип аргумента встроенной операции) 4.
Кортежи. Значения )( и у поменяются местами. Когда слева и справа от оператора присваивания [=] появляются кортежи, интерпретатор выполнит присваивание объектов справа объектам слева в соответствии с их позициями. Это объяснение, пожалуй, самое простое для понимания, хотя целевые объекты слева и не являются настоя- Приложение В щим кортежем несмотря на то, что они именно так и выглядят, — это просто набор независимых имен, которым выполняется присваивание.
Элементы справа — это кортеж, который распаковывается в процессе выполнения операции присваивания (кортеж играет роль временного хранилища присваиваемых данных, необходимого для достижения эффекта обмена): »> Х = 'вэаа' »> У = 'езев' »>х, у=у, х »> Х 'ессв' >» у 'враз' 5. Ключи слоеарей. В качестве ключа словаря может использоваться любой неизменяемый объект, включая целые числа, кортежи, строки и т.
д. Это действительно словарь, несмотря на то, что некоторые из его ключей выглядят как целочисленные смещения. Допускается с одним и тем же словарем использовать ключи разных типов: »> 0 = () »> 0[1] = 'а' »> 0[2] 'Ь' »> 0[(1, 2, 3)] = 'с' »> 0 (1: 'а', 2: 'Ь', (1, 2, 3): 'с') 6. Индексирование словарей.