Любой программный язык включает в себя базовые функции, которые доступны сразу и не требуют дополнительных действий для их активации. Однако с течением времени на популярных языках создается огромное количество функций и классов, применяемых множеством разработчиков в самых разных сферах. Включение всего этого кода в сам язык, даже если это и возможно технически, оказывается нецелесообразным.
Для решения задачи доступа к дополнительным функциям языка программирования принято использовать модули, пакеты и библиотеки. Каждый модуль содержит набор функций и классов, предназначенных для решения специфических задач. Например, модуль math в Python предлагает математические функции, модуль random генерирует псевдослучайные числа, модуль datetime позволяет работать с датами и временем, а модуль sys предоставляет доступ к системным переменным и многое другое.
Значительный объем модулей для Python объясняется его большой популярностью. Часть этих модулей входит в стандартную библиотеку, которую можно использовать сразу после установки языка, тогда как другие являются сторонними и требуют отдельной установки и загрузки.
Чтобы пользоваться функциями модуля, его необходимо импортировать в программу. После импорта интерпретатор "узнает" о всех доступных классах и функциях и позволяет их использовать.
В Python для импорта используется команда import, и существует несколько вариантов импорта. Рассмотрим их на примере модуля math:
>>> import math
Сразу после этого имя math становится доступным в глобальной области видимости. До импорта попытка упомянуть его вызвала бы ошибку NameError:
>>> math
<module 'math' (built-in)>
Теперь в программе доступен объект math, принадлежащий классу module.
Чтобы узнать, какие функции доступны в модуле, используем встроенную функцию dir(), передав ей имя модуля:
>>> dir(math) ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
Имена, начинающиеся с двойных подчеркиваний, игнорируем. Остальные — это названия функций и констант (неизменяемых переменных), входящих в модуль math. Чтобы воспользоваться функцией из модуля, необходимо указать имя модуля, затем точку, имя функции и аргументы, если они нужны. К примеру, функция pow из модуля math вызывается так:
>>> math.pow(2, 2) 4.0
Обратите внимание, что это другая версия функции pow(), не такая как в языке. Версия в Python возвращает целое, если аргументы целые:
>>> pow(2, 2) 4
Вызов константы не требует скобок:
>>> math.pi
3.141592653589793
Для получения справки о функции можно использовать встроенную функцию help():
>>> help(math.gcd) Help on built-in function gcd in module math: gcd(...) gcd(x, y) -> int greatest common divisor of x and y
Для выхода из справки используется клавиша q. Как указано здесь, функция возвращает наибольший общий делитель для чисел x и y. Описание модулей также можно найти в официальной документации на python.org.
Существует еще один способ импорта, при котором из модуля импортируются только необходимые функции.
>>> from math import gcd, sqrt, hypot
Это можно прочесть как "из модуля math импортированы функции gcd, sqrt и hypot".
При вызове таких функций имя модуля указывать не нужно:
>>> gcd(100, 150) 50 >>> sqrt(16) 4.0 >>> hypot(3, 4) 5.0
Чтобы импортировать все функции из модуля разом:
>>> from math import *
Такой импорт имеет свои минусы. В программе может быть переменная с тем же именем, что и у импортируемых. Ошибки не будет, но одно из значений будет замещено другим:
>>> pi = 3.14 >>> from math import pi >>> pi 3.141592653589793
Как видно, значение 3.14 теряется, его заменяет число из модуля math. Если импортировать до присвоения, то ситуация будет противоположной:
>>> from math import pi >>> pi = 3.14 >>> pi 3.14
Наиболее подвержен риску подобной подмены импорт всех функций. Может быть трудно заметить замену переменных.
Однако можно изменить имя импортируемого идентификатора:
>>> from math import pi as P
>>> P
3.141592653589793
>>> pi
3.14
В этом случае константа pi импортируется под именем P. Это удобно для сокращения имен, поскольку некоторые модули и их компоненты могут иметь очень длинные названия. Если импортируются только несколько элементов и они часто используются, их удобно переименовать в более короткие. Сравните:
>>> import calendar >>> calendar.weekheader(2) 'Mo Tu We Th Fr Sa Su'
и
>>> from calendar import weekheader as week >>> week(3) 'Mon Tue Wed Thu Fri Sat Sun'
В других же случаях лучше использовать импорт с полным именем модуля, вызывая функции через имя_модуля.имя_функции()
.
Практическая работа. Создание собственного модуля
Каждый программист на Python может создать свой собственный модуль, который можно использовать в разных проектах или даже предоставить для общего доступа. В качестве упражнения создадим модуль с функциями для расчета площадей прямоугольника, треугольника и круга:
from math import pi, pow def rectangle(a, b): return round(a * b, 2) def triangle(a, h): return round(0.5 * a * h, 2) def circle(r): return round(pi * pow(r, 2), 2)
Это примеры того, что модули могут импортировать другие модули. В данном случае используются функции из math.
Поместите этот код в файл с именем square.py. Однако возникает вопрос, где его сохранить?
При встрече команды импорта Python просматривает определенные директории для поиска файла-модуля. Список таких директорий доступен через sys.path:
>>> import sys >>> sys.path ['', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/home/pl/.local/lib/python3.5/site-packages', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
Этот список из Linux, в Windows он будет немного иным. Пустая строка означает текущий каталог, то есть то место, где находится программа, импортирующая модуль. Если Вы сохраните файл-модуль и программу в одном каталоге, то Python найдет модуль автоматически.
Также можно разместить модуль в любом другом каталоге, указанном в списке. Тогда он будет доступен для всех Python-программ, и его можно импортировать в интерактивном режиме.
Либо можно добавить в sys.path свой каталог. В этом случае нужно изменить код программы или править конфигурации операционной системы. Это стоит делать только при крайней необходимости.
Сохраните файл square.py в той же папке, где и Ваши программы. Код программы должен содержать команду импорта модуля square (расширение файла при этом не указывается) и вызов соответствующей функции с параметрами от пользователя. Пользователь выбирает, площадь какой фигуры ему нужна, вводит параметры, которые затем передаются в функцию модуля square, а результат выводится на экран.
Примечание: Исполнение модуля как отдельного скрипта и создание документации, отобразимой через help(), будут подробно рассмотрены в курсе по объектно-ориентированному программированию.