Главная » Просмотр файлов » Саммерфилд - Программирование на Python 3

Саммерфилд - Программирование на Python 3 (1077331), страница 89

Файл №1077331 Саммерфилд - Программирование на Python 3 (Саммерфилд - Программирование на Python 3) 89 страницаСаммерфилд - Программирование на Python 3 (1077331) страница 892018-01-10СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 89)

Кроме того, если будет вызван метод вепО() генератора, то переданное значение будет принято Функцией-генератором в качестве результата выражения уте10. Ниже показано, как можно использовать новую функцию-генератор: гево11 = [) Оепегатог = цоагтегв() нп11а 1еп(гево!1) < 5: х = пехт(цвпегатог) 1( аав(х - 0.5) < вув.г1оат тпго.ерв(1оп: х = Оепегатог.вела(1.0) гево1т.аррапа(х) Улучшенные приемы процедурного программирования 399 Здесь создается переменная, хранящая ссылку на генератор, и вызывается встроенная функция пех1(), которая извлекает очередной элемент из указанного ей генератора. (Того же эффекта можно было бы достичь вызовом специального метода пехг () генератора, в данном случае следующим образом: х = депега1ог, пехг ().) Если значение равно 0.5, генератору передается значение 1.0 (которое немедленно возвращается обратно).

На этот раз в результате будет получен список (0.0, 0.25, 1.0, 1.25, 1,5). В следующем подразделе мы рассмотрим программу таьчсчщтЬегв.ру, которая обрабатывает файлы, полученные в виде аргументов командной строки. К сожалению, в операционной системе Ъ~Чпг)оив командная оболочка (сто(.ехе) не обеспечивает расширения шаблонных символов в именах файлов (также называется подстановкой имен файлов, Ще «1оЬЬтя), поэтому, если программу запустить в %11пг)очгв с аргументом *, *, в список вув. а гду попадет не список всех файлов в текущем каталоге, а сам текст «".и».

Эта проблема была решена за счет создания двух различных функций де! (!1ев(), одной — для %1п«)овгз и другой — для 1?Ы1Х. В обеих функциях используются генераторы, как показано ниже: !г вув. р!в!гога. в!вг!вн!1Ь(Оа!и"); Оеп де! г!!ев(пазов): Гог попе !и пазов; 1г ов.рвгп.1вг!1е(папе): у!е!о папе е1ве: Гог Г11е гп д!оо.!д!оо(папе): !Г по! ов.лаго.!вГ!!е(Г!!е): ооп!!пое уге1О Г!!е е1ве: оег дег г!!ев(попов): ге!ого (г!!е гог гг!е 1п пааво 1г ов.

рагп, 1вг!1е( г1!е) ) В обоих случаях функция ожидает получить в виде аргумента список имен файлов, например, вув, а гду(1: ). В»(Г1пг(овгз функция выполняет обход всех имен в списке. Если очередное имя является именем файла, функция возвращает его; если зто не имя файла (обычно имя каталога), то используется функция 01оЬ.10- 1оЬ() из модуля 01оЬ, возвращающая итератор имен файлов, соответствующих указанному имени после расширения шаблонных символов. Для обычных имен, таких как аивоехес.Ьав, возвращается итератор, воспроизводящий единственный элемент (имя), а для имен, содержащих шаблонные символы, таких как *ах(, возвращается итератор, который воспроизводит все имена файлов, соответствующие шаблону (в данном случае — все имена файлов с расширением Лх().

(Существует также функция 01оЬ. 01оЬ(), возвращающая не итератор, а список.) боо Глава 8. Усовершенствованные приемы программированив В операционной системе [)М1Х подстановка на место шаблонных символов выполняется самой командной оболочкой, поэтому функция просто возвращает генератор всех полученных имен файлов.' Функции-генераторы могут использоваться для создания сопрограмм— функций, котрые имеют несколько точек входа и выхода (выражений уте! О) и которые могут приостанавливаться и возобновляться в определенных точках (опять же в местах, где находятся выражения у[е)б). Сопрограммы часто используются в качестве более простой и с меньшими накладными расходами альтернативы многопоточному программированию. В каталоге пакетов Ру(Ьоп Рас)саяе 1пс[ех (рур(.рут)топ.огярур() имеется несколько модулей сопрограмм.

Динамическое выполнение программного кода и динамическое импортирование В некоторых случаях бывает проще написать программный код, который генерирует другой программный код, чем писать напрямую весь необходимый программный код. А в некоторых случаях бывает удобнее дать пользователю возможность вводить свой программный код (например, функции в электронных таблицах) и позволить интерпретатору Ру$Ьоп выполнить введенный программный код, чем тратить время на создание синтаксического анализатора; хотя подобная возможность выполнять произвольный программный код влечет за собой угрозу безопасности.

Другой случай, когда может пригодиться возможность динамического выполнения программного кода, — поддержка архитектуры расширений, добавляющих в программу новые функциональные возможности. Недостаток расширяемой архитектуры состоит в том, что не вся необходимая функциональность встроена в программу непосредственно (что может осложнить развертывание программного продукта и добавить риск потери отдельных расширений).

Но в этом есть и свои преимущества, так как расширения могут обновляться по отдельности и могут поставляться отдельно от программы, — например, пополняя ее новыми возможностями, которые не были предусмотрены первоначально. Динамическое выполнение программного кода Самый простой способ выполнить выражение заключается в использовании встроенной функции еэв)(), с которой впервые мы встретились в главе 6.

Например: х = еча![ "[2 * ° 31) - 1") 4 х == 2147483847 Функция д[ов д)ов() не обладает такими широкими возможностями, как, скажем, командная оболочка ЬавЬ в ())х[1Х, — хотя Функция и поддерживает шаблонные символы °, 4 и синтаксическую конструкцию [), но она не поддерживает синтаксис (). 401 Улучшенные приемы процедурного программирования Такой способ отлично подходит для случая, когда выражение вводится пользователем, но как быть, если необходимо создать функцию динамически? Для этой цели можно использовать встроенную функцию ехес().

Например, пользователь может ввести формулу, такую как 4пг», и ее название — «агеа оХ эрЬеге» (площадь поверхности шара), которую необходимо преобразовать в функцию. Предположим, что х мы заменили на ва(Л, р(; тогда функция, которую требуется создать, могла бы выглядеть, как показано ниже: 4ВРОГ1 Вага созе = ''' лег агеа ог арлеге(г): гЕгиш 4 ° вага.р1 * г * 2 сопгех1 = () солгехг("вага" ] = вась ехес(созе, солгехг) Мы должны использовать надлежащие отступы, потому что указанный программный код должен соответствовать требованиям языка Ру- $)»оп. (Хотя в данном случае мы могли бы записать весь программный код в одной строке, потому что блок функции состоит всего из одной строки.) Если функции ехес( ) в виде единственного аргумента передать некоторый программный код, у нас не будет возможности получить доступ к каким-либо функциям или переменным, созданным в результате выполнения этого программного кода.

Кроме того, программный код, выполняемый функцией ехес(), не имеет доступа к импортированным модулям, переменным функциям и к другим объектам, которые находятся в области видимости в момент вызова. Обе зти проблемы решаются посредством передачи словаря во втором аргументе.

Словарь обеспечивает место, где будут сохраняться ссылки на объекты, которые будут доступны после того, как функция ехес() вернет управление. Например, использование словаря соп1ехг означает, что после вызова функции ехес() в словаре появится ссылка на объект функции агеа о( арлеге(), созданной в результате вызова ехес(). В данном примере нам необходимо, чтобы программный код, выполняемый функцией ехес(), обладал доступом к модулю вага, поэтому мы добавили в словарь сол1ех( элемент, ключом которого является имя модуля, а значением — ссылка на объект модуля.

Тем самым мы обеспечили доступность объекта ва(Л. ра для программного кода, выполняемого функцией ехес(). В некоторых случаях бывает удобно передать функции ехес() весь глобальный контекст. Сделать это можно, использовав словарь, возвращаемый функцией р1оба1а( ). Недостаток такого подхода состоит в том, что любые объекты, создаваемые вызовом функции ехес( ), будут добавлены в глобальный словарь. Решить эту проблему можно, скопировав глобальный контекст в словарь, например, сап1ех1 = р1оба1а().сору(). Дог Глава 8. Усовершенствованные приемы программирования Такой прием обеспечит программному коду, выполняемому функцией ехес( ), доступ ко всем импортированным модулям, переменным и другим объектам, имеющимся в области видимости, но любые изменения контекста, производимые в функции ехес(), будут сохраняться в словаре соптехт и не затронут глобальное окружение.

(Может показаться, что надежнее было бы выполнять копирование с помощью функции сору, Сеерссру( ), но если проблема обеспечения безопасности стоит остро, то лучше вообще отказаться от использования функции ехес().) Точно так же существует возможность передавать локальный контекст, например, передавая результат вызова функции 1оса18() в третьем аргументе — она обеспечивает программному коду, выполняемому функцией ехес(), доступ к объектам, созданным в локальной области видимости. После вызова функции ехес( ) словарь ссптехт будет содержать ключ "агеа оу враеге", значением которого будет функция агеа о( врлеге(). Ниже показано, как можно получить доступ к этой функции и вызвать ее: агеа сг врпеге = ссптехт("агеа сг арпеге") агеа = агеа ст арлеге(5) я агеа == 314.

15928535897933 Объект агеа о( вряеге — это ссылка на объект функции, созданной динамически, которая может использоваться как любая другая функция. Несмотря на то, что в этом примере была создана единственная функция, тем не менее, в отличие от функции еча1(), которая может интерпретировать единственное выражение, функция ехес() может выполнять любое число инструкций языка Руб)топ, включая целые модули, как будет показано в следующем подразделе.

Динамическое импортирование В языке Руб)топ имеются три простых механизма, которые могут использоваться для создания модулей расширения, причем все они связаны с импортированием модулей во время выполнения. Как только будет выполнено динамическое импортирование дополнительных модулей, можно с помощью функций интроспекции, входящих в состав языка Руб)топ, проверить доступность требуемых функциональных возможностей и задействовать их. В этом подразделе мы рассмотрим программу так(с-питЬегару. Эта программа считывает первые 1000 байтов нз каждого файла, указанного в командной строке, и для каждого из них выводит его тип (или текст яПп)спотчпи (тип неизвестен)) и имя.

Ниже приводится пример командной строки и фрагмент вывода программы: С:ХпутпспЗОХрутпсп. ехе па91с-ппзсегв. ау с: Хи1пссиаХ*. * ХМЫ................ с: титпосивхи1песиабле11. Мап1тевт бпхпсип... ... .....с Хиелеоия',Мгпесиебпсате. 1сс игпссиа ехесстас1е..с;Хи1пссивХигппе1р,ехе Улучшенные приемы процедурного программирования Нспоонв Ехесосаые.. с: Св1 ясона!в1пп1р32. ехе Испсовв ВМР !ваде...сп в1пооввсвсппс.овр Программа пытается загрузить все модули, находящиеся в том же каталоге, что и программа, имя файла которых содержит слово»исая!0».

Такие модули, как ожидается, содержат единственную общедоступную функцию с именем цеС г 11е Суре( ) . В состав примеров к книге входят два очень простых модуля, Зсап<(аг<ЕМаа(сХитЬегз ру и ))У!л<!оигз. Мау(сЖитЬегз.ру, каждый из которых экспортирует функцию цеС гс1е суре().

Мы будем рассматривать функцию ва1п() программы, разделив ее на две части: бег васп(): восо1ев = 1аас восо1ев() деС Г11е Суре Голос!Ьпв = () Гог вооо1е 1п вооо)ев; дес 111е суре = дес Голос!оп(воео1е, "деС Гые Суре" ) СГ цеС Гме суре 1в пос Моле: цес Гс1е Суре Гопсгсопв.аррепс(цег 111е Суре) Вскоре мы увидим три различные реализации функции!Оац зобо!ее(), возвращающей (возможно, пустой) список объектов модулей, а затем рассмотрим функцию цес гопсс1оп(). Для каждого найденного модуля мы попробуем получить доступ к функции цес гс1е суре() и добавим все такие функции в список.

Характеристики

Тип файла
DJVU-файл
Размер
6,88 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6518
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее