python中匯入模組

2022-09-10 20:36:16 字數 4290 閱讀 7177

在程式開發的過程中,隨著**量越來越大,我們可以把完成某個功能的函式進行分組,放在乙個.py檔案裡邊,這樣的乙個.py檔案稱為乙個module,這樣做最大的好處就是提高**的可重用性和可維護性,新的開發可以呼叫原來模組的函式,我們經常用的python內建模組和第三方類庫就屬於module。簡單來說,乙個.py檔案就是乙個module。

比如說,我們有乙個計算斐波那契數列的module,這個module用來計算斐波那契數列,這個module使用兩種方式來計算斐波那契數列,一種使用返回list方式,一種使用生成器方式。這些**儲存在乙個名為fibo.py的檔案中,**如下。

def

fib_list(n):

result =

k,a,b = 0,0,1

while k

a,b = b,a+b

k += 1

return

result

deffib_yield(n):

k,a,b = 0,0,1

while k

yield

b a,b = b,a+b

k += 1

fibo.py包含兩個計算斐波那契數列的函式,一種使用list方式,比較耗費記憶體,另外一種使用生成器方式,該函式接收引數n,用來計算斐波那契數列的前n項。

在開發的過程中如果想使用某個module,必須首先匯入該模組,匯入模組使用關鍵字import,使用import匯入模組的時候有以下幾種方式。

(1) 命令格式:import module

比如我們在main.py中想使用剛才定義的fibo.py模組中的函式來計算斐波那契數列。main.py函式的**如下:

import

fibo

l = fibo.fib_list(10)

print

(l)for e in fibo.fib_yield(10):

