「学习笔记——Python」Python 的模块(Modules)
6 Python的模塊 (Modules)
Table of Contents
- 1 關(guān)于模塊
- 1.1 更多關(guān)于模塊的故事
- 1.2 將模塊作為腳體執(zhí)行
- 1.3 模塊搜索路徑
- 1.4 “編譯過的” Python 文件
- 2 標(biāo)準(zhǔn)模塊
- 3 dir 函數(shù)
- 4 包(Package)
- 4.1 Import * from package
1?關(guān)于模塊
如果你退出了交互模式,那么你定義的東西都都沒啦!如果你要寫一個(gè)長一點(diǎn)的程序,那么最好寫在一個(gè)文件里,每次需要 運(yùn)行時(shí)就運(yùn)行一下這個(gè)文件,這文件叫做腳本(Scripts)。隨著程序變大,寫在一個(gè)文件里也不行了,你需要把它分割成多個(gè)部分,以 方便維護(hù)和組織,這些不同的部分叫做模塊(Modules)。 模塊可以通過 import 來導(dǎo)入,這樣我們就可以使用這個(gè)模塊中定義的函數(shù)啦!一個(gè)文件對(duì)應(yīng)一個(gè)模塊,模塊名是文件名去掉 擴(kuò)展名。下面來看一個(gè)例子~
# Fibonacci sequence moduledef fib(n):a, b = 0, 1while b < n:print b,a, b = b, a+bdef fib2(n):result = []a, b = 0, 1while b < n:result.append(b)a, b = b, a+breturn result我們可以在交互模式下導(dǎo)入這個(gè)模塊,然后使用其中的函數(shù),同時(shí)模塊內(nèi)還有一個(gè)全局變量,以 __ name __ 表示。
>>> import fibo >>> fibo.fib(10) 1 1 2 3 5 8 >>> fibo.fib(10) 1 1 2 3 5 8 >>> fibo.__name__ 'fibo'另外,如果經(jīng)常使用這個(gè)函數(shù),還可以將其賦給一個(gè)局部變量
>>> fib1= fibo.fib >>> fib1(10) 1 1 2 3 5 81.1?更多關(guān)于模塊的故事
模塊不僅可以包含函數(shù),還可以包含可執(zhí)行語句,它們負(fù)責(zé)初始化模塊,且僅在第一次導(dǎo)入模塊時(shí)被執(zhí)行。 每個(gè)模塊都有其私有符號(hào)表,模塊內(nèi)的所有函數(shù)將它們當(dāng)作全局符號(hào)表來使用。 一個(gè)模塊可以導(dǎo)入(import)另一個(gè)模塊,import語句習(xí)慣于在開始調(diào)用,但這并非必要。 下面這種方式將從另一個(gè)模塊符號(hào)表里的內(nèi)容導(dǎo)入本模塊符號(hào)表的方式,導(dǎo)入之后,就可以像模塊內(nèi)函數(shù)那樣使用它們
>>> from fibo import fib, fib2 >>> fib(300) 1 1 2 3 5 8 13 21 34 55 89 144 233 >>> fib2(200) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144] >>> fibo.fib(10) Traceback (most recent call last):File "<stdin>", line 1, in <module> NameError: name 'fibo' is not defined注意,并未導(dǎo)入fibo,所以不能使用fibo.fib來調(diào)用函數(shù)。
可以通過下面這種方式,導(dǎo)入另一個(gè)模塊內(nèi)所有的符號(hào)
>>> from fibo import * >>> fib(10) 1 1 2 3 5 8 >>> fib2(10) [1, 1, 2, 3, 5, 8]1.2?將模塊作為腳體執(zhí)行
在命令行輸入下面的內(nèi)容會(huì)執(zhí)行腳本的內(nèi)容,
python fibo.py <arguments>如果只想讓腳本中的可執(zhí)行語句在通過上述方式執(zhí)行時(shí)起作用,而在交互模式 import 時(shí)不執(zhí)行,可以在 腳本的最后加入:
if __name__ == "__main__":import sysfib(int(sys.argv[1]))原因就在于 命令行執(zhí)行和交互模式 import 時(shí),__ name __ 的值是不一樣的,做一個(gè)小實(shí)驗(yàn)就會(huì)明白: 在 fibo.py 中加入
print __name__def fib(n):a, b = 0, 1while b < n:print b,a, b = b, a+bdef fib2(n):result = []a, b = 0, 1while b < n:result.append(b)a, b = b, a+breturn resultif __name__ == "__main__":import sysfib(int(sys.argv[1]))在命令行執(zhí)行時(shí),
python fibo.py 10 __main__ 1 1 2 3 5 8在交互模式 import 時(shí)
>>> import fibo fibo1.3?模塊搜索路徑
當(dāng)模塊 spam 被導(dǎo)入時(shí),解釋器首先在內(nèi)置模塊中搜索這個(gè)名字,如果沒有找到,會(huì)在 sys.path 指定的一系列目錄下 查找 spam.py 這個(gè)文件,sys.path 會(huì)在這些地方初始化。
- 包含當(dāng)前腳本的目錄(或者當(dāng)前目錄)
- PYTHONPATH (一系列目錄名,和系統(tǒng)變量PATH格式一樣)
- 安裝時(shí)默認(rèn)的設(shè)定(the installation-dependent default)
1.4?“編譯過的” Python 文件
如果 spam.py 所在文件下有一個(gè)名為 spam.pyc 的文件存在,這說明有 spam.py 已經(jīng)被編譯過,編譯后的字節(jié)碼 存放在 spam.pyc 中。這是加速調(diào)用大量標(biāo)準(zhǔn)庫的 python 程序啟動(dòng)時(shí)間的一項(xiàng)重要技術(shù)。 正常情況下,你無需為 spam.pyc 的產(chǎn)生做任何事情,當(dāng) spam.py 被成功編譯時(shí),會(huì)嘗試寫入 spam.pyc, 如果失敗了, 那也不會(huì)報(bào)錯(cuò),如果寫入的信息不完整,spam.pyc會(huì)被認(rèn)為是無效的。
2?標(biāo)準(zhǔn)模塊
Python 自帶了一個(gè)標(biāo)準(zhǔn)模塊庫,一些模塊被內(nèi)置于解釋器中,這些模塊不涉及語言的核心,但是與效率以及操作系統(tǒng) 相關(guān),例如系統(tǒng)調(diào)用。這些模塊在不同平臺(tái)有所不同。 需要特別注意的是 sys 模塊,它可以修改交互模式下的提示符,修改搜索路徑,等等。
>>> import sys >>> sys.ps1 '>>> ' >>> sys.ps1 = '>_:' >_:sys.ps2 '... ' >_:sys.path.append('/usr/lib')3?dir 函數(shù)
dir 函數(shù)可以得到一個(gè)模塊定義了哪些名稱,例如
>>> import fibo fibo >>> dir(fibo) ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'fib', 'fib2']注意 dir 會(huì)列出所有類型的名字:變量,函數(shù),模塊等等,不會(huì)列出內(nèi)置的函數(shù)和變量,如果想查看內(nèi)置變量,可以 用
>>> import __builtin__ >>> dir(__builtin__) ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError','SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']4?包(Package)
包是 Python 組織模塊名稱空間的一種方式,例如模塊名 A.B 表示包A中的子模塊B. 例如你需要設(shè)計(jì)一系列模塊用于處理聲音文件和聲音數(shù)據(jù),文件有不同的格式,如wav,au,aiff. 數(shù)據(jù)處理方式也有很多種, 例如混合,合并,等等,那么,你可能需要這樣設(shè)計(jì)和組織模塊:
sound/ Top-level package__init__.py Initialize the sound packageformats/ Subpackage for file format conversions__init__.pywavread.pywavwrite.pyaiffread.pyaiffwrite.pyauread.pyauwrite.py...effects/ Subpackage for sound effects__init__.pyecho.pysurround.pyreverse.py...filters/ Subpackage for filters__init__.pyequalizer.pyvocoder.pykaraoke.py...__ init __.py 文件可以用于加載模塊前設(shè)置路徑,設(shè)置變量等。 使用包中的模塊時(shí),可以這樣使用
import sound.effects.echo調(diào)用時(shí),必須寫命名
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)另一種導(dǎo)入方式是:
from sound.effects import echo這樣,使用時(shí)可以直接使用 echo
echo.echofilter(input, output, delay=0.7, atten=4)當(dāng)然,也可以進(jìn)一步:
from sound.effects.echo import echofilter echofilter(input, output, delay=0.7, atten=4)4.1?Import * from package
如果我們通過下面的方式導(dǎo)入,會(huì)有什么效果呢?
from sound.effects import *理想情況下,它會(huì)導(dǎo)入包下的所有子模塊,但實(shí)際上,它需要花費(fèi)很長時(shí)間,并且有副作用。 解決這個(gè)問題的辦法是,在__ init __.py 文件中定義一個(gè)變量,這樣上述執(zhí)行會(huì)根據(jù)這個(gè)變量的內(nèi)容知道應(yīng)該導(dǎo)入什么。
__all__ = ["echo", "surround", "reverse"]原文鏈接:http://docs.python.org/2/tutorial/modules.html
轉(zhuǎn)載于:https://www.cnblogs.com/Iambda/archive/2013/03/01/3933493.html
總結(jié)
以上是生活随笔為你收集整理的「学习笔记——Python」Python 的模块(Modules)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webclient 和 webreque
- 下一篇: python基础学习笔记(十三)