1. 程式人生 > >Python的學習之旅———模組與包的使用 常用模組

Python的學習之旅———模組與包的使用 常用模組

一:import

匯入模組,只會在第一次匯入時執行原始檔的程式碼
如果模組已經載入到記憶體了,下一次匯入直接引用記憶體中匯入的結果

eval:提取字串內的表示式執行,然後返回執行結果

import 匯入檔案都做了哪些事?

1 以原始檔為準產生一個名稱空間
2 以剛剛產生的名稱空間為準,執行原始檔的程式碼
3 會在當前檔案中定義一個名字,這個名字就是模組名,用來引用模組中的名字

為模組起別名

import spam as sm

1 engine_type='mysql'
2 if engine_type == 'mysql':
3      import mysql as engine
4 elif engine_type == 'oracle':
5      import oracle as engine
6 engine.parse()

可以把兩個不同的模組引入時候起相同的別名 ,做到呼叫的時候統一化。小技巧

在一行匯入多個模組

1 import sys,os,re

二 使用模組之from ... import...

from spam import read1,read2,moeny

直接匯入了spam中的 函式 read1 和read2 的名字 也可以匯入變數名字 money

這樣使用的時候就不用以spam.read1()的方式呼叫函數了.

from spam import *

一下把spam.py中的所有名字都引入了

如果引入的模組中有__all__=['字串函式名','字串變數名']那麼

from spam import * 中* 對應模組spam內的__all__列表內的名字。

三模組的過載 

考慮到效能的原因,每個模組只被匯入一次,放入字典sys.module中,如果你改變了模組的內容,你必須重啟程式,python不支援重新載入或解除安裝之前匯入的模組,

有的同學可能會想到直接從sys.module中刪除一個模組不就可以解除安裝了嗎,注意了,你刪了sys.module中的模組物件仍然可能被其他程式的元件所引用,因而不會被清楚。

特別的對於我們引用了這個模組中的一個類,用這個類產生了很多物件,因而這些物件都有關於這個模組的引用。

如果只是你想互動測試的一個模組,使用 importlib.reload(), e.g. import importlib; importlib.reload(modulename),這隻能用於測試環境。

四py檔案模組與指令碼的區別

複製程式碼

 1 編寫好的一個python檔案可以有兩種用途:
 2     一:指令碼,一個檔案就是整個程式,用來被執行
 3     二:模組,檔案中存放著一堆功能,用來被匯入使用
 4 
 5 
 6 python為我們內建了全域性變數__name__,
 7     當檔案被當做指令碼執行時:__name__ 等於'__main__'
 8     當檔案被當做模組匯入時:__name__等於模組名
 9 
10 作用:用來控制.py檔案在不同的應用場景下執行不同的邏輯
11     if __name__ == '__main__':

複製程式碼

__name__的判斷要在寫在模組(指令碼程式中)

檔案spam.py當做指令碼執行,該值等於__main__,檔案spam.py當做模組被匯入時,該值等於指令碼名(spam)

五 模組的搜尋路徑

模組的查詢順序是:記憶體中已經載入的模組->內建模組(系統內建那些)->sys.path路徑中包含的模組

1 import sys
2 sys.path.append(r'檔案路徑\a')   a是資料夾
3 import m
4 也可以先去找到a 然後順著a找到m(a和執行檔案是在同一個目錄下)
5 from a import m

把檔案的路徑加入系統環境變數中,這是加入一次,而不是永久寫入。

六 包介紹

1包是一種通過使用‘.模組名’來組織python模組名稱空間的方式

複製程式碼

具體的:包就是一個包含有__init__.py檔案的資料夾,所以其實我們建立包的目的就是為了用資料夾將檔案/模組組織起來

#需要強調的是:
  1. 在python3中,即使包下沒有__init__.py檔案,import 包仍然不會報錯,而在python2中,包下一定要有該檔案,否則import 包報錯

  2. 建立包的目的不是為了執行,而是被匯入使用,記住,包只是模組的一種形式而已,包的本質就是一種模組

複製程式碼

2需要注意的是

複製程式碼

#1.關於包相關的匯入語句也分為import和from ... import ...兩種,
但是無論哪種,無論在什麼位置,在匯入時都必須遵循一個原則:
凡是在匯入時帶點的,點的左邊都必須是一個包(也就是說資料夾下必須有__init__.py這個檔案),否則非法。
可以帶有一連串的點,如item.subitem.subsubitem,
但都必須遵循這個原則。但對於匯入後,在使用時就沒有這種限制了,
點的左邊可以是包,模組,函式,類(它們都可以用點的方式呼叫自己的屬性)。

#2、import匯入檔案時,產生名稱空間中的名字來源於檔案,import 包,產生的名稱空間的名字同樣來源於檔案即包下的__init__.py,匯入包本質就是在匯入該檔案

#3、包A和包B下有同名模組也不會衝突,如A.a與B.a來自倆個名稱空間

複製程式碼

包的標誌就是包含__init__.py這個檔案。

圖列:

 模組匯入的時候都會做三件事 

1 以原始檔為準產生一個名稱空間
2 以剛剛產生的名稱空間為準,執行原始檔的程式碼
3 會在當前檔案中定義一個名字,這個名字就是模組名,用來引用模組中的名字

總結

複製程式碼

1 import包的時候 建議使用 from ...import的形式。這樣就不用sys.path.append(r'包的路徑')
2 
3 from可以用來指定路徑  import決定需要獲取的名稱空間
4 
5 執行檔案和包在同一資料夾下的時候 可以直接import
6 
7 執行檔案和包不在同一資料夾下的時候c:\a\b\c\d\ 執行檔案在a下  包在d下 那麼就需要在執行檔案中首先匯入sys.path.append(r'c:\a\b\c\d')
  包以及包所包含的模組都是用來被匯入的,而不是被直接執行的。而環境變數都是以執行檔案為準的

複製程式碼

 執行檔案呼叫包內名稱的方式決定了from 路徑結構

第一種

複製程式碼

1 執行檔案中
2 import a
3 a.f1()
4 a.f2()
5 a.f3()

6 a包 __init__中的程式碼
7 from .am1 import f1       #等同於絕對路徑from a.am1 import f1 
8 from .am2 import f2 9 from .b.bm1 import f3

複製程式碼

第二種

執行檔案中
import a.b.bm1
a.b.bm1.f3()

a包 __init__中沒有程式碼

第三種

1 執行檔案中
2 from a.b.bm1 import f3
3 f3()

4 a包 __init__中沒有程式碼

 第一種依賴包中__init__ ,第二種是不依賴__init__.