「学习笔记——Python」Python 的模块(Modules)
6 Python的模塊 (Modules)
Table of Contents
- 1 關于模塊
- 1.1 更多關于模塊的故事
- 1.2 將模塊作為腳體執行
- 1.3 模塊搜索路徑
- 1.4 “編譯過的” Python 文件
- 2 標準模塊
- 3 dir 函數
- 4 包(Package)
- 4.1 Import * from package
1?關于模塊
如果你退出了交互模式,那么你定義的東西都都沒啦!如果你要寫一個長一點的程序,那么最好寫在一個文件里,每次需要 運行時就運行一下這個文件,這文件叫做腳本(Scripts)。隨著程序變大,寫在一個文件里也不行了,你需要把它分割成多個部分,以 方便維護和組織,這些不同的部分叫做模塊(Modules)。 模塊可以通過 import 來導入,這樣我們就可以使用這個模塊中定義的函數啦!一個文件對應一個模塊,模塊名是文件名去掉 擴展名。下面來看一個例子~
# 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我們可以在交互模式下導入這個模塊,然后使用其中的函數,同時模塊內還有一個全局變量,以 __ name __ 表示。
>>> import fibo >>> fibo.fib(10) 1 1 2 3 5 8 >>> fibo.fib(10) 1 1 2 3 5 8 >>> fibo.__name__ 'fibo'另外,如果經常使用這個函數,還可以將其賦給一個局部變量
>>> fib1= fibo.fib >>> fib1(10) 1 1 2 3 5 81.1?更多關于模塊的故事
模塊不僅可以包含函數,還可以包含可執行語句,它們負責初始化模塊,且僅在第一次導入模塊時被執行。 每個模塊都有其私有符號表,模塊內的所有函數將它們當作全局符號表來使用。 一個模塊可以導入(import)另一個模塊,import語句習慣于在開始調用,但這并非必要。 下面這種方式將從另一個模塊符號表里的內容導入本模塊符號表的方式,導入之后,就可以像模塊內函數那樣使用它們
>>> 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注意,并未導入fibo,所以不能使用fibo.fib來調用函數。
可以通過下面這種方式,導入另一個模塊內所有的符號
>>> from fibo import * >>> fib(10) 1 1 2 3 5 8 >>> fib2(10) [1, 1, 2, 3, 5, 8]1.2?將模塊作為腳體執行
在命令行輸入下面的內容會執行腳本的內容,
python fibo.py <arguments>如果只想讓腳本中的可執行語句在通過上述方式執行時起作用,而在交互模式 import 時不執行,可以在 腳本的最后加入:
if __name__ == "__main__":import sysfib(int(sys.argv[1]))原因就在于 命令行執行和交互模式 import 時,__ name __ 的值是不一樣的,做一個小實驗就會明白: 在 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]))在命令行執行時,
python fibo.py 10 __main__ 1 1 2 3 5 8在交互模式 import 時
>>> import fibo fibo1.3?模塊搜索路徑
當模塊 spam 被導入時,解釋器首先在內置模塊中搜索這個名字,如果沒有找到,會在 sys.path 指定的一系列目錄下 查找 spam.py 這個文件,sys.path 會在這些地方初始化。
- 包含當前腳本的目錄(或者當前目錄)
- PYTHONPATH (一系列目錄名,和系統變量PATH格式一樣)
- 安裝時默認的設定(the installation-dependent default)
1.4?“編譯過的” Python 文件
如果 spam.py 所在文件下有一個名為 spam.pyc 的文件存在,這說明有 spam.py 已經被編譯過,編譯后的字節碼 存放在 spam.pyc 中。這是加速調用大量標準庫的 python 程序啟動時間的一項重要技術。 正常情況下,你無需為 spam.pyc 的產生做任何事情,當 spam.py 被成功編譯時,會嘗試寫入 spam.pyc, 如果失敗了, 那也不會報錯,如果寫入的信息不完整,spam.pyc會被認為是無效的。
2?標準模塊
Python 自帶了一個標準模塊庫,一些模塊被內置于解釋器中,這些模塊不涉及語言的核心,但是與效率以及操作系統 相關,例如系統調用。這些模塊在不同平臺有所不同。 需要特別注意的是 sys 模塊,它可以修改交互模式下的提示符,修改搜索路徑,等等。
>>> import sys >>> sys.ps1 '>>> ' >>> sys.ps1 = '>_:' >_:sys.ps2 '... ' >_:sys.path.append('/usr/lib')3?dir 函數
dir 函數可以得到一個模塊定義了哪些名稱,例如
>>> import fibo fibo >>> dir(fibo) ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'fib', 'fib2']注意 dir 會列出所有類型的名字:變量,函數,模塊等等,不會列出內置的函數和變量,如果想查看內置變量,可以 用
>>> 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. 例如你需要設計一系列模塊用于處理聲音文件和聲音數據,文件有不同的格式,如wav,au,aiff. 數據處理方式也有很多種, 例如混合,合并,等等,那么,你可能需要這樣設計和組織模塊:
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 文件可以用于加載模塊前設置路徑,設置變量等。 使用包中的模塊時,可以這樣使用
import sound.effects.echo調用時,必須寫命名
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)另一種導入方式是:
from sound.effects import echo這樣,使用時可以直接使用 echo
echo.echofilter(input, output, delay=0.7, atten=4)當然,也可以進一步:
from sound.effects.echo import echofilter echofilter(input, output, delay=0.7, atten=4)4.1?Import * from package
如果我們通過下面的方式導入,會有什么效果呢?
from sound.effects import *理想情況下,它會導入包下的所有子模塊,但實際上,它需要花費很長時間,并且有副作用。 解決這個問題的辦法是,在__ init __.py 文件中定義一個變量,這樣上述執行會根據這個變量的內容知道應該導入什么。
__all__ = ["echo", "surround", "reverse"]原文鏈接:http://docs.python.org/2/tutorial/modules.html
轉載于:https://www.cnblogs.com/Iambda/archive/2013/03/01/3933493.html
總結
以上是生活随笔為你收集整理的「学习笔记——Python」Python 的模块(Modules)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webclient 和 webreque
- 下一篇: 那些帮助你成为优秀前端工程师的讲座——《