Саммерфилд - Программирование на Python 3 (1077331), страница 9
Текст из файла (страница 9)
Переменная иашаЫе поочередно указывает на каждый объект в объекте тгегаЫе. В качестве тгегаЫе может использоваться любой тип данных, допускающий выполнение итераций по нему, включая строки (где итерации выполняются по символам строки), списки, кортежи и другие типы коллекций языка РуФ]топ. гпг соиптгу 1п ["0епаагк", "етп!апс", "ног»ау", "Яыааеп"]: ргтпт(соишгу) Здесь мы использовали весьма упрощенный подход к выводу списка стран. На практике то же самое обычно делается с помощью переменных: спиптгтеа = ["0епаагк", "етп!апа", евогнау", "ънепеп"] Гог сииптгу тп соиптгтеа: рг1пт(сииптгу) На самом деле весь список (или кортеж) можно вывести Генераторы единственным вызовом функции рг1пт(), напРимеР списков, ргтпт(соиптгтеа), но часто предпочтительнее выводить стр.т42 содержимое коллекций в цикле Гог (или в генераторах списков, о которых будет рассказываться позже), чтобы иметь полный контроль над форматированием.
44 Глава 1. Быстрое введение в процедурное программирование Сот 1ассег сп "АВСОЕРВН!акснаОРОВВТОунхуЕ": сг 1еттег Сп "АЕ100": ргспс(1ессег, "са а хона1") е1ае: рыпт( 1еттег, "са а оопаопапт") В первой строке этого фрагмента мы использовали ключевое слово Сп, как часть инструкции Сог, и переменную 1еССег, последовательно принимающую значения "А", "В" и так далее до "2" на каждом проходе цикла. Во второй строке мы снова использовали ключевое слово Сп„но на этот раз в качестве оператора проверки членства, Обратите также внимание на то, что в этом примере присутствуют вложенные блоки кода.
Блок кода цикла Сог представлен инструкцией с( ...е1зе, а обе ветки — и ст, и е1зе — имеют свои собственные блоки кода. Основы обработки исключений Многие функции и методы в языке РуС)соп в случае появления ошибок или наступления других важных событий возбуждают исключения. Исключение — это объект, такой же как любые другие объекты в языке РуС)соп, который при преобразовании в строку (то есть при выводе на экран) воспроизводится как строка с текстом сообщения.
Ниже показана простейшая форма обработки исключений: сгу: сгу аисте ахсерс ехсерссопт аа оагсаа!ет: ехоерссоп пассат ехсерс ехоерссогу аа оагсао1ерп ехсерссоп аю саа Обратите внимание на то, что часть аа оаг1ар)е является необязательной — нас может волновать только сам факт возникновения исключения, а текст сообщения может быть для нас неинтересен. Полный синтаксис имеет более сложный вид, например, каждое предложение ехсерс может обрабатывать несколько исключений, а кроме того, можно использовать необязательное предложение е1зе. Обо всем этом подробно рассказывается в главе 4.
Эта конструкция работает следующим образом. Если инструкции в блоке кода с гу выполняются без ошибок, блоки ехсерс просто пропускаются. Если в блоке сгу будет возбуждено исключение, управление немедленно будет передано блоку первого соответствующего предложения ехсерс — то есть любые инструкции в блоке с гу, расположенные ниже инструкции, вызвавшей исключение, выполняться не будут.
В случае исключения и если указана часть аа оагсаЬ)е, внутри блока обработки исключения переменная оагсаО)е будет ссылаться на объект исключения. «Золотой запаса Ру()поп Если исключение возникнет в блоке ехсер1 или для возникшего исключения не будет обнаружено соответствующего предложения ехсерт, то РуФЬоп начнет поиск блока ехсерт в следующем объемлющем контексте. Поиск подходящего обработчика исключения будет выполняться в направлении наружу и вверх по стеку вызовов, пока не будет найдено соответствие.
Если соответствия найдено не будет, то программа будет аварийно завершена с выводом сообщения об ошибке. В случае появления необработанного исключения интерпретатор Ру1Ьоп выводит диагностическую информацию и текст сообщения. Например: в = 1прж("ептег ап тптедег: ") тгу: 1 = 1пт(В) ргтпт("ча!тс (птедег ептегес:", т) ехсерт уа!ыеЕггог ав егг: рг1пт(егг) Если пользователь введет 3. 5, будет выведено сообщение: шча!то !!таге! (ог 1пт() итти паве 10: '3.5' (неверный литерал типа тпт() по основанию 10; '3.5') Но если он введет 13, вывод будет иной: ча!1О ппедег ептегес; 13 В многих книгах считается, что обработка исключений — это тема повышенной сложности, и ее рассмотрение откладывается как можно дальше. Но возбуждение и особенно обработка исключений — это фундаментальный способ работы Ру1Ьоп. поэтому мы затронули этот вопрос в самом начале.
И, как будет показано позже, обработчики исключений могут сделать программный код более удобочитаемым, отделяя «исключительные» случаи от обработки, которая для нас представляет наибольший интерес. Составляющая й«6: арифметические операторы Язык РуФЬоп предоставляет полный комплект арифметических операторов, включая двухместные операторы, выполняющие четыре основных арифметических действия: + (сложение), — (вычитание), * (умножение) и гг (деление). Кроме того, многие типы данных в языке Ру1Ьоп допускают использование комбинированных операторов присваивания (или„в соответствии с другой используемой системой терминов,— операторов дополняющего присваивания), таких как += и *=.
Операторы +, - и * действуют так, как и следовало ожидать, когда в качестве операндов выступают целые числа: »>5+5 11 »> 3 - 7 46 Глава 1. Быстрое введение в процедурное программирование -4 »>4 8 32 Обратите внимание, что оператор может использоваться как унарный (оператор отрицания) и как двухместный оператор (вычитание), что является вполне обычным для большинства языков программирования. Язык Ру8)топ начинает выделяться из общей массы других языков, когда дело доходит до оператора деления: »>12/3 4 0 »>37'2 1.
5 Оператор деления возвращает значение с плавающей точкой, а не целое значение. Во многих других языках он возвращает целое значение, отсекая дробную часть. Если требуется получить целочисленный результат, его всегда можно преобразовать с помощью 1пт( ) (или использовать оператор деления с усечением тттт, который будет рассматриваться позже). о Числовые операторы и функции, стр. 74 »> а = 5 »> а 5 »> а 4= 8 »> а 13 На первый взгляд в предыдущих инструкциях нет ничего особенного, особенно для тех, кто знаком с С-подобными языками программирования.
В таких языках программирования комбинированные операторы присваивания являются сокращенной формой записи присваивания результата операции, например, выражение а += 8 эквивалентно выражению а = а т 8. Однако следует иметь в виду две важные тонкости: одна имеет отношение только к языку Ру$)топ и одна характерна для комбинированных операторов присваивания во всех языках. Первое, что важно запомнить, это то, что тип 1пт является неизменяемым, то есть после присваивания значение типа 1пт нельзя изменить.
Поэтому при выполнении комбинированного оператора присваивания с неизменяемыми объектами в действительности создается новый объект с результатом, а затем целевая ссылка на объект привязывается к этому новому объекту. То есть когда в предыдущем случае интерпретатор РуФ)топ встретит инструкцию а += 8, он вычислит значение а т 8, сохранит результат в новом объекте типа тпт и запишет в а ссылку на этот новый объект типа тпт. (Если после этого в программе не останется ни одной ссылки, указывающей на первоначальный объект, он будет утилизирован сборщиком мусора.) Рис. 1.3 иллюстрирует, как это происходит.
<Золотой запаса Рут)поп 49 Попытка добавить простую строку (например, "бр г1ап" ), а не список, содержащий ее ( [ "сог1ап" ]), приведет к логичному, но, возможно, неожиданному результату: »> веабв = ["ваваае", "вопт1о<гег", "роарКсп"] »> ваабв <= бог!до »> веебв ['веваэе', 'вопт!оаег', 'роарКсп', 'б', 'о', 'г', 'с', 'а', 'и'] Оператор <= списков расширяет список, добавляя к нему каждый элемент итерируемого объекта, находящегося справа, а поскольку строка— это итерируемый объект, то каждый символ строки будет добавлен как отдельный элемент.
При использовании метода аррепб() его аргумент всегда добавляется в список как единый элемент. Составляющая й'7: ввод/вывод Чтобы писать по-настоящему полезные программы, нам необходимо иметь возможность читать входные данные — например, с клавиатуры или из файла и выводить результаты — либо на консоль, либо в файлы. Мы уже использовали встроенную функцию рг! пС(), но ее рассмотрение отложим до главы 4.
В этом подразделе мы сосредоточим свое внимание на консольном вводе/выводе, а для чтения и записи файлов будем использовать механизм перенаправления командной оболочки. В языке Ру()соп имеется встроенная функция !прот(), с помощью которой можно читать ввод пользователя. Эта функция принимает необязательный строковый аргумент (который выводится в консоли как строка приглашения к вводу) и ожидает, пока пользователь введет ответ и завершит ввод клавишей Ел(ег (или йе(шп).
Если пользователь не введет никакой текст и просто нажмет клавишу Ел(ег, функция !про!( ) вернет пустую строку, в противном случае она возвращает строку, содержащую ввод пользователя без символа завершения строки. Ниже приводится первая <полезная< программа. В ней использовано большинство из уже описанных составляющих, единственное новое в ней — это вызов функции !про!(): ргспс("Туре 1псерегв, паол то11о<габ Ьу Епсаг; ог ]овс Епсег Со т!псвл") СОСа1 = 0 оопп! = 0 КЫ1а Тгоа: 1!па = !прас("со!враг: ") сс 1!па: сгу: поаЬег = тпт(1!пе) ахоарС На!оеЕггог ав агг: рыпт(егг) попс!пав соса1 <= поаЬег Глава 1, Быстрое введение в процедурное программирование сввп! и= 1 в1вв; Ьгвах сг сввп!: рг!пс("соил! =", соим, "ссса1 =", соса1, "ювап =", соса1 / сввп!) Эта программа (файл аилс).ру в примерах к книге) состо- ит всего лишь из 17 строк выполняемого программного кода.