Саммерфилд - Программирование на Python 3 (1077331), страница 49
Текст из файла (страница 49)
В этой главе было показано, что лямбдафункции могут использоваться как для создания анонимных функций, так и для создания коротких именованных функций — путем присваивания их переменным. В главе также было рассмотрено применение инструкции аээегг. Зта инструкция очень удобна для проверки истинности предварительных условий и результатов при каждом обращении к функции и может оказать действенную помощь в создании надежных программ и в ликвидации ошибок. В этой главе мы рассмотрели Фундаментальные основы создания функций, а, кроме того, в нашем распоряжении имеется еще масса других приемов. Сюда входят возможность создания динамических функций (эти функции создаются во время выполнения программы, причем их реализация может изменяться в зависимости от обстоятельств), рассматриваемых в главе 5; локальных (вложенных) функций, рассматриваемых в главе 7; а также рекурсивных функций, генераторов функций и т.
д., о чем будет рассказываться в главе 8. В языке Ру1Ьоп имеется значительное число встроенных функций и обширнейшая стандартная библиотека, тем не менее все равно остается вероятность, что мы напишем такие функции, которые пригодятся Взак юзл 226 Глава 4. Управляющие структуры и функции во многих наших программах. Копирование функций из файла в файл может превратить в кошмар сопровождение таких программ, но, к счастью, РУФ]топ предоставляет простое решение этой проблемы: модули. В следующей главе мы узнаем, как создавать свои собственные модули со своими функциями в ннх. Мы увидим, как выполнять импортирование функциональных возможностей из стандартной библиотеки и из наших модулей, а также коротко рассмотрим, что может предложить стандартная библиотека, чтобы нам не пришлось повторно изобретать колесо.
Упражнения Напишите интерактивную программу обслуживания списков строк в файлах. При запуске программа должна создать список всех файлов с расширением Лаг в текущем каталоге. Воспользуйтесь функцией ов. 11вто1г(" . "), чтобы получить список всех файлов, и отфильтруйте из него те файлы, которые не имеют расширения Лаг. В случае отсутствия таких файлов программа должна попросить пользователя ввести имя файла и добавить расширение .[аг, если пользователь не сделал этого. Если были найдены один или более файлов .Ы, программа должна вывести их имена в виде списка пронумерованных строк, начиная с 1.
Пользователю должно быть предложено ввести номер желаемого файла или О; в последнем случае программа должна попросить у пользователя ввести имя нового файла. Если был указан существующий файл, программа должна прочитать его содержимое. Если файл пуст или было указано имя нового файла, программа должна вывести сообщение «по 11етпв аге ш 1Ье 1[в(» (список не содержит элементов). В случае отсутствия элементов должно быть предложено два варианта действий: «Ас]б» (добавить) и «Яш(» (выйти).
Если список содержит один или более элементов, строки из списка должны выводиться пронумерованными, начиная с 1, а из доступных действий должны быть предложены варианты «АсЫ» (добавить), «Ре1е(е» (удвлить), «Яауе» (сохранить) (если файл еще не сохранялся) и «ЯшС» (выйти). Если пользователь выбирает действие «Яш[» и при этом имеются несохраненные изменения, ему должна быть предоставлена возможность сохранить их.
Ниже приводится пример сеанса работы с программой (большая часть пустых строк, а также заголовок «[1в1 Кеерег», который выводится всякий раз при выводе списка, были удалены из листинга): спооое 111епапе: ао»теэ -- по ттесв ага !п тпе 11вт [А]ОО [0]отт [а], а лоо 11ее: со»о Аотоа11у Упражнения 1: Еоче Асгоа11У [д]аа [0]е1есе [8]аче [О)шс [а]: а Абб 1Сеа: АЬооС а Воу 1: АЬООС а Воу 2: еоче дссоа11У [А]ба [0]е1есе [8]аче [О]О1с [а]: Аба сгев; А11еп 1: АЬООС а Воу 2; А11еп 3: Саче АсСоа11у [д]аа [о]в[все [8]аче [о]осс [а]: к ЕВВОВ: спча1са споссе--епгег опе ОГ 'АаООБвдо' Ргевв Епгег Со сопвсПОЕ.., [А]аа [0]е!есе [8]аче [О)осс [а]: б Ое!есе ссеа поаьег (ог О со сапсе1). 2 1 АЬООС а Воу 2; Еоче Асгоа11У [д)аа [0]е1еСе [8]аче [О]ч1С (а]: в Бачеб 2 ссеав со аочсев.
1вс Ргевв Епгег Со сопС1пое.. 1: АЬооС а Воу 2; Соче дсСоаыу [д)аа [О]е1еге [О]и1С [а]: Аба [Сеа: Роог Хеаа1пдв апа а Ропега1 1. 'ДЬООС а ВОУ 2: Роог Иеааспдв апа а Ропега1 3: Еоче Асгоа11У [А]аа [о)е)есе [8)аче [О]юс [а]: О Баче чпвачеа спапдев (уlп) [у]: Бачеа 3 асеев со аоч!ев.1вС Функция васо() должна быть не очень большой (не более 30 строк) идолжна содержать только основной цикл программы. Напишите функцию, которая будет получать имя нового или существующего файла (и в последнем случае загружать элементы списка), и функцию, которая будет выводить перечень доступных действий и принимать выбор пользователя. Напишите также функции, которые будут добавлять элемент, удалять элемент, выводить список (либо имен файлов, либо элементов списка строк), загружать список и сохранять список. Вставьте в свою программу копии функций деС БС гспд() и деС спСедег() из программы та)ге Ыт( Ме(есол.ру или напишите свои собственные версии. При выводе элементов списка строк или имен файлов ширина поля для вывода номеров строк должна быть равна 1, если список содержит менее десяти элементов, 2 — если в списке менее 100 элементов и 3— в противном случае.
ггв Глава 4. Управляющие структуры и функции Всегда выводите элементы списка в алфавитном порядке, без учета регистра символов, и следите за состоянием списка (за наличием несохраненных изменений). Действие «Заче» должно предлагаться только при наличии несохраненных изменений, а перед выходом программа должна спрашивать у пользователя, не желает ли он сохранить изменения, только если таковые имеются. Добавление и удаление элементов считаются действиями, которые изменяют список, а после выполнения операции сохранения список снова должен считаться неизме.
пенным. Пример решения находится в файле Иатйеерегру и занимает менее 200 строк программного кода. Модули Функции позволяют упаковывать фрагменты программного кода, чтобы его можно было многократно использовать по всей программе, а модули обеспечивают средство объединения функций (и, как мы увидим в следующей главе, наших собственных типов данных) в коллекции, чтобы их можно было использовать в разных программах. В языке РуФЬоп имеются также средства создания иакетов — наборов модулей, объединенных, как правило, по функциональным признакам или вследствие зависимости друг от друга. В первом разделе этой главы описывается синтаксис операции импортирования функциональных возможностей из модулей и пакетов, входящих в состав стандартной библиотеки, или из наших собственных модулей и пакетов. Затем в этом же разделе будет показано, как создавать собственные пакеты и модули.
Будут продемонстрированы два примера собственных модулей. Из них первый пример является вводным, а во втором демонстрируется, как решаются многочисленные проблемы, возникающие на практике, такие как платформенная независимость и тестирование. Во втором разделе дается краткий обзор стандартной библиотеки языка Ру$Ьоп. Очень важно знать, что может предложить стандартная библиотека, потому что использование предопределенных функциональных возможностей существенно ускоряет программирование, позволяя не создавать все и вся с чистого листа.
Кроме того, многие модули из стандартной библиотеки используются очень широко. Они тщательно протестированы и обладают высокой надежностью. Помимо краткого обзора будет приведено несколько небольших примеров, иллюстрирующих типичные случаи использования. До- Глава 5. Модули полнительно будут приводиться ссылки на описания модулей в других главах. Модули и пакеты Модуль в языке Ру1)топ — это обычный файл с расширением .ру. Модуль может содержать любой программный код на языке РуСЬоп.
Каждая программа, которую мы писали до сих пор, находилась в отдельном файле.ру, который можно считать не только программой, но и модулем. Основное различие между модулем и программой состоит в том, что программа предназначена для того, чтобы ее запускали, тогда как модуль предназначен для того, чтобы его импортировали и использовали в программах. Не все модули располагаются в файлах с расширением .ру, например, модуль вуа встроен в РуФЬоп, а некоторые модули написаны на других языках программирования (чаще всего на языке С).
Однако большая часть библиотеки языка РуФ)топ написана именно на языке Ру1Ьоп, так, например, добавляя инструкцию 1арогт со11ест(опа, мы получаем возможность создавать именованные кортежи вызовом функции со1- 1есшопв. павеотор1е(), а функциональные возможности, к которым мы получаем доступ, находятся в файле модуля со)(ест(опару.
Для наших программ совершенно неважно, на каком языке программирования написан модуль, потому что все модули импортируются и используются одним и тем же способом. Импортирование может выполняться несколькими синтаксическими конструкциями, например: гарогт гарогтааге !арест гарогтаыег, герогтаые2, ..., гарогтаогеа тарогт гарогтаые аа ргегеггео паае о Здесь под уарог(аЫе подразумевается имя модуля, такое Пакеты, сто. 234 как сс11ест1опа, но точно так же это может быть пакет или модуль из пакета, и тогда все части имени отделяются друг от друга точками (. ), например, оз. ратл. Первые две конструкции мы используем на протяжении всей книги.
В них нет ничего сложного, и они являются самыми безопасными, потому что позволяют избежать конфликтов имен, так как вынуждают программиста всегда использовать полные квалифицированные имена. Третья конструкция позволяет давать импортируемому модулю или пакету имя по выбору — теоретически это может привести к конфликтам имен, но на практике синтаксис ав обычно используется, чтобы как раз избежать их.