一、模組基礎
1、模組
自我包含,且有組織的**片段就是模組
模組是pyhon最高端別的程式組織單元,它將程式**和資料封裝起來以便重用。實際的角度,模組往往對應python程式檔案。2、命名空間每個檔案都是乙個模組,並且模組匯入其他模組之後就可以使用匯入模組定義的變數名。模組可以由兩個語句和乙個重要的內建函式進行處理。
import: 使客戶端(匯入者)以乙個整體獲取乙個模組。
from:容許客戶端從乙個模組檔案中獲取特定的變數名。
reload:在不中止python程式的情況下,提供了乙個重新載入模組檔案**的方法。
參考:
乙個命名空間就是從名稱到物件的關係隱射集合。
每乙個模組都定義的自己唯一的命名空間,如:
import s1,s2#向命名空間新增名稱的操作過程涉及繫結識別符號到指定物件的操作(以及給物件的引用計數加1)。s1.py,s2.py
s1.foo()
s2.bar()
s1.bar()
#由於每個模組都有唯一的命名空間,即使屬性相同也不會發生衝突
3、搜尋路徑和路徑搜尋
模組的匯入需要叫做「路徑搜尋」的過程。
搜尋路徑:查詢一組目錄
路徑搜尋:查詢某個檔案的操作
importerror: no module named mymodule這種錯誤就是說:模組不在搜尋路徑裡,從而導致路徑搜尋失敗!
匯入模組時,不帶模組的字尾名,比如.py
python搜尋模組的路徑:
1)、程式的主目錄
2)、ptyhonpath目錄(如果已經進行了設定)
3)、標準連線庫目錄(一般在/usr/local/lib/python2.x/)
4)、任何的.pth檔案的內容(如果存在的話).新功能,允許使用者把有效果的目錄新增到模組搜尋路徑中去
.pth字尾的文字檔案中一行一行的地列出目錄。
這四個組建組合起來就變成了sys.path了,
>>> import二、模組匯入sys>>>sys.path
匯入時,python會自動由左到右搜尋這個列表中每個目錄。
1、import語句
推薦:import放在程式前面,且按照python標準庫模組、python第三方模組、自定義模組的順序從上到下排開。
2、from-import語句
可以匯入模組中指定屬性:from module import name1[,nam2[,...namen]]
注意:(1)、匯入可使用\進行換行,
如:from module import nam1,name2,\
name3,name4....
(2)、不推薦from module import *
(3)、使用as更換名稱:
from module import name1 as name2
3、模組匯入的特徵
(1)、載入時執行模組,也就是匯入模組的頂層**將會被執行,通常包括該模組內全域性變數、類和函式的宣告。我們盡可能多的把**封裝到函式中,這是良好的模組程式設計習慣。
(2)、乙個模組可被匯入(import)多次,但是只載入(load)一次.
4、模組內建函式
(1)、__import__():匯入模組的函式
import語句實際上呼叫__import__()函式
如果我們有乙個testa.py檔案,我們可以用module=__import__('testa')來匯入它。這樣可以用module.屬性來使用testa.py中的屬性
其他見書
三、包1、包的概念
包是乙個有層次的檔案目錄結構,由模組和子包組成。
2、解析包機制:
每乙個.py檔案稱為乙個module,module之間可以互相匯入3、python中__init__.py檔案的作用module可以定義在包裡面.python定義包的方式稍微有點古怪,假設我們有乙個parent資料夾,該資料夾有乙個child子資料夾.child中有乙個module a.py . 如何讓python知道這個檔案層次結構?很簡單,每個目錄都放乙個名為_init
_.py 的檔案.該檔案內容可以為空.這個層次結構同上:
參考:
python的每個模組的包中,都有乙個__init__.py檔案,有了這個檔案,我們才能匯入這個目錄下的module。
那麼,__init__.py還有什麼別的功能呢?
其實,__init__.py裡面還是可以有內容的,我們在匯入乙個包時,實際上匯入了它的__init__.py檔案。
4、匯入
參考上面的
import web.web_catch
import web.child_web.demo
from web.child_web import demo
自己的總結:
1. python程式執行時可以直接呼叫標準庫模組中的函式,不用import它們,
可以使用help('modules')檢視標準庫模組;
2. 模組初次匯入時,模組頂層程式**(不在函式內的**)會被執行,
def 定義的函式類,他們也稱為語句,會被執行,但函式內的**不會被執行,
直到它們被呼叫。
a.py:
print('hello i am module a')
def afunc():
print('i am a func')
b.py:
import a #匯入a模組時,會執行a模組中頂層程式**(不在函式內的**)
print('i am module b')
a.afunc() #模組檔案也是物件,故可以直接呼叫a模組中的函式,這就是為什麼import re後,可以使用
re.compile
輸出:hello i am module a
i am module b
i am a func
#匯入乙個模組後,該模組物件就已經存在了,此時就可以呼叫該模組物件中的方法了。
3. import modulename和from module import name的區別
import modulename匯入整個模組,包括生成乙個以模組名命名的命名空間
from module import name只匯入指定模組的部分屬性至當前命名空間,使用時不必加模組字首,
可以直接使用其名稱,故,如果匯入模組的名稱與當前命名空間的名稱重複了,會覆蓋。
如:from random import randint,choice,此時,可以直接使用randint,而不需要random.randint這樣
來使用。
a.py:
vara = 'hello i am from module a'
b.py:
vara = 'hello i am from module b'
from a import vara #重新被賦值
print(vara) #輸出hello i am from module a
4. 匯入兩個模組a和b,兩個模組中有相同名字的函式,如a.func和b.func,在呼叫它們時
並不會產生衝突,因為匯入時,會生成乙個以模組名命名的命名空間,並把該命名空間匯入,
又如:list.pop()和dict.pop(),乙個屬於列表命名空間,乙個屬於字典命名空間;
上面list和dict都是型別,分別在兩個模組中。
5. 模組就是乙個命名空間,可以使用__dict__獲取,如:
import random
random.__dict__
6. 匯入模組例子:
/tmp/mypkg目錄下有mymod.py和__init__.py檔案,並且/tmp在python的搜尋路徑下,此時可以
這樣使用:import mypkg.mymod 匯入我們的模組了,mypkg為包名。
python學習手冊筆記 23 模組包
00.除了模組名之外,匯入也可以指定目錄路徑。python 的目錄就是包。01.選擇點號語法 一部分是考慮到跨平台,但也是應為import語句中的路徑程式設計實際的巢狀的物件路徑。這種語法也意味著,如果你忘了import語句中省略.py,就會得到奇怪的錯誤資訊。02.03.from 語句的行為 作為...
Python入門學習筆記(pickle 模組)
pickle模組用法 pickle可以把程式裡面的陣列做成乙個程式可以呼叫的資料報,就像醃製泡菜一樣,把一些資料倒入缸裡做成一罈可以使用的模組。第一句匯入pickle模組 第二句隨便寫乙個列表 第三局開啟列表,並儲存為wb可寫的二進位制 非常重要 第四句把my list列表資料倒入pickle fi...
python模組入門
1.模組的基本概念 定義 模組是從邏輯上組織python 的形式 當 量變得相當大它的時候,最好把 分成一些有組織的 段,並為其取乙個名稱 這些 段中可能有定義好的成員變數或函式。當我們需要使用該模組的成員變數或函式的時,我們可以匯入並使用它們 2.建立模組 模組物理層面上組織模組的方法時檔案,每乙...