Саммерфилд - Программирование на Python 3 (1077331), страница 41
Текст из файла (страница 41)
Вам потребуется обойти элементы словаря и создать маленькую функцию из двух строк, которая будет извлекать значение каждого элемента, и передать ее в виде аргумента Кеу функции вог1ео( ) . Кроме того, потребуется соответствующим образом изменить инструкцию рг!и!(). Это несложно, но тут есть некоторый подвох. Решение приводится в файле ипщ'иеигогг(з апзру. 3. Модифицируйте программу Ыепега!е изегпатез.ру так, чтобы в каждой строке она выводила информацию о двух пользователях, ограничив длину имени 17 символами; через каждые 64 строки программа должна выводить символ перевода формата и в начале каждой страницы она должна выводить заголовки столбцов. Ниже приводится пример того, как должен выглядеть вывод программы: Иаае 10 бвагпаае Заве 10 бвегпаза А!!к!и, бпа!па...
(2370) ва!!кгп А1оегвоп, л!со1е. (5429) па1оагво А111ВОП, Кагаа... (Об21) Ка11!воп А1кооа, Ко1а Е... (2095) каа1коос Аппга, Леагчапа.. (2б33) паппге Аррагвоп, Епсуапп (7252) 1еаррегв Упражнения 1ву Это достаточно сложно. Вам потребуется сохранить заголовки столбцов в переменных, чтобы потом их можно было использовать по мере необходимости, и изменить спецификаторы формата, чтобы обеспечить вывод более коротких имен. Один из способов обеспечить постраничный вывод заключается в том, чтобы сохранить все выводимые строки в списке, а затем выполнить обход списка, используя оператор извлечения среза с шагом для получения элементов слева и справа и применяя функцию г! р( ) для их объединения.
Решение приводится в файле уепегаге изегпатез апз.ру, а достаточно большой объем исходных данных вы найдете в файле дага/ изегз2ххЕ. Управляющие структуры и функции В первых двух разделах этой главы будут рассматриваться управляющие структуры языка Ру1поп, причем в первом разделе будут рассматриваться условные инструкции и циклы, а во втором — инструкции обработки исключительных ситуаций. Большая часть управляющих структур и основы обработки исключений уже рассматривались в главе 1, но в этой главе они будут изучены более полно, включая дополнительный синтаксис управляющих структур, а также порядок возбуждения исключительных ситуаций и создание собственных исключений.
Третий и самый большой раздел посвящен созданию собственных функций, и здесь будет подробно рассматриваться чрезвычайно гибкий механизм работы с аргументами функций. Собственные функции позволяют нам упаковывать параметризуемую функциональность и уменьшать объем программного кода за счет оформления повторяющихся фрагментов в виде функций многократного использования. (В следующей главе мы узнаем, как создавать собственные модули, чтобы одни и те же функции можно было использовать в разных программах.) Управляющие структуры В языке Ру1поп условное ветвление реализуется с помощью инструкции 11, а циклическая обработка — с помощью инструкций м111е и 1сг 1с.
В языке Ру1йоп имеется также такая конструкция, как условное выражение — вариант инструкции 11, аналог трехместного оператора ~~: ), имеющегося в С-подобных языках. 189 Управляющие структуры Условное ветвление Как мы видели в главе 1, общий синтаксис инструкции условного ветвления в языке РУС)соп имеет следующий вид: ст Ооо1еап ехргеяясопт; ящ тес е11С Ооо1еап ехргеяясоп2: ящ Се2 е111 Оао1еап ехргеяясопн. яоссее е1яе: е1яе ящСе Инструкция может содержать ноль или более предложений е1ст.
Заключительное предложение е1яе также является необязательным. Если необходимо предусмотреть ветку для какого-то особого случая, который не требует никакой обработки, в качестве блока кода втой ветки можно использовать инструкцию разя (она ничего не делает и просто является инструкцией-заполнителем, используемой там, где должна находиться хотя бы одна инструкция). В некоторых случаях можно сократить инструкцию !С ... е1яе до единственного условного выражения.
Ниже приводится синтаксис условных выражений: ехргеяясоп1 сс ооо1еап ехргеямоп е1яе ехргеяюоп2 Если логическое выражение ооо1еап ехргеяяуоп возвращает значение Тгое, результатом всего условного выражения будет результат выражения ехргеяясоп С, в противном случае — результат выражения ехргеяя1оп2. В практике программирования часто применяется такой прием, когда в переменную сначала записывается значение по умолчанию, а затем в случае необходимости оно изменяется, например, по требованию пользователя или в результате выяснения типа платформы, на которой выполняется программа. Ниже приводится типичная реализация такого приема с использованием инструкции ! С: о!свес = 20 1с пос яуя.р1ассога.ясагсяпссп!"в!п"); оттает = 10 Переменная яуя. р1аттоге хранит название текущей платформы, например, «уу1п32» или «11ппх2».
Тот же результат можно получить с помощью условного выражения: о!свес = 20 сс яуя.р1ассога.ясагсяпссп!"всп") е1яе 10 В данном случае нет необходимости использовать круглые скобки, но их использование поможет избежать малозаметных ловушек. Например, предположим, что нам необходимо записать в переменную и!0сп 190 Глава 4. Управляющие структуры и функции значение 100 и прибавить к нему 10, если переменная вагО!и имеет значение Тгое. Мы могли бы написать такое выражение: нсССП = 100 + 1О !Г аагй!и е1зе 0 Ф ОШИБКЯ! Особенно неприятно, что эта строка программного кода работает правильно, когда переменная аагО!и имеет значение Тгсе, записывая значение 110 в переменную и!ОСЬ. Но когда переменная нагО!п имеет значение Га1зе, в переменную и!ОСЬ вместо 100 будет записано значение О.
Это происходит потому, что интерпретатор РУС)гоп воспринимает выражение 100 + 10 как часть ехргезасопт условного выражения. Решить зту проблему можно с помощью круглых скобок: »гсССП = 100 + (!О ст взгссп е1зе О) Кроме того, круглые скобки делают программный код более понятным для человека. Условные выражения могут использоваться для видоизменения сообщений, выводимых для пользователя. Например, при выводе числа обработанных файлов, вместо того чтобы печатать «О Ие(а)», «1 Ие(з)»' или что-то подобное, можно было бы использовать пару условных выражений: рг!пс("(0) гс1е(1)".тсгаас((осип! !т соспс .'= 0 е1зе "пс"), ("з" ст ссспт '.= ! е1зе ""))) Эта инструкция будет выводить «по Л!ез», «1 Ие», «2 П1ез» и т.
д„что придаст программе более профессиональный вид. Циклы В языке РуС)топ есть две инструкции циклов — иЛ!1е и Гог ... сп, которые имеют более сложный синтаксис, чем было показано в главе 1. Циклы ччЬ1!е Ниже приводится полный синтаксис цикла ия!1е: нсс!е Ьсс)сап ехргезюоп: »Пт1е зщте е1зе есзе зщсе Предложение е1зе является необязательным. До тех пор, пока выражение Ьоо) еап ехргеаа!Оп возвращает значение Тгсе, в цикле будет выполняться блок «гЛ!)е во!ге. Если выражение Ьоо) еап ехргезз1оп вернет Имеется в виду склонение по числам, то есть вместо «1 файл(ов)», «5 файл(ов)» можно выводить более правильно: «1 файл», «5 файлов».
Но в отлн. чие от английского языка реализация правильного склонения по числам в русском языке не уместится в два условных выражения. — Прим. персе. 191 Управляющие структуры значение Га1ве, цикл завершится, и при наличии предложения е1ве будет выполнен блок е]ве во]те. Если внутри блока нЛ!]е вш те выполняется инструкция поп!!псе, то управление немедленно передается в начало цикла и выражение Ьоо]еал ехргеввтол вычисляется снова. Если цикл не завершается нормально, блок предложения е1ве не выполняется.
Необязательное предложение е1ве имеет несколько сбивающее с толку название, поскольку оно выполняется во всех в случаях, когда цикл нормально завершается. Если цикл завершается в результате выполнения инструкции Ьгеак или ге!ого, когда цикл находится внутри функции или метода, или в результате исключения, то блок е]ве во! ге предложения е1ве не выполняется. (При возникновении исключительной ситуации интерпретатор РуФ)топ пропускает предложение е1ве и пытается отыскать подходящий обработчик исключения, о чем будет рассказываться в следующем разделе.) Плюсом такой реализации является одинаковое поведение предложения е1ве в циклах илт)е, в циклах гог ...
!п и в блоках тгу ... ехсер!. Рассмотрим пример, демонстрирующий предложение е1ве в действии. методы втг,!поех() и 1!в!. тпоех() возвращают индекс заданной подстроки или элемента или возбуждают исключение Уа1оеЕггог, если подстрока или элемент не найдены. Метод втг, гтпа() делает то же самое, но в случае неудачи он не возбуждает исключение, а возвращает значение -1. Для списков не существует эквивалентного метода, но при желании мы могли бы создать такую функцию, использующую цикл ьлт1е: пег 1шт тпм(1вт, тагоет): шаех = О япт1е !паек < 1еп(1вт); тт 1вт(!пзех] == тагает: Ьгеак тпаех += 1 е1ве: тппех = -т гетогп тпоех Эта функция просматривает список в поисках заданного элемента та гает.
Если искомый элемент будет найден, инструкция Ьгеак завершит цикл и вызывающей программе будет возвращен соответствующий индекс, Если искомый элемент не будет найден, цикл достигнет конца списка и завершится обычным способом. В случае нормального завершения цикла будет выполнен блок в предложении е1ве, индекс получит значение -1 и будет возвращен вызывающей программе. Циклы аког Подобно циклу илт1е, полный синтаксис цикла гог ... !и также вклю- чает необязательное предложение е1ве: 192 Глава 4. Управляющие структуры и функции Гог ахргеяятоп вп ттагаи)е: гог витте в1ве; а1яе витте В качестве выражения екргеяяуоп обычно используется либо единственная переменная, либо последовательность переменных, как правило, в форме кортежа.
Если в качестве выражения ехргеяя1ол используется кортеж или список, каждый элемент итерируемого объекта утегаМе распаковывается в элементы ехргеяяуоп. Если внутри блока Гог яит ге встретится инструкция сопттпие, управление будет немедленно передано в начало цикла и будет начата новая итерация. Если цикл завершается по выполнении всех итераций и в цикле присутствует предложение е1ве, выполняется блок е1яе яШ те. Если выполнение цикла прерывается принудительно (инструкцией Ьгеая или гетигп), управление немедленно передается первой инструкции, следующей за циклом, а дополнительное предложение е1ве при этом пропускается.