Python---modules(模块)
文章目錄
- 模塊的調(diào)用
- 以腳本的方式執(zhí)行模塊
- 模塊搜索路徑
- ”編譯過的“Python文件
- dir()函數(shù)
- 包
模塊的調(diào)用
模塊是一個包含Python定義和語句的文件。文件名就是模塊名后跟文件后綴 .py 。在一個模塊內(nèi)部,模塊名(作為一個字符串)可以通過全局變量 __name__ 的值獲得。例如,使用你最喜愛的文本編輯器在當(dāng)前目錄下創(chuàng)建一個名為 fibo.py 的文件, 文件中含有以下內(nèi)容: # 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只需要在新的文件寫入以下代碼就可以調(diào)用已經(jīng)寫好的模塊
#導(dǎo)入模塊 import fibo #調(diào)用模塊 fibo.fib(56) fibo.fib2(100)還可以這樣導(dǎo)入
from fibo import fib,fib2 fib(500)甚至還可以導(dǎo)入模塊內(nèi)定義的所有名稱,但是這會調(diào)入所有非以下劃線(_)開頭的名稱, 在多數(shù)情況下,Python程序員都不會使用這個功能,因為它在解釋器中引入了一組未知的名稱,而它們很可能會覆蓋一些你已經(jīng)定義過的東西。
from fibo import *如果模塊名稱之后帶有as,則跟在阿薩之后的名稱將直接綁定到所導(dǎo)入的模塊
import fibo as fib fib.fib(500)以腳本的方式執(zhí)行模塊
python fibo.py <arguments>模塊里的代碼會被執(zhí)行,就好像你導(dǎo)入了模塊一樣,但是 name 被賦值為 “main”。 這意味著通過在你的模塊末尾添加這些代碼:
if __name__=="__main__"import sysfib(int (sys.argv[1]))你既可以把這個文件當(dāng)作腳本又可當(dāng)作一個可調(diào)入的模塊來使用,因為這段解析命令行的代碼只有當(dāng)模塊是以“main"文件的方式執(zhí)行的時候才會運(yùn)行。
模塊搜索路徑
當(dāng)一個名為 spam 的模塊被導(dǎo)入的時候,解釋器首先尋找具有該名稱的內(nèi)置模塊。如果沒有找到,然后解釋器從 sys.path 變量給出的目錄列表里尋找名為 spam.py 的文件。sys.path 初始有這些目錄地址:
包含輸入腳本的目錄(或者未指定文件時的當(dāng)前目錄)。
PYTHONPATH (一個包含目錄名稱的列表,它和shell變量 PATH 有一樣的語法)。
取決于安裝的默認(rèn)設(shè)置
”編譯過的“Python文件
為了加速模塊載入,Python在 pycache 目錄里緩存了每個模塊的編譯后版本,名稱為 module.version.pyc ,其中名稱中的版本字段對編譯文件的格式進(jìn)行編碼; 它一般使用Python版本號。例如,在CPython版本3.3中,spam.py的編譯版本將被緩存為 pycache/spam.cpython-33.pyc。此命名約定允許來自不同發(fā)行版和不同版本的Python的已編譯模塊共存。
Python根據(jù)編譯版本檢查源的修改日期,以查看它是否已過期并需要重新編譯。這是一個完全自動化的過程。此外,編譯的模塊與平臺無關(guān),因此可以在具有不同體系結(jié)構(gòu)的系統(tǒng)之間共享相同的庫。
Python在兩種情況下不會檢查緩存。首先,對于從命令行直接載入的模塊,它從來都是重新編譯并且不存儲編譯結(jié)果;其次,如果沒有源模塊,它不會檢查緩存。為了支持無源文件(僅編譯)發(fā)行版本, 編譯模塊必須是在源目錄下,并且絕對不能有源模塊。
dir()函數(shù)
內(nèi)置函數(shù) 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']它列出所有類型的名稱:變量,模塊,函數(shù)等,但dir()不會列出內(nèi)置函數(shù)和變量的名稱。如果想要這些,他們的定義是在標(biāo)準(zhǔn)模塊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']包
包是一種通過用“帶點(diǎn)號的模塊名”來構(gòu)造 Python 模塊命名空間的方法。 例如,模塊名 A.B 表示 A 包中名為 B 的子模塊。
假設(shè)你想為聲音文件和聲音數(shù)據(jù)的統(tǒng)一處理,設(shè)計一個模塊集合(一個“包”)。由于存在很多不同的聲音文件格式(通常由它們的擴(kuò)展名來識別,例如:.wav, .aiff, .au),因此為了不同文件格式間的轉(zhuǎn)換,你可能需要創(chuàng)建和維護(hù)一個不斷增長的模塊集合。 你可能還想對聲音數(shù)據(jù)還做很多不同的處理(例如,混聲,添加回聲,使用均衡器功能,創(chuàng)造人工立體聲效果), 因此為了實(shí)現(xiàn)這些處理,你將另外寫一個無窮盡的模塊流。這是你的包的可能結(jié)構(gòu)(以分層文件系統(tǒng)的形式表示):
當(dāng)導(dǎo)入這個包時,Python搜索 sys.path 里的目錄,查找包的子目錄。
必須要有 __init__.py 文件才能讓 Python 將包含該文件的目錄當(dāng)作包。 這樣可以防止具有通常名稱例如 string 的目錄在無意中隱藏稍后在模塊搜索路徑上出現(xiàn)的有效模塊。 在最簡單的情況下,__init__.py 可以只是一個空文件,但它也可以執(zhí)行包的初始化代碼或設(shè)置 __all__ 變量,具體將在后文介紹。
包的用戶可以從包中導(dǎo)入單個模塊,例如:
import sound.effects.echo這會加載子模塊sound.effects.echo。但引用它時必須使用他的全名。
sound.effects.echo.echofilter(input,output,delay=0.7,atten=4)導(dǎo)入子模塊的另一種方法是
from sound.effects.echo import echofilter同樣,這也會加載子模塊 echo,但這會使其函數(shù) echofilter() 直接可用:
echofilter(input, output, delay=0.7, atten=4)總結(jié)
以上是生活随笔為你收集整理的Python---modules(模块)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python函数参数列表中的*与**
- 下一篇: 使用python自己搭建一个简单的BP神