Любой программный язык включает в себя базовые функции, которые доступны сразу и не требуют дополнительных действий для их активации. Однако с течением времени на популярных языках создается огромное количество функций и классов, применяемых множеством разработчиков в самых разных сферах. Включение всего этого кода в сам язык, даже если это и возможно технически, оказывается нецелесообразным.

Для решения задачи доступа к дополнительным функциям языка программирования принято использовать модули, пакеты и библиотеки. Каждый модуль содержит набор функций и классов, предназначенных для решения специфических задач. Например, модуль 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(), будут подробно рассмотрены в курсе по объектно-ориентированному программированию.

Вопросы для самопроверки:

  1. Какие средства используются в языках программирования для доступа к дополнительным функциям и классам помимо базовой функциональности?
  2. Какую команду необходимо использовать в Python для импорта модуля?
  3. Как можно узнать, какие функции содержит импортированный модуль?
  4. Почему может быть нежелательно использовать импорт всех функций из модуля с помощью "*", и как этого избежать?
  5. Как создать собственный модуль в Python, и как его правильно сохранить, чтобы он был доступен для других программ?
  6. Каким образом можно переименовать импортируемый идентификатор при импорте?

Программа курса:

  1. Описание курса
  2. Эволюция и основы языков программирования

    История программирования в кратком и понятном изложении. Что такое машинный язык, почему появились ассемблеры, языки высокого уровня и объектно-ориентированные. Зачем нужен транслятор, и почему он может быть либо компилятором, либо интерпретатором.

  3. Знакомство с основами Python

    Особенности языка Python, работа в интерактивном режиме и подготовка файлов с исходным кодом.

  4. Типы данных и переменные в Python

    Базовые типы данных в Python: целое, вещественное числа, строки. Изменение типа данных с помощью встроенных функций. Понятие об операциях и переменных. Присваивание значения переменной.

  5. Ввод и вывод данных с Python функциями

    Для вывода на экран в Python 3.x используется функция print(). Вывод может быть предварительно отформатирован. Для ввода данных с клавиатуры используется функция input(), которая возвращает в программу строку.

  6. Логические выражения и операторы в Python

    Логические выражения. Логические операторы языка Python: == (равно), != (не равно), (больше), = (больше или равно), and (логическое И), or (логическое ИЛИ), not (отрицание).

  7. Ветвление и условные операторы в Python

    Управление потоком программы с помощью операторов if-else. Создание логических ветвлений, обработка условий и выполнение разных блоков кода в Python.

  8. Изучите обработку ошибок и исключений в Python

    Общее представление об ошибках и исключениях в языке программирования Python. SyntaxError, NameError, TypeError, ValueError, ZeroDivisionError. Обработка исключений с помощью инструкции try-except.

  9. Множественное ветвление с if-elif-else в Python

    Оператор множественного ветвления языка Python позволяет организовать более двух веток выполнения программы без необходимости вложения условных операторов друг в друга. Конструкция включает одну ветку if, произвольное количество elif и необязательную ветку else.

  10. Цикл while и его применение в Python

    С помощью циклов в программировании организуется многократное следующее друг за другом выполнение одних и тех же участков кода. Бывают циклы с условием и со счетчиком. К первым относится цикл while, или цикл "пока".

  11. Изучите функции и их применение в Python

    Функции - важный элемент структурного программирования. Они позволяют обособить участок кода, выполняющий определенную задачу. В дальнейшем к нему можно обращаться из разных мест программы по имени, которым он назван. В языке Python функции определяются с помощью оператора def.

  12. Локальные и глобальные переменные в Python

    В программировании важное значение имеет представление о локальных и глобальных переменных. Локальные переменные существуют внутри функций и не доступны за ее пределами. Глобальные переменные видны во всей программе.

  13. Оператор return и возврат значений в Python

    С помощью оператора return можно вернуть значение из тела функции в основную программу. В языке программирования Python можно вернуть несколько значений, перечислив их через запятую после оператора return. Также в функции может быть несколько return, но всегда выполняется только один из них.

  14. Параметры и аргументы функций в Python

    Если функция имеет параметры, то при вызове в нее можно передавать данные в виде аргументов-значений или аргументов-ссылок. Параметры перечисляются в заголовке функции в скобках после имени, представляют собой локальные переменные. В Python тип параметров не указывается, хотя в других языках это может быть обязательным требованием.

  15. Встроенные функции Python для работы

    Язык программирования Python включает множество встроенных функций. В предыдущих уроках мы использовали такие функции как print() и input(), а также функции преобразования типов данных. В этом уроке рассматриваются встроенные функции для работы с символами и числами.

  16. Использование модулей в Python

    Использование модулей в программировании позволяет изолировать код, выполняющий частные задачи, в отдельные файлы. После чего обращаться к нему из разных программ. Создание модулей - следующий шаг после функций, когда участок кода обособляется внутри одного файла-программы. Для языка Python есть множество встроенных и сторонних модулей.

  17. Генерация псевдослучайных чисел в Python

    Для генерации псевдослучайных чисел в языке программирования Python используются функции модуля random. Функция random() генерирует вещественное число от 0 до 1. Функции randint() и randrange() производят целые псевдослучайные числа в указанных диапазонах.

  18. Изучение списков в Python - основы и операции

    Списки в Python - это аналог массивов в других языках программирования. Однако список может содержать элементы разных типов. В терминологии Python список - это изменяемая упорядоченная структура данных. Можно заменять его элементы, добавлять и удалять их, брать срезы. В язык встроены методы для работы со списками.

  19. Изучение цикла for в Python

    Цикл for в языке программирования Python предназначен для перебора элементов структур данных (списков, словарей, кортежей, множеств) и многих других объектов. Это не цикл со счетчиком, каковым является for во многих других языках. Нередко цикл for используется совместно с функцией range(), генерирующей объекты-диапазоны.

  20. Строки в Python - методы и срезы

    В Python строки - это неизменяемые последовательности символов или подстрок. Из них, так же как из списков, можно извлекать отдельные символы с помощью индексов или подстроки с помощью взятия срезов. В языке Python есть множество встроенных строковых методов, позволяющих упростить обработку строк.

  21. Кортежи - неизменяемые структуры данных

    Кортежи в Python - это неизменяемые структуры данных, состоящие из элементов одного или разных типов. Кортежи подобны спискам и обычно используются для защиты последних от изменений. Преобразование одного в другой выполняется с помощью встроенных функций tuple() и list().

  22. Словари в Python - работа с ключами и значениями

    Словарь в Python - это изменяемая неупорядоченная структура данных, элементами которой являются пары "ключ:значение". В словари можно добавлять и удалять элементы, изменять значения ключей. В Python словари имеют ряд методов, упрощающих работу с ними.

  23. Работа с файлами в Python

    В языке программирования Python открытие файлов выполняется с помощью функции open(), которой передается два аргумента - имя файла и режим. Файл может быть открыт в режиме чтения, записи, добавления. Также может быть указан тип файла - текстовый или бинарный. Для файлов есть ряд встроенных методов чтения, записи и др.