print(e, end = "

-")

執行結果如下:

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

1-1-2-3-5-8-13-21-34-55-

匯入module以後,可以通過modulename.***

的方式來訪問模組中對應的函式和變數,這裡只有函式,也可以訪問變數。這類似於類去訪問乙個成員函式。使用modulename.***

的這種方式可以很清晰的看到變數或者函式的作用範圍。這樣即使匯入的模組中具有同名的函式或者變數,也不會產生衝突。使用這種方式還有以下幾種變形:

(1) import

module1,module2,...

#使用這種方式一次性可以匯入多個模組

(2) import

moudle as alias

#使用這種方式將給匯入的模組起了乙個別名,後邊呼叫的時候使用alias.***代替module.***

(2) 命令格式:from moudle import ***

使用上述匯入模組的方式其實是把模組中的所有內容都匯入進來,呼叫的時候要通過modulename.***

來呼叫,如果只想使用模組中的某個函式,可以通過from moudle import ***

的方式來匯入。例如,我現在只想使用fibo模組中的fib_list函式,可以使用以下方式。

from fibo import

fib_list

l = fib_list(10)

print(l)

使用這種方式匯入模組時,在使用模組中的變數或者函式的時候,前邊不用加模組的名字,而是直接像呼叫普通函式那樣來呼叫模組中的函式,這樣相比於第一種形式來說更加簡便。但是這種匯入方式在模組中已經存在相同名字,或者匯入不同模組中的同名函式或者變數的時候會存在問題,後匯入的名字會隱藏前邊已經存在的名字。這個問題在下面的from module import *的方式中會解釋。這種匯入模組的方式還有以下的變形:

from module import *

#這種方式將模組中所有的變數和函式匯入進來,除了以下劃線(_)開頭的名字

在python中並不推薦使用這種方式,因為你並不知道module中包含什麼名字,假如在這之前你的程式中已經包含了乙個名字為aaa的函式或者變數,那麼使用這種方式匯入的時候,你並不知道實際匯入了什麼變數或者函式,如果恰好這個模組中也有乙個名字為aaa的變數或者函式,那後邊匯入的這個aaa就會覆蓋前邊已經存在的aaa。例如,匯入fibo.py後,又用from module import *的方式匯入了fibo1.py模組,fibo1.py的**如下。

def

fib_list(n):

result =

k,a,b = 0,0,1

while k

a,b = b,a+b

k += 1

print("

this is fibo1.fib_list function")

return result

修改main.py**如下。

from fibo import

fib_list

from fibo1 import *l = fib_list(10)

print

(l)#

執行結果

#this is fibo1.fib_list function

#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

由結果可見,程式執行的fib_list實際上是fibo1.fib_list,這是因為在匯入fibo1模組中的名字後,fibo1中的fib_list隱藏了從fibo.py中匯入的fib_list函式,所以要謹慎使用這種匯入方式,因為你根本不知道你匯入了什麼東西。對於模組比較多的程式,還是使用方式(1)會好一點,這樣不會造成名字衝突。

去**搜尋module

當我們匯入乙個模組的時候,系統去**尋找我們要到如的模組呢?python在匯入系統模組的時候,python搜尋模組的路徑可以通過sys.path來檢視,例如,我在main.py中列印目前搜尋模組的路徑。

from fibo import

fib_list

import

sysprint

(sys.path)

#執行結果

#[ 'c:\\users\\x2382\\pycharmprojects\\fibo', main.py所在的目錄,就是當前源程式的根目錄

#'c:\\users\\x2382\\pycharmprojects\\fibo',##

####

####

"""

所以,如果想要自己定義的模組被搜尋到,就要把模組放在這些目錄,或自己手動修改sys.path這個變數,在這個變數中增加自己想要搜尋的目錄。

.pyc檔案是什麼鬼?

.pyc檔案是有.py檔案經過編譯得到的,稱為位元組碼檔案,這個檔案經過python虛擬機器以後可以變成可執行的二進位制檔案。.pyc檔案和其對應的.py檔案功能完全一樣,唯一不同的是.pyc是經過編譯的,生成的是位元組碼檔案。使用.pyc檔案有兩個好處:
(1) 首先,使用.pyc檔案可以提高程式載入的速度,例如在main.py每次匯入fibo模組的時候,如果使用源**,載入速度比較慢,使用.pyc檔案可以提高載入的速度
(2) .pyc檔案是跨平台的,也就是說在window上編譯出來的.pyc檔案在linux系統上也是可以用,如果並不想公開源**,使用.pyc檔案是一種很好的選擇。
基於以上原因,python在每次執行import模組到如的時候,都會生成乙個.pyc檔案。

例如我的源程式根目錄下回生成__pycache__目錄,這個目錄裡邊就是經過編譯的.pyc檔案,這個.pyc檔案按照module.version.pyc

的格式來命名,version指的是當前使用python的版本號,如下所示。

那如果源**修改了怎麼辦,python在每次匯入模組的時候,會檢查源程式和其對應.pyc檔案的時間戳(就是檔案的修改時間),如果兩個檔案的時間戳不同,python就會重新編譯原始檔,生成新的.pyc檔案,如果兩個檔案時間戳相同,就直接載入.pyc檔案。

總結:什麼是module--->怎麼匯入module--->module放在什麼地方--->優化module匯入的過程(.pyc檔案)

python 中匯入其他模組

在寫乙個稍微大型的python工具或者專案的時候,不可避免的需要大量的匯入自定義的模組以及系統模組,由於多層次的目錄結構,使得新手再匯入自定義模組的經常出現 modulenotfounderror no module named異常 既找不到該模組的問題 基礎概念 模組 模組一般情況下是指乙個.py...

python中匯入模組的注意點

1.import 和 from import 的區別 import module匯入模組 語句執行完後會建立乙個新的命名空間,在該命名空間中執行相應的函式。執行時,需要的變數 函式和類名前需要加字首 模組名.from module import 匯入模組 是將模組的定義匯入到當前的命名空間,此時不需...

pycharm中匯入自寫模組時,模組下出現紅線

問題描述 在pycharm中匯入自己寫的模組時,得不到智慧型提示,並在模組名下出現下紅線,但是 可以執行,錯誤提示為下圖所示 原因 出現 以上情況,是因為檔案目錄設定的問題,pycharm中的最上層資料夾是專案資料夾,在專案中導包預設是從這個目錄下尋找,當在其中再次建立目錄,目錄內的py檔案如果要匯...