青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Sivan's blog

用代碼說話……
posts - 14, comments - 2, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

[學]Python用戶手冊筆記_3_Modules

Posted on 2010-12-20 08:54 Sivan 閱讀(491) 評論(0)  編輯 收藏 引用 所屬分類: Python


5. 模塊 Modules

想要將程序長久保存,方便維護。Python 提供了一個方法可以從文件中獲取定義,在腳本或者解釋器的一個交互式實例中使用。在模塊中的定義可以導入到另一個模塊或主模塊中。

模塊是包括Python定義和聲明的文件。文件名就是模塊名加上“.py”后綴。模塊的模塊名可以由全局變量__name__得到。

# Fibonacci numbers module

 

def fib(n): # write Fibonacci series up to n

    a, b = 0, 1

    while b < n:

        print b

        a, b = b, a+b      

def fib2(n): # return Fibonacci series up to n

    result = []

    a, b = 0, 1

    while b < n:

        result.append(b)

        a, b = b, a+b

        return result

保存為fibo.py到本地文件夾。

運行cmdcdfibo.py所在文件夾,python命令進入解釋器,使用下面命令導入這個模塊

>>> import fibo

這樣做不會直接把fibo中的函數導入當前的語義表;它只是引入了模塊名fibo。通過使用模塊名字,你可以訪問模塊中的函數:

>>> fibo.fib(1000)

1

1

2

3

5

8

13

21

34

55

89

144

233

377

610

987

>>> fibo.__name__

'fibo'

>>>

如果你經常使用一個函數,你可以可以給它賦一個本地名稱:

>>> fib = fibo.fib

>>> fib(10)

1

1

2

3

5

8

>>>


5.1
深入模塊

模塊可以像函數定義一樣包含執行語句。這些語句通暢用于初始化模塊。它們只在模塊第一次導入時執行一次。對應于在模塊中定義的所有函數的全局語義表,每一個模塊都有自己的私有語義表。因此,模塊作者可以在模塊中使用一些全局變量,而不用擔心與用戶的全局變量意外沖突而引發錯誤。另一方面,如果你確定需要,可以像引用模塊中的函數一樣獲取模塊中的全局變量,形式modname.itemname

模塊中可以導入其他模塊。習慣上所有的import語句都放在模塊(或腳本,等等)的開頭,但這并不是必須的。被導入的模塊名被放在模塊的全局語義表中。

import語句的一個變體直接從被導入的模塊中導入命名到本模塊的語義表中。

>>> from fibo import fib, fib2

>>> 

這樣不會在本地語義表中導入模塊名。(上面的例子,fibo沒有定義)

甚至可以導入模塊中的所有定義:

>>> from fibo import *

>>> 

這樣可以導入所有除了以下劃線(_)開頭的命名。


5.1.1
模塊搜索路徑

如果要導入的模塊名字為spam,搜索順序為:

1.在當前目錄中搜索“spam.py”文件。

2.在環境變量PYTHONPATH代表的目錄列表中搜索。

3.搜索環境PATH中的路徑列表。

如果PYTHONPATH沒有設置,或者文件沒有找到,接下來搜索安裝目錄,在UNIX中,通常是“../usr/local/lib/python”。

實際上,解釋器由sys.path變量指定的路徑目錄搜索模塊,該變量初始化時默認包含了輸入腳本(或當前目錄),PYTHONPATH和安裝目錄。這樣就允許Python程序了解如何修改或替換模塊搜索目錄。需要注意的是由于這些目錄中吧哦哈uyou搜索路徑中運行的腳本,所以這些腳本不應該和標準模塊重名,否則Python會嘗試把加載的腳本作為模塊,當導入模塊時。這通常會引發一個錯誤。


5.1.2
編譯Python文件

