python(27):模組

來源:互聯網
上載者:User

標籤:NPU   main   朋友   多個   資訊   概念   res   應用   注意   

一、模組介紹1.Python中的模組

有過C語言編程經驗的朋友都知道在C語言中如果要引用sqrt函數,必須用語句#include <math.h>引入math.h這個標頭檔,否則是無法正常進行調用的。

那麼在Python中,如果要引用一些其他的函數,該怎麼處理呢?

在Python中有一個概念叫做模組(module),這個和C語言中的標頭檔以及Java中的包很類似,比如在Python中要調用sqrt函數,必須用import關鍵字引入math這個模組,下面就來瞭解一下Python中的模組。

說的通俗點:模組就好比是工具包,要想使用這個工具包中的工具(就好比函數),就需要匯入這個模組

 

2.import

在Python中用關鍵字import來引入某個模組,比如要引用模組math,就可以在檔案最開始的地方用import math來引入。

形如:

import module1,mudule2...

當解譯器遇到import語句,如果模組在當前的搜尋路徑就會被匯入。

在調用math模組中的函數時,必須這樣引用:

  模組名.函數名

因為在多個模組中含有相同名稱的函數,此時如果只是通過函數名來調用,解譯器無法知道到底要調用哪個函數。所以如果像上述這樣引入模組的時候,調用函數必須加上模組名

    import math    #這樣會報錯    print sqrt(2)    #這樣才能正確輸出結果    print math.sqrt(2)

有時候我們只需要用到模組中的某個函數,只需要引入該函數即可,此時可以用下面方法實現:

from 模組名 import 函數名1,函數名2....

不僅可以引入函數,還可以引入一些全域變數、類等

注意:

通過這種方式引入的時候,調用函數時只能給出函數名,不能給出模組名,但是當兩個模組中含有相同名稱函數的時候,後面一次引入會覆蓋前一次引入。也就是說假如模組A中有函數function( ),在模組B中也有函數function( ),如果引入A中的function在先、B中的function在後,那麼當調用function函數的時候,是去執行模組B中的function函數。

如果想一次性引入math中所有的東西,還可以通過from math import *來實現

 

3.from…import

Python的from語句讓你從模組中匯入一個指定的部分到當前命名空間中

文法如下:

 from modname import name1[, name2[, ... nameN]]

 例如,要匯入模組fib的fibonacci函數,使用如下語句:

from fib import fibonacci

注意:

不會把整個fib模組匯入到當前的命名空間中,它只會將fib裡的fibonacci單個引入

 

4.from … import *

把一個模組的所有內容全都匯入到當前的命名空間也是可行的,只需使用如下聲明:

from modname import *

注意:

這提供了一個簡單的方法來匯入一個模組中的所有項目。然而這種聲明不該被過多地使用。

 

5. as
    In [1]: import time as tt    In [2]: time.sleep(1)    ---------------------------------------------------------------------------    NameError                                 Traceback (most recent call last)    <ipython-input-2-07a34f5b1e42> in <module>()    ----> 1 time.sleep(1)    NameError: name ‘time‘ is not defined    In [3]:     In [3]:     In [3]: tt.sleep(1)    In [4]:     In [4]:     In [4]: from time import sleep as sp    In [5]: sleep(1)    ---------------------------------------------------------------------------    NameError                                 Traceback (most recent call last)    <ipython-input-5-82e5c2913b44> in <module>()    ----> 1 sleep(1)    NameError: name ‘sleep‘ is not defined    In [6]:     In [6]:     In [6]: sp(1)    In [7]:

 

6.定位模組

當你匯入一個模組,Python解析器對模組位置的搜尋順序是:目前的目錄;如果不在目前的目錄,Python則搜尋在shell變數PYTHONPATH下的每個目錄;如果都找不到,Python會察看預設路徑。UNIX下,預設路徑一般為/usr/local/lib/python/。

模組搜尋路徑儲存在system模組的sys.path變數中。變數裡包含目前的目錄,PYTHONPATH和由安裝過程決定的預設目錄。

 

二、模組製作1.定義自己的模組

在Python中,每個Python檔案都可以作為一個模組,模組的名字就是檔案的名字。

比如有這樣一個檔案test.py,在test.py中定義了函數add:

#test.pydef add(a,b):    return a+b

 

2.調用自己定義的模組

那麼在其他檔案中就可以先import test,然後通過test.add(a,b)來調用了,當然也可以通過from test import add來引入

    #main.py        import test    result = test.add(11,22)    print(result)

 

3.測試模組

在實際開中,當一個開發人員編寫完一個模組後,為了讓模組能夠在項目中達到想要的效果,這個開發人員會自行在py檔案中添加一些測試資訊,例如:

    #test.py    def add(a,b):        return a+b    # 用來進行測試    ret = add(12,22)    print(‘int test.py file,,,,12+22=%d‘%ret)

