Статьи

Плавное обновление на модулях Python

Это будет последний урок в серии обновлений Python . Конечно, я не могу завершить эту серию, пока не перейду к следующему уровню в программировании, то есть к работе с модулями , которые считаются фундаментальными при обработке нетривиальных задач программирования.

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

Давайте перейдем к сути учебника и посмотрим, как мы можем работать с модулями в Python.

Когда вы создавали программы на Python, вы помещали их в исходный файл, заканчивающийся на .py . Модули в Python просто создаются таким образом. То есть это исходные файлы, заканчивающиеся на .py и расположенные в каталоге, где Python может их найти (т. Е. Текущем рабочем каталоге или указанном в sys.path ).

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

Создать модуль на Python очень просто. Допустим, мы хотели создать модуль, который бы печатал чье-то имя. Введите следующий код, используя ваш любимый редактор, и сохраните его как myname.py . Это будет имя вашего модуля, исключая часть .py , которая будет назначена глобальной переменной __name__ .

1
2
def print_name(n):
   print ‘Hi’, n

Если у вас есть другой файл Python, в котором вы заинтересованы использовать код из модуля, определенного выше, мы импортируем модуль с помощью ключевого слова import следующим образом:

1
2
import myname
name.print_name(‘Abder’)

Выход этого сценария будет: Hi Abder .

Убедитесь, что Python может найти импортированный файл. Например, поместите его в тот же каталог, что и файл Python, где вы использовали import .

Как видите, импорт модуля позволяет нам улучшить нашу программу, добавив в нее новые функциональные возможности из внешних файлов (то есть модулей).

Но что здесь происходит за кулисами? Когда вы import модуль, Python компилирует этот модуль и генерирует файл .pyc , и программа перекомпилируется, только если файл .py новее, чем файл .pyc .

Давайте рассмотрим другой пример, но на этот раз со встроенным модулем Python. Давайте выберем математический модуль. В этом примере для числа, которое мы передаем, мы хотим найти потолок (наименьшее целочисленное значение, большее или равное числу), пол (наибольшее целочисленное значение, меньшее или равное числу) и абсолютное значение этого числа , Сценарий Python для этой программы выглядит следующим образом:

1
2
3
4
5
import math
x = 4.7
print ‘The ceiling of ‘ + str(x) + ‘ is: ‘ + str(math.ceil(x))
print ‘The floor of ‘ + str(x) + ‘ is: ‘ + str(math.floor(x))
print ‘The absolute value of ‘ + str(x) + ‘ is: ‘ + str(math.fabs(x))

Если вы запустите этот скрипт, вывод должен выглядеть следующим образом:

1
2
3
The ceiling of 4.7 is: 5.0
The floor of 4.7 is: 4.0
The absolute value of 4.7 is: 4.7

Таким образом, мы смогли применить различные операции к нашему номеру без написания кода для каждой операции, а путем повторного использования уже доступных функций в math модуле. Это очень помогает, не так ли?

Вам может быть интересно, должны ли мы всегда использовать math.function() ? Разве мы не можем использовать функцию сразу, не предшествуя ей с именем модуля (то есть math )? Да, вы можете сделать это, используя следующий синтаксис для import :

from math import *

Таким образом, вы можете вызывать предыдущие функции ( ceil(x) , floor(x) и fabs(x) ) без необходимости ставить перед ними имя модуля math .

Давайте вернемся к нашему простому модулю myname.py :

1
2
def print_name(n):
   print ‘Hi’, n

Можем ли мы рассматривать этот модуль как отдельный (основной) скрипт, который мы можем напрямую запускать и передавать аргументы из командной строки? Например, что произойдет, если вы введете следующее в командной строке?

python myname.py 'Abder'

Ничего! Попробуйте — вы не получите никакого вывода.

Чтобы иметь возможность запускать модуль как скрипт, мы должны установить __name__ = '__main__ ‘. Итак, модуль myname теперь будет выглядеть следующим образом:

1
2
3
4
5
6
def print_name(n):
    print ‘Hi’, n
 
if __name__ == ‘__main__’:
    import sys
    print_name(sys.argv[1])

Если вы запустите эту команду в своем терминале: python myname.py 'Abder' , вы должны получить следующий вывод:

Hi Abder

Важной концепцией, которая идет рука об руку с модулями, является концепция пакетов . Пакет представляет собой набор модулей. Другими словами, в то время как модуль является файлом, пакет является каталогом / папкой. Это способ, которым мы структурируем модули, используя точечные имена модулей. Так что если вы видите оператор import который выглядит так:

import university.department

Это означает, что у нас есть модуль, названный department в university пакете.

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

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