Учебники

Python 3 — Модули

Модуль позволяет вам логически организовать ваш код Python. Группировка связанного кода в модуль облегчает понимание и использование кода. Модуль — это объект Python с произвольно названными атрибутами, которые вы можете связать и сослаться на них.

Просто модуль — это файл, состоящий из кода Python. Модуль может определять функции, классы и переменные. Модуль также может включать исполняемый код.

пример

Код Python для модуля с именем aname обычно находится в файле с именем aname.py. Вот пример простого модуля support.py —

def print_func( par ):
   print "Hello : ", par
   return

Заявление об импорте

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

import module1[, module2[,... moduleN]

Когда интерпретатор встречает оператор импорта, он импортирует модуль, если модуль присутствует в пути поиска. Путь поиска — это список каталогов, которые интерпретатор ищет перед импортом модуля. Например, чтобы импортировать модуль hello.py, вам нужно поместить следующую команду вверху скрипта:

#!/usr/bin/python3

# Import module support
import support

# Now you can call defined function that module as follows
support.print_func("Zara")

Когда приведенный выше код выполняется, он дает следующий результат —

Hello : Zara

Модуль загружается только один раз, независимо от того, сколько раз он был импортирован. Это предотвращает повторное выполнение модуля, если происходит многократный импорт.

Заявление от … импорта

Оператор Python from позволяет импортировать определенные атрибуты из модуля в текущее пространство имен. Импорт from … имеет следующий синтаксис —

from modname import name1[, name2[, ... nameN]]

Например, чтобы импортировать функцию fibonacci из модуля fib, используйте следующий оператор —

#!/usr/bin/python3

# Fibonacci numbers module

def fib(n): # return Fibonacci series up to n
   result = []
   a, b = 0, 1
   while b < n:
      result.append(b)
      a, b = b, a + b
   return result
>>> from fib import fib
>>> fib(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Этот оператор не импортирует весь модуль fib в текущее пространство имен; он просто вводит элемент fibonacci из модуля fib в глобальную таблицу символов импортирующего модуля.

Заявление от … import *

Также возможно импортировать все имена из модуля в текущее пространство имен, используя следующую инструкцию импорта —

from modname import *

Это обеспечивает простой способ импортировать все элементы из модуля в текущее пространство имен; Однако это утверждение следует использовать с осторожностью.

Выполнение модулей как скриптов

Внутри модуля имя модуля (в виде строки) доступно в качестве значения глобальной переменной __name__. Код в модуле будет выполнен, как если бы вы его импортировали, но с __name__, установленным в «__main__».

Добавьте этот код в конце вашего модуля —

Live Demo

#!/usr/bin/python3

# Fibonacci numbers module

def fib(n): # return Fibonacci series up to n
   result = []
   a, b = 0, 1
   while b < n:
      result.append(b)
      a, b = b, a + b
   return result
if __name__ == "__main__":
   f = fib(100)
   print(f)

Когда вы запустите вышеуказанный код, будет отображен следующий вывод.

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Расположение модулей

Когда вы импортируете модуль, интерпретатор Python ищет модуль в следующих последовательностях:

  • Текущий каталог.

  • Если модуль не найден, Python ищет каждый каталог в переменной оболочки PYTHONPATH.

  • Если ничего не помогает, Python проверяет путь по умолчанию. В UNIX этот путь по умолчанию обычно / usr / local / lib / python3 /.

Текущий каталог.

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

Если ничего не помогает, Python проверяет путь по умолчанию. В UNIX этот путь по умолчанию обычно / usr / local / lib / python3 /.

Путь поиска модуля хранится в системном модуле sys как переменная sys.path . Переменная sys.path содержит текущий каталог, PYTHONPATH и зависящее от установки значение по умолчанию.

Переменная PYTHONPATH

PYTHONPATH — это переменная окружения, состоящая из списка каталогов. Синтаксис PYTHONPATH такой же, как и у переменной оболочки PATH.

Вот типичный PYTHONPATH из системы Windows —

set PYTHONPATH = c:\python34\lib;

А вот типичный PYTHONPATH из системы UNIX —

set PYTHONPATH = /usr/local/lib/python

Пространства имен и область видимости

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

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

  • Каждая функция имеет свое локальное пространство имен. Методы класса следуют тому же правилу видимости, что и обычные функции.

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

  • Следовательно, чтобы присвоить значение глобальной переменной внутри функции, сначала необходимо использовать глобальный оператор.

  • Оператор global VarName сообщает Python, что VarName является глобальной переменной. Python прекращает поиск переменной в локальном пространстве имен.

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

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

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

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

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

Однако перед установкой мы получили доступ к значению локальной переменной Money , поэтому результатом является UnboundLocalError. Раскомментирование глобального утверждения устраняет проблему.

Live Demo

#!/usr/bin/python3

Money = 2000
def AddMoney():
   # Uncomment the following line to fix the code:
   # global Money
   Money = Money + 1

print (Money)
AddMoney()
print (Money)

Функция dir ()

Встроенная функция dir () возвращает отсортированный список строк, содержащих имена, определенные модулем.

Список содержит имена всех модулей, переменных и функций, которые определены в модуле. Ниже приведен простой пример —

Live Demo

#!/usr/bin/python3

# Import built-in module math
import math

content = dir(math)
print (content)

Когда приведенный выше код выполняется, он дает следующий результат —

['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 
'sqrt', 'tan', 'tanh']

Здесь специальная строковая переменная __name__ — это имя модуля, а __file__ — имя файла, из которого был загружен модуль.

Функции глобальных () и локальных () функций

Функции globals () и locals () можно использовать для возврата имен в глобальном и локальном пространствах имен в зависимости от места, откуда они вызываются.

  • Если locals () вызывается из функции, он возвращает все имена, к которым можно получить локальный доступ из этой функции.

  • Если globals () вызывается из функции, он возвращает все имена, к которым можно получить глобальный доступ из этой функции.

Если locals () вызывается из функции, он возвращает все имена, к которым можно получить локальный доступ из этой функции.

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

Тип возврата обеих этих функций — словарь. Поэтому имена могут быть извлечены с помощью функции keys () .

Функция reload ()

Когда модуль импортируется в скрипт, код в части модуля верхнего уровня выполняется только один раз.

Поэтому, если вы хотите повторно выполнить код верхнего уровня в модуле, вы можете использовать функцию reload () . Функция reload () снова импортирует ранее импортированный модуль. Синтаксис функции reload () такой:

reload(module_name)

Здесь имя_модуля — это имя модуля, который вы хотите перезагрузить, а не строка, содержащая имя модуля. Например, чтобы перезагрузить модуль hello, сделайте следующее:

reload(hello)

Пакеты в Python

Пакет представляет собой иерархическую структуру файловых каталогов, которая определяет единую прикладную среду Python, которая состоит из модулей, подпакетов, подпакетов и т. Д.

Рассмотрим файл Pots.py, доступный в телефонном справочнике. Этот файл имеет следующую строку исходного кода —

#!/usr/bin/python3

def Pots():
print ("I'm Pots Phone")  

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

  • Файл Phone / Isdn.py с функцией Isdn ()

  • Файл Phone / G3.py, имеющий функцию G3 ()

Файл Phone / Isdn.py с функцией Isdn ()

Файл Phone / G3.py, имеющий функцию G3 ()

Теперь создайте еще один файл __init__.py в телефонном справочнике —

  • Телефон / __ init__.py

Чтобы сделать все ваши функции доступными после импорта Phone, вам нужно поместить явные операторы импорта в __init__.py следующим образом:

from Pots import Pots
from Isdn import Isdn
from G3 import G3

После добавления этих строк в __init__.py у вас есть все эти классы, доступные при импорте пакета Phone.

#!/usr/bin/python3

# Now import your Phone Package.
import Phone

Phone.Pots()
Phone.Isdn()
Phone.G3()

Когда приведенный выше код выполняется, он дает следующий результат —

I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone

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