Python---modules(模块)
文章目錄
- 模塊的調用
- 以腳本的方式執行模塊
- 模塊搜索路徑
- ”編譯過的“Python文件
- dir()函數
- 包
模塊的調用
模塊是一個包含Python定義和語句的文件。文件名就是模塊名后跟文件后綴 .py 。在一個模塊內部,模塊名(作為一個字符串)可以通過全局變量 __name__ 的值獲得。例如,使用你最喜愛的文本編輯器在當前目錄下創建一個名為 fibo.py 的文件, 文件中含有以下內容: # Fibonacci numbers moduledef fib(n): # write Fibonacci series up to na, b = 0, 1while a < n:print(a, end=' ')a, b = b, a+bprint()def fib2(n): # return Fibonacci series up to nresult = []a, b = 0, 1while a < n:result.append(a)a, b = b, a+breturn result只需要在新的文件寫入以下代碼就可以調用已經寫好的模塊
#導入模塊 import fibo #調用模塊 fibo.fib(56) fibo.fib2(100)還可以這樣導入
from fibo import fib,fib2 fib(500)甚至還可以導入模塊內定義的所有名稱,但是這會調入所有非以下劃線(_)開頭的名稱, 在多數情況下,Python程序員都不會使用這個功能,因為它在解釋器中引入了一組未知的名稱,而它們很可能會覆蓋一些你已經定義過的東西。
from fibo import *如果模塊名稱之后帶有as,則跟在阿薩之后的名稱將直接綁定到所導入的模塊
import fibo as fib fib.fib(500)以腳本的方式執行模塊
python fibo.py <arguments>模塊里的代碼會被執行,就好像你導入了模塊一樣,但是 name 被賦值為 “main”。 這意味著通過在你的模塊末尾添加這些代碼:
if __name__=="__main__"import sysfib(int (sys.argv[1]))你既可以把這個文件當作腳本又可當作一個可調入的模塊來使用,因為這段解析命令行的代碼只有當模塊是以“main"文件的方式執行的時候才會運行。
模塊搜索路徑
當一個名為 spam 的模塊被導入的時候,解釋器首先尋找具有該名稱的內置模塊。如果沒有找到,然后解釋器從 sys.path 變量給出的目錄列表里尋找名為 spam.py 的文件。sys.path 初始有這些目錄地址:
包含輸入腳本的目錄(或者未指定文件時的當前目錄)。
PYTHONPATH (一個包含目錄名稱的列表,它和shell變量 PATH 有一樣的語法)。
取決于安裝的默認設置
”編譯過的“Python文件
為了加速模塊載入,Python在 pycache 目錄里緩存了每個模塊的編譯后版本,名稱為 module.version.pyc ,其中名稱中的版本字段對編譯文件的格式進行編碼; 它一般使用Python版本號。例如,在CPython版本3.3中,spam.py的編譯版本將被緩存為 pycache/spam.cpython-33.pyc。此命名約定允許來自不同發行版和不同版本的Python的已編譯模塊共存。
Python根據編譯版本檢查源的修改日期,以查看它是否已過期并需要重新編譯。這是一個完全自動化的過程。此外,編譯的模塊與平臺無關,因此可以在具有不同體系結構的系統之間共享相同的庫。
Python在兩種情況下不會檢查緩存。首先,對于從命令行直接載入的模塊,它從來都是重新編譯并且不存儲編譯結果;其次,如果沒有源模塊,它不會檢查緩存。為了支持無源文件(僅編譯)發行版本, 編譯模塊必須是在源目錄下,并且絕對不能有源模塊。
dir()函數
內置函數 dir() 用于查找模塊定義的名稱。 它返回一個排序過的字符串列表:
>>> import fibo, sys >>> dir(fibo) ['__name__', 'fib', 'fib2'] >>> dir(sys) ['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__','__interactivehook__', '__loader__', '__name__', '__package__', '__spec__','__stderr__', '__stdin__', '__stdout__', '__unraisablehook__','_clear_type_cache', '_current_frames', '_debugmallocstats', '_framework','_getframe', '_git', '_home', '_xoptions', 'abiflags', 'addaudithook','api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix','breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing','callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info','excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info','float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth','getallocatedblocks', 'getdefaultencoding', 'getdlopenflags','getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile','getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval','gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info','intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value','maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks','path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'pycache_prefix','set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setdlopenflags','setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr','stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info','warnoptions']它列出所有類型的名稱:變量,模塊,函數等,但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']包
包是一種通過用“帶點號的模塊名”來構造 Python 模塊命名空間的方法。 例如,模塊名 A.B 表示 A 包中名為 B 的子模塊。
假設你想為聲音文件和聲音數據的統一處理,設計一個模塊集合(一個“包”)。由于存在很多不同的聲音文件格式(通常由它們的擴展名來識別,例如:.wav, .aiff, .au),因此為了不同文件格式間的轉換,你可能需要創建和維護一個不斷增長的模塊集合。 你可能還想對聲音數據還做很多不同的處理(例如,混聲,添加回聲,使用均衡器功能,創造人工立體聲效果), 因此為了實現這些處理,你將另外寫一個無窮盡的模塊流。這是你的包的可能結構(以分層文件系統的形式表示):
當導入這個包時,Python搜索 sys.path 里的目錄,查找包的子目錄。
必須要有 __init__.py 文件才能讓 Python 將包含該文件的目錄當作包。 這樣可以防止具有通常名稱例如 string 的目錄在無意中隱藏稍后在模塊搜索路徑上出現的有效模塊。 在最簡單的情況下,__init__.py 可以只是一個空文件,但它也可以執行包的初始化代碼或設置 __all__ 變量,具體將在后文介紹。
包的用戶可以從包中導入單個模塊,例如:
import sound.effects.echo這會加載子模塊sound.effects.echo。但引用它時必須使用他的全名。
sound.effects.echo.echofilter(input,output,delay=0.7,atten=4)導入子模塊的另一種方法是
from sound.effects.echo import echofilter同樣,這也會加載子模塊 echo,但這會使其函數 echofilter() 直接可用:
echofilter(input, output, delay=0.7, atten=4)總結
以上是生活随笔為你收集整理的Python---modules(模块)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python函数参数列表中的*与**
- 下一篇: 使用python自己搭建一个简单的BP神