08-python中的包與模塊

你已經瞭解瞭如何在你的程序中經過定義一次函數工做來重用代碼。那麼若是你 想在你所編寫的別的程序中重用一些函數的話,應該怎麼辦?正如你可能想象到的那樣,答 案是模塊(Modules)python

編寫模塊有不少種方法,其中最簡單的一種即是建立一個包含函數與變量、以 .py 爲後綴的 文件程序員

from..import 語句

import 語句容許在當前運行的程序文件中使用模塊中的代碼。經過將函數存儲在獨立的文件中,可隱藏程序代碼的細節,將重點放在程序的高層邏輯上。這還能讓你在衆多不一樣的程序中重用函數。函數

將函數存儲在獨立文件中後,可與其餘程 序員共享這些文件而不是整個程序。知道如何導入函數還能讓你使用其餘程序員編寫的函數庫。工具

案例學習

from math import sqrt
print("16開平方是", sqrt(16))

輸出測試

16開平方是 4.0

模塊的 name

每一個模塊都有一個名稱,而模塊中的語句能夠找到它們所處的模塊的名稱。這對於肯定模塊 是獨立運行的仍是被導入進來運行的這一特定目的來講大爲有用。正如先前所提到的,當模 塊第一次被導入時,它所包含的代碼將被執行。spa

咱們能夠經過這一特性來使模塊以不一樣的方 式運行,這取決於它是爲本身所用仍是從其它模塊中導入而來。這能夠經過使用模塊的 name 屬性來實現。code

案例 (保存爲 module_using_name.py ):blog

if __name__ == '__main__':
    print('這個程序是本身運行的')
else:
    print('我是從其餘模塊導入的')

輸出:get

這個程序是本身運行的

在python控制檯導入

import module_using_name
​
# 輸出:我是從其餘模塊導入的

它是如何工做的

每個 Python 模塊都定義了它的 name 屬性。若是它與 main 屬性相同則表明這一 模塊是由用戶獨立運行的,所以咱們即可以採起適當的行動。

編寫你本身的模塊

編寫你本身的模塊很簡單,這其實就是你一直在作的事情!這是由於每個 Python 程序同時 也是一個模塊。你只須要保證它以 .py 爲擴展名便可。下面的案例會做出清晰的解釋。

案例(保存爲 mymodule.py ):

def say_hi():
    print('Hi, mymodule 正在說話.')
__version__ = '0.1'

要記住該模塊應該放置於與其它咱們即將導入這一模塊的程序相同的目錄下,

另外一個模塊(保存爲 mymodule_demo.py ):

import mymodule 
mymodule.say_hi() 
print('Version', mymodule.__version__)

輸出

Hi, mymodule 正在說話.

它是如何工做的

你會注意到咱們使用相同的點符來訪問模塊中的成員。Python 很好地重用了其中的符號,這 充滿了「Pythonic」式的氣息,這使得咱們能夠沒必要學習新的方式來完成一樣的事情。

下面是一個使用 from...import 語法的範本(保存爲 mymodule_demo2.py ):

from mymodule import say_hi, __version__
say_hi()
print('Version', __version__)

mymodule_demo2.py 所輸出的內容與 mymodule_demo.py 所輸出的內容是同樣的

在這裏須要注意的是,若是導入到 mymodule 中的模塊裏已經存在了 version 這一名 稱,那將產生衝突。

這多是由於每一個模塊一般都會使用這一名稱來聲明它們各自的版本 號。所以,咱們大都推薦最好去使用 import 語句,儘管這會使你的程序變得稍微長一些。

你還可使用:

from mymodule import

這將導入諸如 say_hi 等全部公共名稱,但不會導入 version 名稱,由於後者以雙下劃 線開頭。

警告:要記住你應該避免使用 from mymodule import * 這種形式

Python 的一大指導原則是「明瞭賽過晦澀」這樣的話你都不知道函數是在哪定義,哪兒導入的

如今,你必須開始遵照用以組織你的程序的層次結構。變量一般位於函數內部,函數與全局 變量一般位於模塊內部。

若是你但願組織起這些模塊的話,應該怎麼辦?這即是包 (Packages)應當登場的時刻。

包是指一個包含模塊與一個特殊的 __init__.py 文件的文件夾,後者向 Python 代表這一文 件夾是特別的,由於其包含了 Python 模塊。

| |
| ---- | ---- |
| 具有必定功能的工具 | 包含不少工具、功能強大的工具箱|
| python中的模塊| python中的包(模塊包/程序包)|

考慮一個在 package_my 目錄下的 demo1.py、demo2.py、__init__.py 文件,test.py 爲測試調用包的代碼,目錄結構以下:

test.py

package_my/demo1.py

def runfun1():
   print "我在demo1.py"

package_my/demo2.py

def runfun2():
   print "我在demo2.py"

package_my/__init__.py

if __name__ == '__main__':
    print '做爲主程序運行'
else:
    print 'package_my  初始化'

test.py

from package_my.demo1 import runfun1
from package_my.demo2 import runfun2

結果

package_my  初始化

總結

如同函數是程序中的可重用部分那般,模塊是一種可重用的程序。包是用以組織模塊的另外一 種層次結構。Python 所附帶的標準庫就是這樣一組有關包與模塊

咱們已經瞭解瞭如何使用這些模塊並建立你本身的模塊。

image

IT入門 感謝關注

練習地址:www.520mg.com/it