python簡單學------------模塊

 

 

模塊

<1>Python中的模塊

有過C語言編程經驗的朋友都知道在C語言中若是要引用sqrt函數,必須用語句#include <math.h>引入math.h這個頭文件,不然是沒法正常進行調用的。python

那麼在Python中,若是要引用一些其餘的函數,該怎麼處理呢?linux

在Python中有一個概念叫作模塊(module),這個和C語言中的頭文件以及Java中的包很相似,好比在Python中要調用sqrt函數,必須用import關鍵字引入math這個模塊,下面就來了解一下Python中的模塊。git

說的通俗點:模塊就比如是工具包,要想使用這個工具包中的工具(就比如函數),就須要導入這個模塊shell

<2>import

在Python中用關鍵字import來引入某個模塊,好比要引用模塊math,就能夠在文件最開始的地方用import math來引入。編程

形如:函數

import module1,mudule2... 

當解釋器遇到import語句,若是模塊在當前的搜索路徑就會被導入。工具

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

  模塊名.函數名
  • 想想:ui

    爲何必須加上模塊名調用呢?spa

  • 答:

    由於可能存在這樣一種狀況:在多個模塊中含有相同名稱的函數,此時若是隻是經過函數名來調用,解釋器沒法知道到底要調用哪一個函數。因此若是像上述這樣引入模塊的時候,調用函數必須加上模塊名

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解析器對模塊位置的搜索順序是:

  1. 當前目錄
  2. 若是不在當前目錄,Python則搜索在shell變量PYTHONPATH下的每一個目錄。
  3. 若是都找不到,Python會察看默認路徑。UNIX下,默認路徑通常爲/usr/local/lib/python/
  4. 模塊搜索路徑存儲在system模塊的sys.path變量中。變量裏包含當前目錄,PYTHONPATH和由安裝過程決定的默認目錄。

 

模塊製做

<1>定義本身的模塊

在Python中,每一個Python文件均可以做爲一個模塊,模塊的名字就是文件的名字。

好比有這樣一個文件test.py,在test.py中定義了函數add

test.py

def 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__

直接運行此文件

 

在其餘文件中import此文件

 

總結:

  • 能夠根據__name__變量的結果可以判斷出,是直接執行的python腳本仍是被引入執行的,從而可以有選擇性的執行測試代碼

 

 

模塊中的__all__

1. 沒有__all__

 

 

 

 

2. 模塊中有__all__

 

 

總結

  • 若是一個文件中有__all__變量,那麼也就意味着這個變量中的元素,不會被from xxx import *時導入,*其實就是__all__中的值

 

 

 

python中的包

1. 引入包

1.1 有2個模塊功能有些聯繫

 

 

 

1.2 因此將其放到同一個文件夾下

 

1.3 使用import 文件.模塊 的方式導入

 

1.4 使用from 文件夾 import 模塊 的方式導入

 

1.5 在msg文件夾下建立__init__.py文件

 

1.6 在__init__.py文件中寫入

 

1.7 從新使用from 文件夾 import 模塊 的方式導入

 

總結:

  • 包將有聯繫的模塊組織在一塊兒,即放到同一個文件夾下,而且在這個文件夾建立一個名字爲__init__.py 文件,那麼這個文件夾就稱之爲
  • 有效避免模塊名稱衝突問題,讓應用組織結構更加清晰

2. __init__.py文件有什麼用

__init__.py 控制着包的導入行爲

2.1 __init__.py爲空

僅僅是把這個包導入,不會導入包中的模塊

2.2 __all__

__init__.py文件中,定義一個__all__變量,它控制着 from 包名 import *時導入的模塊

2.3 (瞭解)能夠在__init__.py文件中編寫內容

能夠在這個文件中編寫語句,當導入時,這些語句就會被執行

__init__.py文件 

 

 

3. 擴展:嵌套的包

假定咱們的包的例子有以下的目錄結構:

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 等是它的子包。 咱們能夠這樣導入子包:

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

你也可以使用 from-import 實現不一樣需求的導入

第一種方法是隻導入頂層的子包,而後使用屬性/點操做符向下引用子包樹:

from Phone import Mobile
Mobile.Analog.dial('555-1212')

此外,咱們能夠還引用更多的子包:

from Phone.Mobile import Analog
Analog.dial('555-1212')

事實上,你能夠一直沿子包的樹狀結構導入:

from Phone.Mobile.Analog import dial
dial('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 setup setup(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.安裝的方式

  1. 找到模塊的壓縮包
  2. 解壓
  3. 進入文件夾
  4. 執行命令python setup.py install

注意:

  • 若是在install的時候,執行目錄安裝,可使用python setup.py install --prefix=安裝路徑

2.模塊的引入

在程序中,使用from import 便可完成對安裝的模塊使用

from 模塊名 import 模塊名或者*

相關文章
相關標籤/搜索