Введение
Интерпретируемая среда Python очень полезна, но если нам нужно написать большую программу, интерпретируемой среды совершенно недостаточно. На данный момент нам нужно сохранить программу Python в файл. Обычно этот файл заканчивается на .py.
Для больших приложений одного файла может быть недостаточно, в это время нам нужно ссылаться на другие файлы в файле, поэтому файл называется модулем.
Модуль — это файл, содержащий определения и операторы Python. Имя файла — это имя модуля, за которым следует суффикс файла..py
. Внутри модуля имя модуля можно передать через глобальную переменную__name__
получить.
Основы модуля
Или предыдущий пример последовательности Фибоначчи, реализацию функции мы храним в файле fibo.py:
def fib(n): # write Fibonacci series up to n
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print()
После написания мы можем импортировать его в интерпретируемую среду Python:
>>> import fibo
Затем используйте его напрямую:
>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Часто используемые функции, мы можем присвоить их переменной:
>>> fib = fibo.fib
>>> fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Или, когда мы импортируем, даем модулю имя напрямую:
>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
Или импортируйте функцию в модуль:
>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
Каждый модуль имеет свою собственную таблицу символов, которая используется как глобальная таблица символов для всех функций, определенных в модуле. В результате автор модуля может использовать глобальные переменные внутри модуля, не беспокоясь о случайных конфликтах с глобальными переменными пользователя.
исполнительный модуль
Ранее мы упоминали, что вы можете использовать import для импорта модуля, и__name__
Хранится в имени модуля.
Как и основной метод в java, если мы хотим провести некоторое тестирование в модуле, есть ли способ написать основной метод в java?
Давайте посмотрим на пример:
if __name__ == "__main__":
import sys
fib(int(sys.argv[1]))
В модуле нам нужно вынести суждение__name__
назначается как"__main__"
.
Мы выполняем этот модуль следующим образом:
python fibo.py <arguments>
В случае выполнения скрипта модуль__name__
свойство будет присвоено как__main__
, поэтому пример написан так.
Взгляните на эффект исполнения:
$ python fibo.py 50
0 1 1 2 3 5 8 13 21 34
Если импортировать как модуль, он не будет выполнен:
>>> import fibo
>>>
путь поиска модуля
При импорте модуля с помощью import интерпретатор сначала будет искать встроенный модуль с таким именем, и если не будет найден, интерпретаторsys.path
Посмотрите в списке каталогов, заданных переменной.
sys.path
Начальный каталог включает:
- Текущий каталог
- Каталог, указанный PYTHONPATH
- Установленные значения по умолчанию
dir
Чтобы увидеть, что определено в модуле, используйте функцию dir.
>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
В приведенном выше примере перечислено то, что определено в текущем модуле, включая переменные, модули, функции и т. д.
Уведомление,
dir()
Имена встроенных функций и переменных не указаны. Если вам это нужно, их определения находятся в стандартном модуле.builtins
середина.
Мы можем добавить параметры в каталог, чтобы получить содержимое определенного модуля:
>>> import builtins
>>> dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
'NotImplementedError', 'OSError', 'OverflowError',
'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
'__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
'zip']
Сумка
В java есть понятие пакета, которое используется для изоляции программного кода. Точно так же есть пакеты в Python.
Давайте посмотрим на пример пакета в Python:
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
Выше мы определили 4 пакета, а именно звук, звук.форматы, звук.эффекты, звук.фильтры.
Обратите внимание, что если это пакет, он должен содержать
__init__.py
документ.
__init__.py
Может быть пустым файлом или выполнять код инициализации пакета или установку.__all__
Переменная.
При импорте python будетsys.path
путь для поиска пакета.
Есть много способов импортировать пакеты, мы можем импортировать один модуль:
import sound.effects.echo
Но после такого импорта вы должны загрузить полное имя при его использовании:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
Если вы не хотите загружать полное имя, вы можете импортировать его следующим образом:
from sound.effects import echo
Затем его можно использовать следующим образом:
echo.echofilter(input, output, delay=0.7, atten=4)
Вы также можете напрямую импортировать методы в модули:
from sound.effects.echo import echofilter
Затем используйте так:
echofilter(input, output, delay=0.7, atten=4)
Если в пакете много подпакетов, мы можем использовать * для одновременного импорта:
from sound.effects import *
Так как же контролировать, какой подпакет эффектов будет импортирован?
мы можем__init__.py
определить именованный__all__
Список имен подпакетов, которые будут экспортированы, указан в этом списке следующим образом:
__all__ = ["echo", "surround", "reverse"]
такfrom sound.effects import *
будет импортироватьsound
Три именованных подмодуля пакета.
если не определено__all__
,from sound.effects import *
утверждениеНе будуиз пакетаsound.effects
импортировать все подмодули в текущее пространство имен; будут импортированы только пакетыsound.effects
.
относительный путь к пакету
Импорт может указывать относительные пути, мы используем . для представления текущего пакета и .. для представления родительского пакета.
Следующее:
from . import echo
from .. import formats
from ..filters import equalizer
Эта статья была включена вwoohoo.floydpress.com/07-python-no…
Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!
Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!