對于引用了大量標準模塊的短程,有一個提高啟動速度的重要方法,如果在“spam.py”所在的目錄下存在一個名為“spam.pyc”文件,它會被視為spam模塊的預“編譯”版本。用于創建“spam.pyc”的這一版“spam.py”的修改時間記錄在“spam.pyc”文件中,如果兩者不匹配,“.pyc”文件被忽略。

通常你不需要為創建“spam.pyc”文件作任何工作。一旦“spam.py”成功編譯,就會試圖編譯對應版本的“spam.pyc”。如果有任何原因導致寫入不成功,返回的“spam.pyc”文件就會視為無效,隨后即被忽略。“spam.pyc”文件的內容是平臺獨立的,所以python模塊目錄可以在不同架構的機器之間共享。

部分高級技巧:

1.-O參數調用Python解釋器時,會生成優化代碼并保存在“.pyo”文件中。目前的優化器沒有太多幫助;它只是刪除了斷言語句。使用-O參數時,所有的字節碼都會被優化;.pyc文件被忽略,.py文件被編譯為優化的字節碼。

2.Python解釋器傳遞兩個-O參數會執行完全優化的二進制優化編譯,這偶爾會生成錯誤的程序。目前的優化器,只是從二進制代碼中刪除了__doc__字符串,生成更為緊湊的“.pyo”文件。因為一些程序依賴這些變量的可用性,你應該只在確定無誤的場合使用這一選項。

3.來自“.pyc”或“.pyo”文件中的程序不會比來自“.py”文件的運行更快;“.pyc”或“.pyo”文件只是在它們加載的時候更快一些。

4.通過腳本名在命令行運行腳本時,不會為該腳本創建的字節碼代碼寫入“.pyc”或“.pyo”文件。如此,用一個小的啟動腳本導入這個模塊,就可以提高腳本的啟動速度。也可以直接在命令行中指定一個“.pyc”或“.pyo”文件。

5.對于同一個模塊(如spam.py),可以只有“spam.pyc”文件(或者“spam.pyo”)而沒有“spam.py”文件。這樣可以打包發布比較難于逆向工程的Python代碼庫。

6.模塊可以為指定目錄中的所有模塊創建“.pyc”文件(或者是“.pyo”文件)。


5.2
標準模塊

Python帶有一個標準模塊庫,并發布由獨立的文檔,名為Python庫參考手冊。有一些模塊內置于解釋器中,這些操作的訪問接口不是語言內核的一部分,但是已經內置于解釋器了。這既是為了提高效率,也是為了提供操作系統原生接口,如系統調用。這類模塊集合是一個依賴于底層平臺的配置選項。例如,amoeba模塊只提供對Amoeba原生系統的支持。有一個具體的模塊值得注意:sys,這個模塊內置于所有的Python解釋器。變量sys.ps1sys.ps2定義了主提示符和副提示符字符串:

>>> import sys

>>> sys.ps1

'>>> '

>>> sys.ps2

'... '

>>>

這兩個變量只在解釋器的交互模式下有意義。

變量sys.path是解釋器模塊搜索路徑的字符串列表。它由環境變量PYTHONPATH初始化,如果沒有設定PYTHONPATH,就由內置的默認值初始化。可以用標準的字符串操作修改它:


5.3 dir()
函數

內置函數dir()用于按模塊名搜索模塊定義,它返回一個字符串類型的存儲列表:

>>> import fibo, sys

>>> dir(fibo)

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'fib', 'fib2']

>>> dir(sys)

