Справочник от Автор24
Поделись лекцией за скидку на Автор24

Модули Python

  • ⌛ 2020 год
  • 👀 468 просмотров
  • 📌 416 загрузок
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Модули Python» pdf
Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 . Модули Python Модуль Python – это файл с программным кодом на языке Python. Модули нужны для структурирования больших проектов путём из разбиения (декомпозиции) на части. Если программный код файла большой (более 2-х экранов), то его рекомендуется разбивать на части, так как с увеличением длины кода увеличивается вероятность ошибки в нём, и, следовательно, снижается его надёжность. Другой плюс модулей – это возможность повторного использования кода. Например, если поместить в модуль функции или классы, которые используются другими модулями проекта, то это позволяет сэкономить время на разработке проекта благодаря использованию однажды уже разработанных одним из участников проекта функций. Учебные программы, как правило, очень маленькие, и для них не требуется выполнять (за редким исключением) разбиение на модули. Но данную технологию требуется освоить для разработки более крупных и серьёзных проектов. Ещё одно преимущество модулей – это предотвращение конфликтов имён. Одинаковые имена функций в разных модулях не будут мешать друг другу (конфликтовать друг с другом), тогда как в одном модуле одинаковые имена функций не допускаются. Модули упрощают работу с Python. Многие стандартные функции Python не встроены в основное ядро языка, а предоставляются конкретными модулями, загружаемыми по мере необходимости, например: math – модуль математических функций; 1 Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 . cmath – модуль математических функций для комплексных чисел; random – модуль для работы с (псевдо)случайными числами; re – модуль для работы с регулярными выражениями (Regular Expressions) и т.д. Создание модуля Рассмотрим создание модуля на примере. Создадим новый Python-файл в IDLE с именем mymath.py и следующим содержанием: Пример 10-2 (файл MyMath.py) # Модуль MyMath.py pi = 3.14159 def area(r): # Площадь круга global pi return(pi * r * r) def circumference(r): # Длина окружности global pi return(2*pi*r) def rectangle_area(a,b): # Площадь прямоугольника return(a*b) def rectangle_perimeter(a,b): # Длина периметра прямоугольника return(2*(a+b)) В данном файле ряд известных математических величин оформлены в виде функций языка Python. Теперь создадим ещё один файл, который содержит следующий код: Пример 10-3 (файл 10-3.py) 2 Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 . # 10-3 работа с модулем MyMath.py import MyMath r = int(input('Введите радиус окружности - ')) a = int(input('Введите сторону a прямоугольника - ')) b = int(input('Введите сторону b прямоугольника - ')) # Площадь круга S = MyMath.area(r) print('Площадь круга с радиусом {0} = {1} '.format(r,S)) # Длина окружности D = MyMath.circumference(r) print('Длина окружности с радиусом {0} = {1} '.format(r,D)) # Площадь прямоугольника S_Rect = MyMath.rectangle_area(a,b) print('Площадь прямоугольника со сторонами {0},{1} = {2}'.format(a,b,S_Rect)) # Длина периметра прямоугольника P_Rect = MyMath.rectangle_perimeter(a,b) print('Длина периметра прямоугольника со сторонами {0},{1} = {2}'.format(a,b,P_Rect)) Запускаем программу и получаем сообщение вида: Traceback (most recent call last): File "C:/2019/УЧЁБА ОСЕНЬ 2019/ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ АНАЛИЗ И ПРОГРАММИРОВАНИЕ (ЭБб-18-1)/ЛЕКЦИИ/Лекция - 10/10-3 работа с модулем MyMath.py", line 3, in import MyMath Данное сообщение означает, что Python «не видит» модуль MyMath.py. Такое может произойти, если список путей Python не содержит путь к каталогу с файлом модуля. Для выхода из этой ситуации поместим файл модуля MyMath.py в рабочую 3 Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 . папку Python – а именно, в ту самую папку, где находится файл python.exe (предварительно его потребуется найти). Сделаем это. и получим результат: Введите радиус окружности - 5 Введите сторону a прямоугольника - 3 Введите сторону b прямоугольника - 4 Площадь круга с радиусом 5 = 78.53975 Длина окружности с радиусом 5 = 31.4159 Площадь прямоугольника со сторонами 3,4 = 12 Длина периметра прямоугольника со сторонами 3,4 = 14 Следует отметить необходимость использования точечной нотации для использования функций модуля: S = MyMath.area(r) D = MyMath.circumference(r) S_Rect = MyMath.rectangle_area(a,b) P_Rect = MyMath.rectangle_perimeter(a,b) ,т.е. перед именем каждой вызываемой функции модуля пишем имя самого модуля, разделяемые точкой. Такая форма доступа часто называется уточнением (то есть имя функции area уточняется именем модуля mymath). При необходимости можно явным образом импортировать из модуля нужные имена, например. Пример 10-4 (файл 10-4.py) # 10-4 Импорт имён из модуля from MyMath import pi print("Значение Пи равно - ",pi) 4 Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 . Результат Значение Пи равно - 3.14159 Когда модуль импортируется в первый раз, Python выполняет его синтаксический разбор (парсинг) и, если синтаксических ошибок нет, создаёт файл .pyc (например, MyMath.pyc) с байт-кодом Python. При подключении модуля при повторном запуске программы парсинг повторно не производится, загрузка идёт из компилированного байт-кода (файл MyMath.pic). Теперь если мы изменим исходный код модуля MyMath.py, то эти изменения могут не отразиться, так как Python будет использовать ранее скомпилированный файл MyMath.pyc. Чтобы заставить Python всякий раз делать принудительную перекомпиляцию модуля, нужно выполнить следующее: Пример 10-5 (файл 10-5.py) # Пример 10-5. Перезагрузка модуля import MyMath, importlib importlib.reload(MyMath) from MyMath import pi print("Значение Пи равно - ",pi) Результат: Значение Пи равно - 3.14159 Здесь мы используем функцию reload из модуля importlib для принудительной перезагрузки модуля MyMath. Некоторые итоги по модулям:  Модуль представляет собой файл, определяющий объекты Python.  Модуль modulename хранится в файле с именем modulename.py. 5 Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 .  Модуль с именем modulename подключается для использования командой import modulename. После выполнения команды к объектам, определённым в модуле, можно обращаться в форме modulename.имя_объекта.  Возможно подключить к программе конкретные имена из модуля командой from modulename import имя_объекта. Эта команда позволяет напрямую обращаться к имени имя_объекта без указания префикса modulename; что удобно для часто используемых имён. Дополнение. С модулями удобнее работать в программе PyCharm. Для получения доступа к модулю его достаточно поместить в папку проекта (будет рассмотрено позже). Команда import Команда import позволяет подключать модули к программе. Данная команда существует в 3-х видах: 1) import modulename Она ищет модуль Python с заданным именем, разбирает его содержимое и делает его доступным для программы. Импортирующий код может использовать содержимое модуля, но любые обращения из этого кода к именам из модуля должны снабжаться префиксом с именем модуля. Если модуль с указанным именем не найден, происходит ошибка. 2) from modulename import name1, name2, name3,… Данная форма разрешает явно импортировать имена из модуля в код. Каждое из имен name1, name2 и т. д. из модуля modulename становится доступным в импортирующем коде; код после команды import может использовать имена name1, name2, name3 и т. д. без указания префикса с именем модуля. 3) from modulename import * 6 Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 . Данная форма является обобщённой. Символ * обозначает все экспортируемые имена из modulename. Команда from modulename import * импортирует все общедоступные имена из modulename (то есть имена, не начинающиеся с символа подчёркивания) и позволяет использовать их в импортирующем коде без указания префикса с именем модуля. Но если в модуле существует список имён __all__ (или в файле __init__.py пакета), то эти имена будут импортироваться независимо от того, начинаются они с подчёркивания или нет. Следует быть осторожными при использовании этой формы импортирования. Если некоторое имя определяется в двух модулях и мы импортируем оба модуля в этой форме, возникнет конфликт имён и имя из второго модуля заместит имя из первого модуля. Кроме того, с этой формой читателю нашего кода будет труднее определить, откуда взялись используемые имена. С любой из двух предшествующих форм команды import мы передаём читателю кода конкретную информацию об их происхождении. Некоторые модули (например, графическая библиотека tkinter) присваивают своим функциям имена, с которыми их происхождение становится очевидным, а риск конфликтов имён сводится к минимуму. Также обобщённая форма import нередко используется для того, чтобы избежать лишних нажатий клавиш в интерактивной оболочке. Путь поиска модулей Каталоги, в которых Python ищет модули, определяются в переменной с именем path, к которой можно обратиться через модуль с именем sys. Введём следующие команды: >>> import sys >>> sys.path В результате будет выведен список папок, где Python будет искать модули. Значение, которое выводится в последней строке, зависит от конфигурации системы. В любом случае строка содержит список каталогов, в которых Python проводит 7 Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 . поиск (в указанном порядке) при выполнении команды import. Используется первый найденный модуль, удовлетворяющий запросу на импортирование. Если найти подходящий модуль не удаётся, инициируется исключение ImportError. При работе в программе IDLE пути, в которых Python ищет модули, можно просмотреть в графическом виде при выполнении команды меню: File  PathBrowser Рисунок 1 – Обозреватель путей PathBrowser Переменная sys.path инициализируется значением переменной среды (переменной окружения операционной системы) PYTHONPATH, если она существует, или же значением по умолчанию, зависящим от установки Python. Кроме того, при выполнении сценария Python в начало переменной sys.path для этого сценария включается каталог, в котором находится сценарий; это позволяет удобно определить, в каком каталоге находится выполняемая программа Python. В интерактивном сеансе первому элементу sys.path присваивается пустая строка, что Python воспринимает как указание начать поиск модулей с текущего каталога. Пример 10-6. Создадим 2 файла со следующим кодом # Файл pit.py pi = 3.14 8 Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 . # Файл path.py #import pit #from pit import pi #from pit import * print(pi) , и затем проверим все 3 способа подключения файла-модуля pit.py. Где следует размещать модули Чтобы наша программа могла использовать написанные модули, необходимо:  Разместить модули в одном из каталогов, в которых Python обычно ищет модули;  Разместить все модули, используемые программой Python, в одном каталоге с программой;  Создать каталог (или каталоги) для хранения модулей и изменить переменную sys.path, чтобы она включала этот новый каталог (или каталоги). Из всех трёх вариантов первый реализуется проще всего; тем не менее этот вариант следует выбирать только в том случае, если версия Python включает локальные каталоги с кодом в путь поиска модулей по умолчанию. Такие каталоги специально предназначены для кода, привязанного к компьютеру; они не будут перезаписаны при новой установке Python, потому что они не являются частью установки Python. Если переменная sys.path включает такие каталоги, можно разместить свои модули в них. Рассмотрим пример, в котором мы 1) создадим каталог для модулей MyModuls; 2) добавим путь к созданному каталогу в sys.path 3) Импортируем помещённые в данный каталог модули в нашу программу Пример 10-7. # 10-7. Путь к каталогу с модулями 9 Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 . import sys print(sys.path) # Далее подставить путь sys.path.append('Путь_к_каталогу_с_модулями') print(sys.path) from Mod1 import * from Mod2 import * print(text1) print(text2) Ограничение доступа к объектам в модулях При выполнении команды импортирования вида from module import * импортируются почти все имена объектов из модуля. Исключения составляют объекты, имена которых начинаются с символа _ (подчёркивание). Такие объекты являются приватными (частными, локальными) объектами модуля. Для пояснения рассмотрим пример. Пример 10-8. Частные объекты модуля from modtest import * # Пример 10-8. Частные объекты модуля print(f(2019)) print(a) print(_g(6)) print(_b) 10 Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 . При этом код модуля modtest.py выглядит так: # Пример 10-8. Частные объекты модуля from modtest import * print(f(2019)) print(a) print(_g(6)) print(_b) Результат 2019 4 Traceback (most recent call last): File "C:/2019/УЧЁБА ОСЕНЬ 2019/ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ АНАЛИЗ И ПРОГРАММИРОВАНИЕ (ЭБб-18-1)/ЛЕКЦИИ/Лекция - 10/10-8. Частные объекты модуля.py", line 5, in print(_g(6)) NameError: name '_g' is not defined К именам без начального символа подчёркивания в модуле (f,a) мы имеем доступ, а к именам с символом _ (_g, _b) - нет, так как они являются частными (приватными, локальными) для данного модуля. Экосистема Python содержит огромное число сторонних модулей, подавляющее число которых являются открытыми и бесплатными для применения всеми желающими. Правила их использования будут рассмотрены позднее. 11 Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 . Правила областей видимости и пространств имён Python Пространство имён в Python представляет собой отображение между идентификаторами и объектами, то есть способ хранения в Python информации об активных переменных и идентификаторах и о тех объектах, на которые они указывают. В Python, есть три пространства имён: 1) локальное, 2) глобальное и 3) встроенное. Когда во время выполнения программы обнаруживается идентификатор, Python сначала ищет его в локальном пространстве имён. Если идентификатор не будет найден, поиск продолжается в глобальном пространстве имён. Если идентификатор и здесь не обнаружен, проверяется встроенное пространство имён. Если идентификатор не существует, Python решает, что произошла ошибка, и выдаёт исключение NameError. Для модуля, команды, выполненной в интерактивном сеансе или в сценарии, запущенном из файла, глобальные и локальные пространства имён совпадают. Создание любой переменной или функции, или импортирование чего-либо из другого модуля приводит к появлению нового элемента (или привязки) в этом пространстве имён. Но при вызове функции создаётся локальное пространство имён, в котором для каждого параметра вызова создаётся отдельная привязка (binding). Затем новые привязки вводятся в локальное пространство имён каждый раз, когда внутри функции создаётся переменная. Глобальное пространство имён функции представляет собой глобальное пространство имён вмещающего блока функции (то есть модуля, файла сценария или интерактивного сеанса). Оно не зависит от динамического контекста, в котором совершается вызов. Во всех перечисленных ситуациях встроенным пространством имён является пространство имён модуля __builtins__. Среди прочего, этот модуль содержит все встроенные функции, уже встречавшиеся ранее (такие, как len, min, max, int, float, list, tuple, range, str ), и другие встроенные классы Python, например NameError. 12 Объектно-ориентированный анализ и программирование. Лекция 2020 – 1 . Мы можем переопределять элементы во встроенном модуле. Например, если создать в программе список и сохранить его в переменной с именем list, мы в дальнейшем не сможем использовать встроенную функцию list — при поиске сначала будет обнаружена привязка для нашей переменной list. Имена функций, модулей и других объектов в этом отношении не различаются. Используется самая новая привязка для заданного идентификатора. Это можно продемонстрировать на следующем примере: # Пример 10-9. Создание привязки >>> a="Hello" >>> b=list(a) >>> print(b) ['H', 'e', 'l', 'l', 'o'] >>> list=25 >>> c=list('Test') Traceback (most recent call last): File "", line 1, in c=list('Test') TypeError: 'int' object is not callable Как видим, функция list (создание списка) перестала работать, так как для имени list создана новая привязка. 13
«Модули Python» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Помощь с рефератом от нейросети
Написать ИИ

Тебе могут подойти лекции

Смотреть все 588 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot