13、Python入門____語法入門(五)模塊

正文如下:


模塊


在計算機程序的開發(fā)過程中刊橘,隨著程序代碼越寫越多鄙才,在一個文件里代碼就會越來越長,越來越不容易維護促绵。

為了編寫可維護的代碼攒庵,我們把很多函數分組,分別放到不同的文件里败晴,這樣浓冒,每個文件包含的代碼就相對較少,很多編程語言都采用這種組織代碼的方式尖坤。在Python中稳懒,一個.py文件就稱之為一個模塊(Module)。

使用模塊有什么好處慢味?

最大的好處是大大提高了代碼的可維護性场梆。其次,編寫代碼不必從零開始纯路。當一個模塊編寫完畢或油,就可以被其他地方引用。我們在編寫程序的時候驰唬,也經常引用其他模塊顶岸,包括Python內置的模塊和來自第三方的模塊。

使用模塊還可以避免函數名變量名沖突定嗓。相同名字的函數和變量完全可以分別存在不同的模塊中蜕琴,因此,我們自己在編寫模塊時宵溅,不必考慮名字會與其他模塊沖突凌简。但是也要注意,盡量不要與內置函數名字沖突恃逻。點這里查看Python的所有內置函數雏搂。

你也許還想到,如果不同的人編寫的模塊名相同怎么辦寇损?為了避免模塊名沖突凸郑,Python又引入了按目錄來組織模塊的方法,稱為(Package)矛市。

舉個例子芙沥,一個abc.py的文件就是一個名字叫abc的模塊,一個xyz.py的文件就是一個名字叫xyz的模塊。

現在而昨,假設我們的abcxyz這兩個模塊名字與其他模塊沖突了救氯,于是我們可以通過包來組織模塊,避免沖突歌憨。方法是選擇一個頂層包名着憨,比如mycompany,按照如下目錄存放:

mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py

引入了包以后务嫡,只要頂層的包名不與別人沖突甲抖,那所有模塊都不會與別人沖突。現在心铃,abc.py模塊的名字就變成了mycompany.abc准谚,類似的,xyz.py的模塊名變成了mycompany.xyz于个。

請注意氛魁,每一個包目錄下面都會有一個__init__.py的文件暮顺,這個文件是必須存在的厅篓,否則,Python就把這個目錄當成普通目錄捶码,而不是一個包羽氮。init.py可以是空文件,也可以有Python代碼惫恼,因為__init__.py本身就是一個模塊档押,而它的模塊名就是mycompany

類似的祈纯,可以有多級目錄令宿,組成多級層次的包結構。比如如下的目錄結構:

mycompany
 ├─ web
 │  ├─ __init__.py
 │  ├─ utils.py
 │  └─ www.py
 ├─ __init__.py
 ├─ abc.py
 └─ xyz.py

文件www.py的模塊名就是mycompany.web.www腕窥,兩個文件utils.py的模塊名分別是mycompany.utilsmycompany.web.utils粒没。

自己創(chuàng)建模塊時要注意命名,不能和Python自帶的模塊名稱沖突簇爆。例如癞松,系統(tǒng)自帶了sys模塊,自己的模塊就不可命名為sys.py入蛆,否則將無法導入系統(tǒng)自帶的sys模塊响蓉。

使用模塊

Python本身就內置了很多非常有用的模塊,只要安裝完畢哨毁,這些模塊就可以立刻使用枫甲。

我們以內建的sys模塊為例,編寫一個hello的模塊:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

' a test module '

__author__ = 'Michael Liao'

import sys

def test():
    args = sys.argv
    if len(args)==1:
        print('Hello, world!')
    elif len(args)==2:
        print('Hello, %s!' % args[1])
    else:
        print('Too many arguments!')

if __name__=='__main__':
    test()

1行和第2行是標準注釋,第1行注釋可以讓這個hello.py文件直接在Unix/Linux/Mac上運行想幻,第2行注釋表示.py文件本身使用標準UTF-8編碼软能;

第4行是一個字符串,表示模塊的文檔注釋举畸,任何模塊代碼的第一個字符串都被視為模塊的文檔注釋查排;

第6行使用__author__變量把作者寫進去,這樣當你公開源代碼后別人就可以瞻仰你的大名抄沮;

以上就是Python模塊的標準文件模板跋核,當然也可以全部刪掉不寫,但是叛买,按標準辦事肯定沒錯砂代。

后面開始就是真正的代碼部分。

你可能注意到了率挣,使用sys模塊的第一步刻伊,就是導入該模塊:

import sys

導入sys模塊后,我們就有了變量sys指向該模塊椒功,利用sys這個變量捶箱,就可以訪問sys模塊的所有功能。

sys模塊有一個argv變量动漾,用list存儲了命令行的所有參數丁屎。argv至少有一個元素,因為第一個參數永遠是該.py文件的名稱旱眯,例如:

運行python3 hello.py獲得的sys.argv就是['hello.py']晨川;

運行python3 hello.py Michael獲得的sys.argv就是['hello.py', 'Michael]。

最后删豺,注意到這兩行代碼:

if __name__=='__main__':
    test()

當我們在命令行運行hello模塊文件時共虑,Python解釋器把一個特殊變量__name__置為__main__褐奴,而如果在其他地方導入該hello模塊時缆八,if判斷將失敗痹屹,因此貌虾,這種if測試可以讓一個模塊通過命令行運行時執(zhí)行一些額外的代碼溶褪,最常見的就是運行測試吐葵。

我們可以用命令行運行hello.py看看效果:

$ python3 hello.py
Hello, world!
$ python hello.py Michael
Hello, Michael!

如果啟動Python交互環(huán)境逢慌,再導入hello模塊:

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello
>>>

導入時妙啃,沒有打印Hello, word!疾党,因為沒有執(zhí)行test()函數音诫。

調用hello.test()時,才能打印出Hello, word!:

>>> hello.test()
Hello, world!

作用域

在一個模塊中雪位,我們可能會定義很多函數和變量竭钝,但有的函數和變量我們希望給別人使用,有的函數和變量我們希望僅僅在模塊內部使用。在Python中香罐,是通過_前綴來實現的卧波。

  • 正常的函數和變量名是公開的(public),可以被直接引用庇茫,比如:abc港粱,x123PI等旦签;

  • 類似__xxx__這樣的變量是特殊變量查坪,可以被直接引用,但是有特殊用途宁炫,比如上面的__author__偿曙,__name__就是特殊變量,hello模塊定義的文檔注釋也可以用特殊變量__doc__訪問羔巢,我們自己的變量一般不要用這種變量名望忆;

  • 類似_xxx__xxx這樣的函數或變量就是非公開的(private),不應該被直接引用竿秆,比如_abc启摄,__abc等;

之所以我們說袍辞,private函數和變量“不應該”被直接引用鞋仍,而不是“不能”被直接引用,是因為Python并沒有一種方法可以完全限制訪問private函數或變量搅吁,但是,從編程習慣上不應該引用private函數或變量落午。

private函數或變量不應該被別人引用谎懦,那它們有什么用呢?請看例子:

def _private_1(name):
    return 'Hello, %s' % name

def _private_2(name):
    return 'Hi, %s' % name

def greeting(name):
    if len(name) > 3:
        return _private_1(name)
    else:
        return _private_2(name)

我們在模塊里公開greeting()函數溃斋,而把內部邏輯用private函數隱藏起來了界拦,這樣,調用greeting()函數不用關心內部的private函數細節(jié)梗劫,這也是一種非常有用的代碼封裝和抽象的方法享甸,即:

外部不需要引用的函數全部定義成private,只有外部需要引用的函數才定義為public梳侨。

安裝第三方模塊

在Python中蛉威,安裝第三方模塊,是通過包管理工具pip完成的走哺。

如果你正在使用MacLinux蚯嫌,安裝pip本身這個步驟就可以跳過了。

如果你正在使用Windows,請參考安裝Python一節(jié)的內容择示,確保安裝時勾選了pipAdd python.exe to Path束凑。

在命令提示符窗口下嘗試運行pip,如果Windows提示未找到命令栅盲,可以重新運行安裝程序添加pip汪诉。

注意:Mac或Linux上有可能并存Python 3.x和Python 2.x,因此對應的pip命令是pip3谈秫。

例如摩瞎,我們要安裝一個第三方庫——Python Imaging Library,這是Python下非常強大的處理圖像的工具庫孝常。不過旗们,PIL目前只支持到Python 2.7,并且有年頭沒有更新了构灸,因此上渴,基于PILPillow項目開發(fā)非常活躍喜颁,并且支持最新的Python 3稠氮。

一般來說,第三方庫都會在Python官方的pypi.python.org網站注冊半开,要安裝一個第三方庫隔披,必須先知道該庫的名稱,可以在官網或者pypi上搜索寂拆,比如Pillow的名稱叫Pillow奢米,因此,安裝Pillow的命令就是:

pip install Pillow

耐心等待下載并安裝后纠永,就可以使用Pillow了鬓长。

安裝常用模塊

在使用Python時,我們經常需要用到很多第三方庫尝江,例如涉波,上面提到的Pillow,以及MySQL驅動程序炭序,Web框架Flask啤覆,科學計算Numpy等。用pip一個一個安裝費時費力惭聂,還需要考慮兼容性窗声。我們推薦直接使用Anaconda,這是一個基于Python的數據處理和科學計算平臺彼妻,它已經內置了許多非常有用的第三方庫嫌佑,我們裝上Anaconda豆茫,就相當于把數十個第三方模塊自動安裝好了,非常簡單易用屋摇。

可以從Anaconda官網下載GUI安裝包揩魂,安裝包有500~600M,所以需要耐心等待下載炮温。網速慢的同學請移步國內鏡像火脉。下載后直接安裝,Anaconda會把系統(tǒng)Path中的python指向自己自帶的Python柒啤,并且倦挂,Anaconda安裝的第三方模塊會安裝在Anaconda自己的路徑下,不影響系統(tǒng)已安裝的Python目錄担巩。

安裝好Anaconda后方援,重新打開命令行窗口,輸入python涛癌,可以看到Anaconda的信息:

┌────────────────────────────────────────────────────────┐
│Command Prompt - python                           - □ x │
├────────────────────────────────────────────────────────┤
│Microsoft Windows [Version 10.0.0]                      │
│(c) 2015 Microsoft Corporation. All rights reserved.    │
│                                                        │
│C:\> python                                             │
│Python 3.6.3 |Anaconda, Inc.| ... on win32              │
│Type "help", ... for more information.                  │
│>>> import numpy                                        │
│>>> _                                                   │
│                                                        │
│                                                        │
│                                                        │
└────────────────────────────────────────────────────────┘

可以嘗試直接import numpy等已安裝的第三方模塊犯戏。

模塊搜索路徑

當我們試圖加載一個模塊時,Python會在指定的路徑下搜索對應的.py文件拳话,如果找不到先匪,就會報錯:

>>> import mymodule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named mymodule

默認情況下,Python解釋器會搜索當前目錄弃衍、所有已安裝的內置模塊第三方模塊呀非,搜索路徑存放在sys模塊的path變量中:

>>> import sys
>>> sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', ..., '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']

如果我們要添加自己的搜索目錄,有兩種方法:

一是直接修改sys.path镜盯,添加要搜索的目錄:

>>> import sys
>>> sys.path.append('/Users/michael/my_py_scripts')

這種方法是在運行時修改岸裙,運行結束后失效。

第二種方法是設置環(huán)境變量PYTHONPATH形耗,該環(huán)境變量的內容會被自動添加到模塊搜索路徑中哥桥。設置方式與設置Path環(huán)境變量類似。注意只需要添加你自己的搜索路徑激涤,Python自己本身的搜索路徑不受影響。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末判呕,一起剝皮案震驚了整個濱河市倦踢,隨后出現的幾起案子,更是在濱河造成了極大的恐慌侠草,老刑警劉巖辱挥,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異边涕,居然都是意外死亡晤碘,警方通過查閱死者的電腦和手機褂微,發(fā)現死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來园爷,“玉大人宠蚂,你說我怎么就攤上這事⊥纾” “怎么了求厕?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扰楼。 經常有香客問我呀癣,道長,這世上最難降的妖魔是什么弦赖? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任项栏,我火速辦了婚禮,結果婚禮上蹬竖,老公的妹妹穿的比我還像新娘沼沈。我一直安慰自己,他們只是感情好案腺,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布庆冕。 她就那樣靜靜地躺著,像睡著了一般劈榨。 火紅的嫁衣襯著肌膚如雪访递。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天同辣,我揣著相機與錄音拷姿,去河邊找鬼。 笑死旱函,一個胖子當著我的面吹牛响巢,可吹牛的內容都是我干的。 我是一名探鬼主播棒妨,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼踪古,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了券腔?” 一聲冷哼從身側響起伏穆,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纷纫,沒想到半個月后枕扫,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡辱魁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年烟瞧,在試婚紗的時候發(fā)現自己被綠了诗鸭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡参滴,死狀恐怖强岸,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情卵洗,我是刑警寧澤请唱,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站过蹂,受9級特大地震影響十绑,放射性物質發(fā)生泄漏。R本人自食惡果不足惜酷勺,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一本橙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脆诉,春花似錦甚亭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至偶摔,卻和暖如春暇唾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辰斋。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工策州, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宫仗。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓够挂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親藕夫。 傳聞我的和親對象是個殘疾皇子孽糖,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容

  • 模塊 在計算機程序的開發(fā)過程中,隨著程序代碼越寫越多毅贮,在一個文件里代碼就會越來越長梭姓,越來越不容易維護。 為了編寫可...
    蓓蓓的萬能男友閱讀 238評論 0 0
  • 一嫩码、模塊介紹 在計算機程序的開發(fā)過程中,隨著程序代碼越寫越多罪既,在一個文件里代碼就會越來越長铸题,越來越不容易維護铡恕。 為...
    祐吢房_2c9a閱讀 345評論 1 1
  • 模塊簡介 在軟件開發(fā)過程中,隨著代碼的不斷增加丢间,在一個問價里代碼就會越來越長探熔,不容易維護。為了編寫可維護的代碼烘挫,我...
    齊天大圣李圣杰閱讀 798評論 0 0
  • 1.模塊 在Python中饮六,一個.py文件就稱之為一個模塊(Module)其垄。 包 為了避免模塊名沖突,Python...
    井上皓閱讀 825評論 0 1
  • [TOC] 最開始寫程序的時候卤橄,都是一個文件里輸入幾行源碼(python 的一個 web 框架bottle就特別強...
    人世間閱讀 5,499評論 1 10