Лутц М. - Изучаем Python (1077325), страница 82
Текст из файла (страница 82)
В результате будет открыта веб-страница, содержащая ссылки на описания всех модулей, доступных вашей программе. б. Мои, конечно. (А если серьезно, в предисловии имеется перечень некоторых книг, как справочных пособий, так и учебников, рекомендуемых для дальнейшего прочтения.) Упражнения к третьей части Теперь, когда вы узнали, как описывается логика работы программы, в следующих упражнениях вам будет предложено реализовать решение некоторых простых задач с использованием инструкций. Самым большим является упражнение 4, где вам будет предложено рассмотреть альтернативные варианты реализации. Одна и та же задача всегда может быть решена разными способами и отчасти изучение языка Ру- $)«оп заключается в том, чтобы находить более оптимальные решения.
Решения приводятся в приложении В, в разделе «Часть П1, Инструкции и синтаксис». 1. Основы циклов. а. Напишите цикл Гог, который выводит АЯСП-коды всех символов в строке с именем Я. Для преобразования символов в целочисленные АЯСП-коды используйте встроенную функцию о гб( сна гас се г ) . (Поэкспериментируйте с ней в интерактивной оболочке, чтобы понять, как она работает.) Ь. Затем измените цикл так, чтобы он вычислял сумму кодов АЯСП всех символов в строке.
с. Наконец, измените свой программный код так, чтобы он возвращал новый список, содержащий АЯСП-коды всех символов в строке. Дает ли выражение азр(огб, 8) похожий результат? (Подсказка: прочитайте четвертую часть.) 2. Сил«волы обратного олеша. Что произойдет, если в интерактивной оболочке ввести следующий программный код? гог г и гапэе(50); Рг1ж 'Пе11о ьзуп1а' % 1 Будьте осторожны при запуске этого примера не в среде П)ЬЕ, он может сгенерировать звуковой сигнал, что может не понравиться окружающим. Среда разработки ПЗЬЕ вместо этого выводит малопонятные символы (символы, экранированные обратным слешем, приводятся в табл, 7.2).
3. Сортировка словарей. В главе 8 мы видели, что словари представляют собой неупорядоченные коллекции. Напишите цикл гог, который выводит элементы словаря в порядке возрастания. Подсказка: используйте метод Кеуэ словаря и метод списка зогг или новую встроенную функцию вог1ес. 382 Глава 14. Документация 4. Програмэеирование альтернативной логики. Изучите следующий фрагмент, где для поиска числа 2 в пятой степени (32) в списке степеней числа 2, используются цикл ия11е и флаг (сслс. Этот фрагмент хранится в файле рошег ру. (1, 2, 4.
б, 15, 32, 54] Х=5 гоопс = т = 0 еят1е пот Гоияс еле т < 1еп(б): 11 2 ** Х == т(т] горло = 1 е1зе; т = те1 тг гооло; рг1пт 'ет тпсех', е1зе рг1от х, 'пот гоооо' с Хооокхтезте> рутяоя роеег.ру ат тпеех 5 В этом примере не используются обычные приемы программирования, принятые в языке Ру(Ьоп. Следуя указаниям ниже, попробуйте улучшить его (вы можете вносить изменения в интерактивной оболочке или сохранять в файле сценария и запускать его из командной строки системы — использование файла существенно упростит это упражнение): а.
Сначала добавьте в цикл илт1е блок е1зе, чтобы избавиться от флага гоцпг] и последней инструкции 11. Ь. Затем перепишите пример с циклом бог и блоком е1зе, чтобы избавиться от логики вычисления индексов в списке. Подсказка: получить индекс элемента можно с помощью метода тлоех ((..
1лт]ех(Х)), возвращающего смещение первого элемента со значением Х в списке. с. Затем вообще избавьтесь от цикла, реализовав решение на основе оператора (л проверки вхождения. (Подробности вы найдете в главе 8 или попробуйте ввести такое выражение: 2 ш (1,2,3].) г(. Наконец, вместо литерала списка ( используйте цикл бог и метод аррелб для заполнения списка степеней двойки.
Более глубокие улучшения: е. Как вы думаете, повысится ли производительность, если выражение 2 ** Х вынести за пределы циклов? Как это можно сделать? Как мы видели в упражнении 1, Ру(Ьоп включает в себя функцию вар(тслсттоп, 11зт), которая может создать список степеней числа 2: езр(1агбсз х; 2 ** х, галсе(7)). Попробуйте выполнить этот программный код в интерактивной оболочке; с инструкцией 1азооа мы познакомимся в главе 17. Основы функций В третьей части книги мы рассмотрели основные процедурные инструкции языка Ру1поп.
В этой части мы переходим к исследованию набора дополнительных инструкций, которые используются при создании функций. Если говорить просто, то функция — это устройство, которое группирует набор инструкций так, что в программе они могут запускаться неоднократно. Функции могут вычислять некоторый результат и позволять указывать входные параметры, отличающиеся по своим значениям от вызова к вызову. Возможность оформления операций в виде функций — это очень удобный инструмент, который мы можем использовать в самых разных ситуациях. С принципиальной точки зрения функции устраняют необходимость вставлять в программу избыточные копии блоков одного и того же программного кода, так как они могут быть заменены единственной функцией.
Благодаря функциям можно существенно уменьшить трудозатраты на программирование: если операцию необходимо будет видоизменить, достаточно будет внести изменения всего в одном месте, а не во многих. Функции — это самые основные программные структуры в языке РуФоп, обеспечивающие многократное использование программного кода и уменьшающие его избыточность. Как будет показано далее, функции — это еще и средство проектирования, которое позволяет разбить сложную систему на достаточно простые и легко управляемые части.
В табл. 15.1 приводятся основные инструменты, имеющие отношение к функциям, которые мы будем изучать в этой части книги. Глава 15. Основы функций 386 Таблица 1б.1. Инструкции и вь»ражения, имеющие отношение к функц ям Зачем нужны функции? Прежде чем перейти к обсуждению деталей, мы нарисуем себе четкую картину, что из себя представляют функции. Функции — это практически универсальное средство структурирования программы. Возможно, раньше вам уже приходилось сталкиваться с ними в других языках программирования, где они могли называться подпрограммами или процедурами.
В процессе разработки функции играют две основные роли: Максимизировать многократное использование программного кода и минимизировать его избыточность Как и в большинстве других языков программирования, функции в языке Руспоп представляют собой простейший способ упаковки логики выполнения, которая может использоваться в разных местах программы и более чем один раз. До сих пор весь программный код, который нам приходилось писать, выполнялся немедленно. Функции позволяют группировать и обобщать программный код, который может позднее использоваться произвольное число раз. Так как функции позволяют поместить реализацию операции в одно место и использовать ее в разных местах, они являются самым основным инструментом структуризации: они дают возможность уменьшить избыточность программного кода и тем самым уменьшить трудозатраты на его сопровождение.
Процедурная декомпозиция Функции также обеспечивают возможность разбить сложную систему на части, каждая из которых играет вполне определенную роль. Например, чтобы испечь пиццу, сначала нужно замесить тесто, раскатать его, добавить начинку, испечь и т. д. Если бы мы писали программу для машины по выпечке пиццы, мы могли бы общую задачу «испечь пиццу» разбить на мелкие части — по одной функции для каждого из этапов. Гораздо проще создать решение маленьких задач по отдельности, чем реализовать весь процесс целиком.
Вообще функции описывают «как делать», а не «зачем делать». В шестой части книги мы увидим, почему это различие имеет такое большое значение. 387 Создание функций В этой части книги мы исследуем понятия языка Ру1Ьоп, используемые при создании функций: основы функций, правила области видимости и передача аргументов, а также ряд сопутствующих концепций, таких как генераторы и функциональные инструменты. Мы также еще раз вернемся к понятию полиморфизма, введенному ранее в этой книге, поскольку на данном уровне его важность становится еще более очевидной. Как вы увидите, функции привносят не так много новых синтаксических конструкций, но они ведут нас к более существенным идеям программирования. Создание функций Несмотря на то, что функции еще не были представлены формально, тем не менее, мы уже использовали некоторые из них в предыдущих главах. Например, для создания объекта файла мы вызывали функцию ореп; точно так же мы использовали встроенную функцию 1ел, когда нам необходимо было узнать число элементов в объекте коллекции.
В этой главе мы узнаем, как создаются новые функции в языке Ру$Ьоп. Функции, которые мы пишем сами, ведут себя точно так же, как и встроенные функции, которые нам уже приходилось встречать: они могут вызываться в выражениях, получать значения и возвращать результаты. Но для того чтобы создавать новые функции, необходимо ввести дополнительные понятия. Кроме того, в языке Ру$Ьоп функции ведут себя иначе, чем в компилирующих языках программирования, таких как С. Ниже приводится краткое введение в основные концепции, составляющие основу функций в языке Ру$Ьоп, каждую из которых мы будем изучать в этой части книги: ° бег — это исполняемый программный код.
Функции в языке Ру1Ьоп создаются с помощью новой инструкции сег. В отличие от функций в компилирующих языках программирования, таких как С, Оеу относится к классу исполняемых инструкций — функция не существует, пока интерпретатор не доберется до инструкции сег и не выполнит ее. Фактически, вполне допустимо (а иногда даже полезно) вкладывать инструкции сег внутрь инструкций 1Г, циклов н1111е и даже в другие инструкции се1. В случае наиболее типичного использования инструкции Эе1 вставляются в файлы модулей и генерируют функции при выполнении во время первой операции импортирования. ° бег создает объект и присваивает ему имя.
Когда интерпретатор Ру$Ьоп встречает и выполняет инструкцию беГ, он создает новый объект-функцию и связывает его с именем функции. Как и в любой другой операции присваивания, имя становится ссылкой на объект-функцию. В имени функции нет ничего необычного — как будет показано далее, объект-функция может быть связан с несколькими именами, сохраняться в списке и т. д. Кроме того, функции могут создаваться с помощью выражения 1аэбса (более сложная концепция, которая будет рассматриваться в одной из последующих глав).