如果此時,在其他py檔案中引入了此檔案的話,想想看,測試的那段代碼是否也會執行呢!

    #main.py    import test    result = test.add(11,22)    print(result)

至此,可發現test.py中的測試代碼,應該是單獨執行test.py檔案時才應該執行的,不應該是其他的檔案中引用而執行

為瞭解決這個問題,python在執行一個檔案時有個變數__name__。可以根據__name__變數的結果能夠判斷出,是直接執行的python指令碼還是被引入執行的,從而能夠有選擇性的執行測試代碼

 

四、python中的包1. 引入包

包將有聯絡的模組組織在一起,即放到同一個檔案夾下,並且在這個檔案夾建立一個名字為__init__.py 檔案,那麼這個檔案夾就稱之為包。這可以有效避免模組名稱衝突問題,讓應用組織圖更加清晰。

2. __init__.py檔案

__init__.py 控制著包的匯入行為。

 __init__.py為空白,僅僅是把這個包匯入,不會匯入包中的模組。

可以在__init__.py檔案中編寫內容,當匯入時,這些語句就會被執行。

3.__all__

在__init__.py檔案中,定義一個__all__變數,它控制著 from 包名 import *時匯入的模組。如果一個檔案中有__all__變數,那麼也就意味著這個變數中的元素,不會被from xxx import *時匯入。

4. 擴充:嵌套的包

假定我們的包的例子有如下的目錄結構:

Phone/    __init__.py    common_util.py    Voicedta/        __init__.py        Pots.py        Isdn.py    Fax/        __init__.py        G3.py    Mobile/        __init__.py        Analog.py        igital.py    Pager/        __init__.py        Numeric.py

Phone 是最頂層的包,Voicedta 等是它的子包。 我們可以這樣匯入子包(你也可使用 from-import 實現不同需求的匯入):

import Phone.Mobile.AnalogPhone.Mobile.Analog.dial()

第一種方法是只匯入頂層的子包,然後使用屬性/點操作符向下引用子包樹:

from Phone import MobileMobile.Analog.dial(‘555-1212‘)

此外,我們可以還引用更多的子包:

from Phone.Mobile import AnalogAnalog.dial(‘555-1212‘)

事實上,你可以一直沿子包的樹狀結構匯入:

from Phone.Mobile.Analog import dialdial(‘555-1212‘)

在我們上邊的目錄結構中,我們可以發現很多的 __init__.py 檔案。這些是初始化模組,from-import 語句匯入子包時需要用到它。 如果沒有用到,他們可以是空檔案。

包同樣支援 from-import all 語句:

from package.module import *

然而,這樣的語句會匯入哪些檔案取決於作業系統的檔案系統。所以我們在__init__.py 中加入 __all__ 變數。該變數包含執行這樣的語句時應該匯入的模組的名字。它由一個模組名字串列表組成.。

 

五、模組發布1.mymodule目錄結構體如下:
.├── setup.py├── suba│   ├── aa.py│   ├── bb.py│   └── __init__.py└── subb    ├── cc.py    ├── dd.py    └── __init__.py
2.編輯setup.py檔案

py_modules需指明所需包含的py檔案

from distutils.core import setupsetup(name="dongGe", version="1.0", description="dongGe‘s module", author="dongGe", py_modules=[‘suba.aa‘, ‘suba.bb‘, ‘subb.cc‘, ‘subb.dd‘])
3.構建模組
python setup.py build

構建後目錄結構:

.├── build│   └── lib.linux-i686-2.7│       ├── suba│       │   ├── aa.py│       │   ├── bb.py│       │   └── __init__.py│       └── subb│           ├── cc.py│           ├── dd.py│           └── __init__.py├── setup.py├── suba│   ├── aa.py│   ├── bb.py│   └── __init__.py└── subb    ├── cc.py    ├── dd.py    └── __init__.py
4.產生發布壓縮包
python setup.py sdist

打包後,產生最終發布壓縮包dongGe-1.0.tar.gz , 目錄結構:

.├── build│   └── lib.linux-i686-2.7│       ├── suba│       │   ├── aa.py│       │   ├── bb.py│       │   └── __init__.py│       └── subb│           ├── cc.py│           ├── dd.py│           └── __init__.py├── dist│   └── dongGe-1.0.tar.gz├── MANIFEST├── setup.py├── suba│   ├── aa.py│   ├── bb.py│   └── __init__.py└── subb    ├── cc.py    ├── dd.py    └── __init__.py

 

六、模組安裝、使用1.安裝的方式

在命令列模式下,找到模組的壓縮包、解壓、進入檔案夾、執行命令python setup.py install。

注意:如果在install的時候,執行目錄安裝,可以使用python setup.py install --prefix=安裝路徑

2.模組的引入

在程式中,使用from import 即可完成對安裝的模組使用

from 模組名 import 模組名或者*

 

python(27):模組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.