['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', 'api_version', 'appargv', 'appargvoffset', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'getwindowsversion', 'hexversion', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'py3kwarning', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']

>>>

無參數調用時,dir()函數返回當前定義的命名:

>>> a = [1, 2, 3, 4, 5]

>>> import fibo

>>> fib = fibo.fib

>>> dir()

['__builtins__', '__doc__', '__name__', '__package__', 'a', 'fib', 'fibo', 'pywin', 'sys']

>>>

注意該列表列出了所有類型的名稱:變量,模塊,函數,等等:

dir()不會列出內置函數和變量名。如果想列出這些內容,它們在標準模塊__builtin__中定義:

>>> 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', 'WindowsError', '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', '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']

>>>


5.4

包通常是使用用“圓點模塊名”的結構化模塊命名空間。例如,名為A.B的模塊表示,名為“A”的包中名為“B”的子模塊。正如同用模塊來保存不同的模塊架構可以避免全局變量之間的相互沖突,使用圓點模塊名保存箱NumPyPython Imaging Library之類的不同類庫架構可以避免模塊之間的命名沖突。

假設你現在想要設計一個模塊集(一個“包”)來統一處理聲音文件和聲音數據。存在幾種不同的聲音格式,于是,為了在不同類型的文件格式之間轉換,需要維護一個不斷增長的包集合。可能你還想要對聲音數據做很多不同的操作,所以你要加入一個無線留模塊來執行這些操作。你的包可能會是這個樣子(通過分級的文集體系來進行分組)。

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.ppy

                reverse.py

               

        Filters/              Subpackage for filters

                __init__.py

                equalizer.py

                vocoder.py

                karaoke.py

                ...

導入模塊時,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 import echo

這樣就加載了echo子模塊,并且使得它在沒有包前綴的情況下也可以使用,所以它可以如下方式調用:

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)

需要注意的是使用from package import item方式導入包時,這個子項既可以是包中的衣柜子模塊,也可以是包中定義的其他命名,像函數、類或變量。import語句首先核對是否包中有這個子項,如果沒有,它假定這是一個模塊,并嘗試加載它。如果沒有找到它,會引發一個ImportError異常。

相反,使用類似import item.subitem.subsubitem這樣的語法時,這些子項必須是包,最后的子項可以是包或模塊,但不能是前面子項中定義的類、函數或變量。


5.4.1 import * from a package

那么當用戶寫下from Sound.Effects import * 時會發生什么事?理想中,總是希望再文件系統中找出包中所有的子模塊,然后導入它們。不幸的是,這個操作在MacWindows平臺上工作的并不太好,這些文件系統的文件大小寫并不敏感!在這些平臺上沒有什么方法可以確保一個叫“ECHO.PY”的文件應該導入為模塊echoEchoECHO

對于包的作者來說唯一的解決方案就是給提供一個明確的包索引。import語句按如下條件進行轉換:執行form package import *時,如果包中的“__init__.py”代碼定義了一個名為__all__的鏈表,就會按照鏈表中給出的模塊名進行導入。新版本包發布時作者可以任意更新這個鏈表。如果包作者不想import*的時候導入他們的包中所有模塊,那么也可能會決定不支持它(import*)例如,“Sounds/Effects/__init__.py”這個文件可能包括如下代碼:

__all__ = ["echo", "surround", "reverse"]

這意味著from Sound.Effects import * 語句會從Sound包中導入以上三個已命名的子模塊。

如果沒有定義__all__from Sound.Effects import *語句不會從Sound.Effects包中導入所有的子模塊到當前命名空間。Effects導入到當前的命名空間,只能確定的是導入了Sound.Effects包(可能會運行“__init__.py”中的初始化代碼)以及在包中定義的所有命名。這些包含任何通過“__init__.py”定義的命名(和明確導入的子模塊)。同業也包括了前述的import語句從包中明確導入的子模塊。看下面的代碼:

import sound.effects.echo

import sound.effects.surround

from sound.effects import *

在這個例子中,echosurround模塊導入了當前的命名空間,這是因為執行fromimport語句時他們已經被定義在Sound.Effects包中(定義了__all__時也會同樣工作)。

需要注意的是習慣上不主張從一個包貨模塊中用import*導入所有模塊,因為這樣通常意味著可讀性會很差。然而,在交互會話中,這做可以減少輸入,certain modules are designed to export only names that follow certain patterns

記住,from package import specific_submodule沒喲錯誤!事實上,除非導入的模塊需要使用其他包中的同名子模塊,否則這是推薦寫法。


