python首行代碼import *,from * import * 解析

python代碼,一般第一行代碼都是import *或from * import *,作用是導入功能模塊,然後利用模塊內的函數編寫代碼,減少大量的代碼編寫時間,是python的一大特色。但是,在實際寫碼過程中,初學者往往因對import * 處於一知半解,導致經常出現一些莫名其妙的問題,嚴重影響學習心情和效果。本文特對此進行詳細解讀,幫助避坑。

python首行代碼import *,from * import * 解析

導入的是什麼?

用import *導入時,*代表的是模塊,也就是說,import導入的是模塊,不是包、類、函數

用from * import *時,第一個*代表的也是模塊,第二個*代表的則是模塊內的類或函數。意思是從模塊裡導入其中的某個函數或類。具體下面有詳解。

什麼叫模塊

模塊是含有類或函數的py文件,也就是說,我們寫的每一個py文件,都是模塊。只不過專門的模塊文件裡面必須有函數或類,而我們一般寫的py文件,是直接寫功能代碼,不一定需要有函數或類。舉個例子:

不含函數直接寫功能代碼的Py文件:

print('hellow')

運行結果:hellow

含函數的功能模塊Py文件:

def打印():print('hellow')if__name__=="__main__":打印()

運行結果:hellow

其中,def 打印()就是定義名為“打印”的函數。通過if __name__ == "__main__":在本模塊文件內調用“打印”函數,執行函數內的“print('hellow')”代碼。為何要用if語句,本號在 文章裡已經講解,有疑問的可移步查看。

python首行代碼import *,from * import * 解析

將上面含函數的功能模塊py文件取文件名為“試驗”,保存後得到“試驗.py”文件,就是一個可供其他py文件導入調用的模塊。調用方法為:

import試驗試驗.打印()

運行結果:hellow,注意調用是文件後綴.py不要寫,只寫文件名。

另一種調用方法為:

from試驗import打印打印()

運行結果:hellow,from 試驗 import 打印:意思就是從“試驗”模塊文件裡導入“打印”函數到本文件,導入後,就可直接使用函數名,函數名前面不加模塊名。

專門用作模塊的py文件,一般沒有if語句,只能被調用,獨自不能運行。比如上面的“試驗.py”文件,如果我們刪掉if語句,變成下面的代碼:

def打印():print('hellow')

直接運行得不到hellow的結果,用上面的兩個調用方法,則不受影響。

python首行代碼import *,from * import * 解析

什麼叫函數

通過上面的例子,我們不僅知道了py文件都是模塊文件,而且知道了在調用模塊時,最終使用的是模塊文件裡的函數,比如上面案例裡的“打印”就是函數。所以,函數其實就是包含了具體功能代碼,用def 函數名()定義的功能代碼塊。

在模塊導入方面,類的性質和函數是一樣的,只不過類有其專有的屬性和方法,此處不細講。

什麼叫包

我們知道了import * 後面的 * 號代表的都是模塊,但有時候我們會遇到這種用法:

importtkinter.filedialogtkinter.filedialog.askopenfilenames(filetypes=[('excel文件','.xlsx')])

import後面代碼的中間有個小點,這就是導入包內模塊的用法:小黑點前面是包的名稱,後面是包含在包內的模塊名稱。

tkinter:就是一個功能包,包內含有多個子包或模塊。

filedialog:是包含在tkinter包內的其中一個模塊。

askopenfilenames:是包含在filedialog模塊內的其中一個函數。

初學者有時候依葫蘆畫瓢會弄成這種用法:

importfiledialog.askopenfilenames

這就是誤將函數作為模塊進行導入了,程序會報錯。如果真想導入askopenfilenames函數,可用form import用法,但注意,模塊名必須帶上包名,寫成下面的樣子:

formtkinter.filedialogimportaskopenfilenames

若漏了包名:formfiledialogimportaskopenfilenames,也會報錯

瞭解這些概念和用法後,嚴格按這個用法,基本就沒有問題了。但有時也會遇到報錯,這是因為模塊導入順序的問題。

模塊分類

python的模塊函數分4類:

1、python自帶函數:不需進行import導入可直接使用,比如print()函數,就是直接用。

2、python標準函數庫:安裝Python時,會隨帶著安裝一些標準函數,在python安裝路徑下的lib文件夾裡,打開lib文件夾會發現很多py文件,這些就是標準函數,通過import導入後就可使用。

python首行代碼import *,from * import * 解析

3、第三方庫:有很多功能強大的模塊函數,沒有在標準庫裡,比如操作excel用到的openpyxl模塊。這時用import導入時,會提示找不到這個模塊文件。需要將其提前下載安裝到lib文件夾裡,然後再導入。下載方法為:打開cmd,輸入pip install openpyxl,回車即可。

4、自己寫的py文件模塊:自己寫的含有def 函數的py文件,可作為模塊導入使用。前面的含有打印函數的試驗.py文件,就是使用自建模塊的例子。

import試驗試驗.打印()

模塊導入順序

我們知道,python標準庫裡有很多模塊文件,比如下面的這個文件:

python首行代碼import *,from * import * 解析

其實這是我自建的一個模塊文件,功能是拆分合並excel文件。導入該功能模塊後,拆分或合併excel文件的代碼為:

importcfjoinimporttkinter.filedialogasaif__name__=="__main__":ff=a.askopenfilenames(filetypes=[('excel文件','.xlsx')])cfjoin.breakfile(ff)#拆分選中的excel文件

在運行時,上面的代碼有時候可以,有時候卻報錯,對新手來說,這是很費解的。但其實,問題很簡單。檢查一下,是不是運行的Py文件所在文件夾裡是否也存在一個與導入的模塊文件同名的cfjoin.py文件,如果有,而且這個文件裡的內容與lib文件夾裡的cfjoin.py內容不同。則運行時會報錯,如果沒有、或者與lib文件夾裡的cfjoin.py完全相同,則運行正常。這就是模塊導入順序造成的問題。

python首行代碼import *,from * import * 解析

python導入模塊時,不是直接從lib庫裡導入,而是先從當前py文件所在文件夾裡找需要導入的模塊文件,找到後則導入使用;如果沒找到,再到lib文件夾裡找,如果還沒找到,則提示未找到。如果當前文件夾下某個py文件名正好與lib庫裡的模塊文件同名,則會導入當前文件夾下的py文件而不是導入lib庫裡的模塊文件,導致出錯。避免的方法就是將自己寫的py文件取名不要與一些常用lib庫模塊文件同名。

另外,python導入模塊時只從當前文件夾下和lib庫裡導入,如果模塊文件放在其他位置,則會提示找不到模塊。移到當前文件夾或lib庫中任何一個位置就可以了,如果是成熟的py功能文件,最好放在lib庫裡,可以避免編輯器誤報錯誤。

比如,我上面的cfjoin.py文件,如果我將其放在當前文件夾下,刪掉lib庫裡的該文件,上面的拆分excel表格代碼運行功能沒任何問題,但編輯器裡會報錯:

python首行代碼import *,from * import * 解析

雖然是誤報錯,但對強迫症患者來說,看到那些黃波浪號會很不好受。這時,我們將cfjoin.py文件移到lib庫裡就可以了。

本文就介紹到這,感覺還有點作用的,敬請轉發收藏點贊!


分享到:


相關文章: