模塊

  • 在Python中定续,一個.py文件就稱之為一個模塊(Module)
  • 使用模塊還可以避免函數(shù)名和變量名沖突租漂。相同名字的函數(shù)和變量完全可以分別存在不同的模塊中,因此,我們自己在編寫模塊時士骤,不必考慮名字會與其他模塊沖突
  • 為了避免模塊名沖突,Python又引入了按目錄來組織模塊的方法蕾域,稱為包(Package)
  • 舉個例子拷肌,一個abc.py的文件就是一個名字叫abc的模塊,一個xyz.py的文件就是一個名字叫xyz的模塊旨巷。
  • 現(xiàn)在巨缘,假設(shè)我們的abc和xyz這兩個模塊名字與其他模塊沖突了,于是我們可以通過包來組織模塊采呐,避免沖突若锁。方法是選擇一個頂層包名,比如mycompany斧吐,按照如下目錄存放


  • 引入了包以后又固,只要頂層的包名不與別人沖突仲器,那所有模塊都不會與別人沖突。現(xiàn)在仰冠,abc.py模塊的名字就變成了mycompany.abc乏冀,類似的,xyz.py的模塊名變成了mycompany.xyz
  • 請注意洋只,每一個包目錄下面都會有一個init.py的文件辆沦,這個文件是必須存在的,否則识虚,Python就把這個目錄當成普通目錄肢扯,而不是一個包。init.py可以是空文件担锤,也可以有Python代碼蔚晨,因為init.py本身就是一個模塊,而它的模塊名就是mycompany
  • 類似的妻献,可以有多級目錄,組成多級層次的包結(jié)構(gòu)


  • 文件www.py的模塊名就是mycompany.web.www团赁,兩個文件utils.py的模塊名分別是mycompany.utils和mycompany.web.utils

使用模塊

我們以內(nèi)建的sys模塊為例育拨,編寫一個hello的模塊:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 第4行是一個字符串,表示模塊的文檔注釋欢摄,任何模塊代碼的第一個字符串都被視為模塊的文檔注釋
' a test module '
# 第6行使用__author__變量把作者寫進去熬丧,這樣當你公開源代碼后別人就可以瞻仰你的大名
__author__ = 'Michael Liao'
# 以上就是Python模塊的標準文件模板,當然也可以全部刪掉不寫怀挠,但是析蝴,按標準辦事肯定沒錯

# 導入sys模塊后,我們就有了變量sys指向該模塊绿淋,利用sys這個變量闷畸,就可以訪問sys模塊的所有功能
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()
# sys模塊有一個argv變量,用list存儲了命令行的所有參數(shù)吞滞。argv至少有一個元素佑菩,因為第一個參數(shù)永遠是該.py文件的名稱,例如:
# 運行python3 hello.py獲得的sys.argv就是['hello.py']裁赠;
# 運行python3 hello.py Michael獲得的sys.argv就是['hello.py', 'Michael]
# 當我們在命令行運行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()函數(shù)菇夸。
# 調(diào)用hello.test()時琼富,才能打印出Hello, word!:
>>> hello.test()
Hello, world!

作用域

  • 在一個模塊中,我們可能會定義很多函數(shù)和變量庄新,但有的函數(shù)和變量我們希望給別人使用鞠眉,有的函數(shù)和變量我們希望僅僅在模塊內(nèi)部使用。在Python中择诈,是通過_前綴來實現(xiàn)的
  • 正常的函數(shù)和變量名是公開的(public)械蹋,可以被直接引用,比如:abc羞芍,x123哗戈,PI等;
  • 類似xxx這樣的變量是特殊變量荷科,可以被直接引用唯咬,但是有特殊用途,比如上面的author畏浆,name就是特殊變量胆胰,hello模塊定義的文檔注釋也可以用特殊變量doc訪問,我們自己的變量一般不要用這種變量名刻获;
  • 類似_xxx和__xxx這樣的函數(shù)或變量就是非公開的(private)蜀涨,不應(yīng)該被直接引用,比如_abc蝎毡,__abc等厚柳;
  • 之所以我們說,private函數(shù)和變量“不應(yīng)該”被直接引用沐兵,而不是“不能”被直接引用别垮,是因為Python并沒有一種方法可以完全限制訪問private函數(shù)或變量,但是扎谎,從編程習慣上不應(yīng)該引用private函數(shù)或變量宰闰。

安裝第三方模塊

  • 在Python中,安裝第三方模塊簿透,是通過包管理工具pip完成的
  • 注意:Mac或Linux上有可能并存Python 3.x和Python 2.x移袍,因此對應(yīng)的pip命令是pip3
  • 一般來說,第三方庫都會在Python官方的pypi.python.org網(wǎng)站注冊老充,要安裝一個第三方庫葡盗,必須先知道該庫的名稱,可以在官網(wǎng)或者pypi上搜索,比如Pillow的名稱叫Pillow觅够,因此胶背,安裝Pillow的命令就是
pip install Pillow
# 有了Pillow,處理圖片易如反掌喘先。隨便找個圖片生成縮略圖:
>>> from PIL import Image
>>> im = Image.open('test.png')
>>> print(im.format, im.size, im.mode)
PNG (400, 300) RGB
>>> im.thumbnail((200, 100))
>>> im.save('thumb.jpg', 'JPEG')

模塊搜索路徑

# 當我們試圖加載一個模塊時钳吟,Python會在指定的路徑下搜索對應(yīng)的.py文件,如果找不到窘拯,就會報錯
>>> import mymodule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named mymodule

# 默認情況下红且,Python解釋器會搜索當前目錄、所有已安裝的內(nèi)置模塊和第三方模塊涤姊,搜索路徑存放在sys模塊的path變量中
>>> import sys
>>> sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python34.zip', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages']

# 如果我們要添加自己的搜索目錄暇番,有兩種方法
# 一是直接修改sys.path,添加要搜索的目錄
>>> import sys
>>> sys.path.append('/Users/michael/my_py_scripts')
# 這種方法是在運行時修改思喊,運行結(jié)束后失效壁酬。
# 第二種方法是設(shè)置環(huán)境變量PYTHONPATH,該環(huán)境變量的內(nèi)容會被自動添加到模塊搜索路徑中恨课。設(shè)置方式與設(shè)置Path環(huán)境變量類似舆乔。注意只需要添加你自己的搜索路徑,Python自己本身的搜索路徑不受影響剂公。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末希俩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诬留,更是在濱河造成了極大的恐慌斜纪,老刑警劉巖贫母,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件文兑,死亡現(xiàn)場離奇詭異,居然都是意外死亡腺劣,警方通過查閱死者的電腦和手機绿贞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橘原,“玉大人籍铁,你說我怎么就攤上這事≈憾希” “怎么了拒名?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芋酌。 經(jīng)常有香客問我增显,道長,這世上最難降的妖魔是什么脐帝? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任同云,我火速辦了婚禮糖权,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炸站。我一直安慰自己星澳,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布旱易。 她就那樣靜靜地躺著禁偎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咒唆。 梳的紋絲不亂的頭發(fā)上届垫,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音全释,去河邊找鬼装处。 笑死,一個胖子當著我的面吹牛浸船,可吹牛的內(nèi)容都是我干的妄迁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼李命,長吁一口氣:“原來是場噩夢啊……” “哼登淘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起封字,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤黔州,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阔籽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體流妻,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年笆制,在試婚紗的時候發(fā)現(xiàn)自己被綠了绅这。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡在辆,死狀恐怖证薇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匆篓,我是刑警寧澤浑度,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鸦概,受9級特大地震影響箩张,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一伏钠、第九天 我趴在偏房一處隱蔽的房頂上張望横漏。 院中可真熱鬧,春花似錦熟掂、人聲如沸缎浇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽素跺。三九已至,卻和暖如春誉券,著一層夾襖步出監(jiān)牢的瞬間指厌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工踊跟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留踩验,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓商玫,卻偏偏與公主長得像箕憾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拳昌,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 模塊簡介 在軟件開發(fā)過程中袭异,隨著代碼的不斷增加,在一個問價里代碼就會越來越長炬藤,不容易維護御铃。為了編寫可維護的代碼,我...
    齊天大圣李圣杰閱讀 798評論 0 0
  • 在Python中沈矿,一個.py文件就稱之為一個模塊(Module)上真。如果不同的人編寫的模塊名相同怎么辦?為了避免模塊...
    牛崽兒酷閱讀 189評論 0 0
  • 模塊 在計算機程序的開發(fā)過程中细睡,隨著程序代碼越寫越多谷羞,在一個文件里代碼就會越來越長帝火,越來越不容易維護溜徙。為了編寫可維...
    時間之友閱讀 155評論 0 0
  • 前言 之前的文章都是使用Sublime Text來編寫 Python 的,主要是為了更好的熟悉和了解 Python...
    GitHubClub閱讀 997評論 2 6
  • 李笑來《七年就是一輩子》演講總結(jié) 原則:不講感受犀填,講總結(jié)和行動 1蠢壹、身份的解讀: 踐行者,先做后說九巡,且相信自己所說...
    棠七七閱讀 348評論 0 0