5.4.2
內部包

子模塊之間需要互相引用。例如,surround模塊可能會引用echo模塊。事實上,這樣的引用如此普遍,以至于import語句會先搜索包內部,然后才是標準模塊搜索路徑。因此surround模塊可以簡單的調用import echo或者from echo import echofilter。如果沒有在當前的包中發現要導入的模塊,import語句會依據指定名尋找一個頂級模塊。

如果包使用了子包結構(就像示例中的Sound包),不存在什么從鄰近的包中引用子模塊的便捷方式--必須使用子包的全名。例如,如果Sound.Filters.vocoder包需要使用Sound.Effects包中的echosa模塊,它可以使用from Sound.Effects import echo

(下面的是2.6中的內容)

Python2.5,加入了上述的隱含相對包含,你可以使用form module import name形式的引入語句來寫顯示的相對包含。這些顯示的相對包含使用點號來指出當前和父包參與到相對包含中。以surround模塊為例,你可以使用

from . import echo

from .. import formats

from ..filters import equalizer

注意顯示和隱式包含基于當前模塊的名字。因此主模塊的名字通常是“__main__”,Python程序中的主模塊應當總是使用絕對路徑包含。


5.4.3
多重路徑中的包

包支持一個更為特殊的變量,__path__。在包的“__init__.py”文件代碼執行之前,該變量初始化一個目錄名列表。該變量可以修改,它作用域包中的子包和模塊的搜索功能。

這個功能可以用于擴展包中的模塊集,不過它不常用。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲专区免费| 欧美成人精品在线| 亚洲一区黄色| 国产日韩欧美在线| 久久中文字幕一区| 久久精品国产精品亚洲| 老司机免费视频一区二区| 欧美一区二区三区在线播放| 国产精品一区二区你懂的| 亚洲精品视频在线观看免费| 久久综合九色| 国产一区二区欧美日韩| 午夜一区二区三区不卡视频| 美玉足脚交一区二区三区图片| 亚洲一区二区精品| 国产精品视频观看| 在线视频你懂得一区| 国产一区二区高清| 亚洲精品久久久久久久久久久久久| 国产欧美一区二区三区视频| 亚洲视频在线视频| 99国产精品视频免费观看一公开 | 欧美国产精品中文字幕| 亚洲欧洲一区| 激情久久久久| 一区视频在线播放| 午夜精品免费视频| 中文欧美字幕免费| 欧美日韩专区在线| 国产精品美女久久久浪潮软件| 久久米奇亚洲| 欧美成人免费小视频| 久久99伊人| 日韩视频中文字幕| 亚洲欧美综合国产精品一区| 免费av成人在线| 久久天天躁狠狠躁夜夜爽蜜月| 欧美福利视频在线| 国模私拍视频一区| 亚洲欧美在线网| 亚洲综合丁香| 欧美大片18| 亚洲国产福利在线| 亚洲视频中文| 欧美日本一区| 亚洲精品日韩久久| 日韩一二三区视频| 蜜臀91精品一区二区三区| 亚洲一区二区免费| 欧美三级视频在线观看| 日韩小视频在线观看专区| 亚洲乱码精品一二三四区日韩在线 | 欧美日韩国产亚洲一区| 亚洲电影免费| 日韩视频免费| 国产伊人精品| 亚洲一区二区三区欧美| 亚洲综合三区| 欧美一区国产二区| 久久国产精品72免费观看| 亚洲视频电影在线| 亚洲综合日韩在线| 欧美色区777第一页| 亚洲免费观看高清完整版在线观看熊 | 欧美一区二区视频观看视频| 国产精品人成在线观看免费| 亚洲一区二区高清视频| 亚洲免费久久| 在线综合亚洲欧美在线视频| 亚洲一区国产精品| 国产精品电影观看| 激情视频一区二区三区| 久久九九热re6这里有精品| 欧美成年人视频| 亚洲日产国产精品| 在线一区欧美| 久久国产一二区| 好吊日精品视频| 一区二区三区日韩精品| 欧美在线视频全部完| 先锋影音久久久| 欧美国产91| 一区二区三区日韩在线观看| 亚洲视频每日更新| 女主播福利一区| 日韩一级免费| 亚洲欧美一区二区三区在线| 欧美激情视频在线免费观看 欧美视频免费一 | 在线观看精品视频| 亚洲国产中文字幕在线观看| 亚洲欧美日韩另类精品一区二区三区| 国产精品视频你懂的| 亚洲裸体俱乐部裸体舞表演av| 午夜影院日韩| 欧美一区二区免费| 日韩午夜在线| 亚洲国产精品久久久久婷婷老年 | 欧美专区在线| 欧美国产激情| 亚洲第一精品影视| 亚洲精品欧美精品| 国产亚洲精品资源在线26u| 亚洲免费中文字幕| 久久精品久久99精品久久| 亚洲视频欧美视频| 亚洲免费黄色| 欧美福利在线观看| 尤物在线观看一区| 99在线精品视频在线观看| 欧美一区中文字幕| 欧美体内谢she精2性欧美| 久久久一区二区| 欧美视频在线观看| 免费在线日韩av| 久久深夜福利免费观看| 国产一区日韩一区| 亚洲精品日韩在线| 亚洲精品护士| 久久亚洲二区| 久久久综合精品| 久久久久久久波多野高潮日日| 宅男精品导航| 欧美日本韩国在线| 亚洲欧美日韩爽爽影院| 欧美成人国产一区二区| 可以看av的网站久久看| 国产欧美日韩91| 亚洲一级片在线看| 国产一区二区三区免费不卡| 在线中文字幕一区| 亚洲一区二区免费视频| 欧美高清视频www夜色资源网| 美女主播一区| 一区二区在线视频播放| 欧美在线日韩精品| 久久久国际精品| 国产一区二区三区奇米久涩 | 久久精品理论片| 国产精品视频一| 亚洲欧美清纯在线制服| 欧美一区二区三区免费视频| 久久久久免费视频| 宅男66日本亚洲欧美视频| 美女免费视频一区| 麻豆精品91| 影音先锋成人资源站| 欧美影院在线| 久久久久国产成人精品亚洲午夜| 国产视频一区二区三区在线观看| 午夜国产精品影院在线观看| 欧美精品一区二区三| 99视频有精品| 亚洲欧美日本国产有色| 久热精品视频| 夜夜嗨av一区二区三区中文字幕| 亚洲日本精品国产第一区| 中日韩视频在线观看| 野花国产精品入口| 99v久久综合狠狠综合久久| 日韩亚洲一区二区| 国产精品成人av性教育| 久久综合亚州| 亚洲第一福利社区| 亚洲一区二区免费看| 久久av在线看| 日韩视频中午一区| 亚洲欧美中日韩| 亚洲精品九九| 午夜精品视频网站| 久久一区二区三区av| 国产精品久久久久久av福利软件 | 宅男噜噜噜66一区二区| 国产精品免费看片| 亚洲欧洲一区二区在线观看| 亚洲乱码国产乱码精品精天堂 | 午夜精品福利一区二区三区av| 亚洲高清av| 欧美精品久久天天躁| 免费观看一区| 国产女主播一区二区| 久久综合999| 久久亚洲精品一区二区| 欧美视频在线看| 激情久久久久久久| 麻豆精品精华液| 中文日韩在线| 欧美激情一区二区三区在线| 亚洲欧美日韩一区二区在线| 欧美日韩1区| 欧美mv日韩mv国产网站| 一本色道久久99精品综合| 麻豆freexxxx性91精品| 一区二区三欧美| 欧美国产三区| 久久国产精品久久久| 99精品国产福利在线观看免费 | 夜夜爽av福利精品导航| 欧美片在线观看| 亚洲茄子视频| 一区二区精品|