一,模塊
模塊就是一個包含了python定義和聲明的文件,文件名就是模塊的名字加上.py后綴,總體來說,import加載的模塊一共分成四個通用的類別:
1,使用python編寫的py文件
2,已被變異為共享或者DLL或者C++的擴展
3,包好一組模塊的包
4,使用c編寫並連接到python解釋器的內置模塊
為什么要使用模塊?為了我們寫的代碼可以重用不至於把所有的代碼都寫在一個文件內,當項目規模比較小的時候,完全可以使用一個py搞定整個項目的開發,但是如果是一個非常大的項目,此時就必須要把相關的功能進行分離,方便我們日常維護,以及新項目的開發,導入模塊有兩種方式:
1,import 模塊
2,from xxx import xxx
二,import
首先建一個tang.py文件。
name='糖糖' def xihuan(): print('%s喜歡看小說'%name) print('她喜歡畫畫') print('她喜歡喝冰紅茶') print('她喜歡吃胡豆') xihuan()
接下來,再建一個py文件,在這個文件中導入tang模塊。
import tang #此時運行新建的py文件時,會默認執行tang模塊中的代碼
import tang #不管后面調用幾次,都是沒有效果的,模塊是不能夠重復導入的
import tang
print(tang.name)
tang.xihuan() #在引入模塊后,就可以調用tang模塊中的屬性和方法
導入模塊的時候都做了些什么?首先,在導入模塊的一瞬間,python解釋器會先通過sys.mudules來判斷該模塊是否已經導入過了,如果導入過了就不在導入,如果該模塊還沒導入過,則系統會做三件事:
1,為導入的模塊創立新的名稱空間
2,在新創建的名稱空間中運行該模塊中的代碼
3,創建模塊的名字,並使用該名稱作為該模塊在當前模塊中引用的名字
注意:由於模塊在導入的時候會創建自己的名稱空間,所以,我們在使用模塊中的變量的時候一般是不會產生沖突的。
import tang name='糖兒' tang.xihuan() #結果還是用的是tang中的‘糖糖’
注意:在模塊中使用global,我們之前說global表示把全局的內容引入進到局部,但是,這個全局指的是py文件,換句話說,global指向的是模塊內部,並不會改變外部模塊的內容
tang.py
name='糖糖'
def xihuan():
global name
name='糖糖糖'
print(name)
111.py
import tang
name='唐兒'
tang.xihuan() #結果是‘糖糖糖’
print(name) #結果是‘唐兒’
特別要注意,如果我們在不同的模塊中引入同一個模塊,並且在某一個模塊中改變了被引入模塊中的全局變量,則其他模塊看到的值也隨之改變,原因是python的模塊只會引入一次,大家共享同一個名稱空間
tang.py name='糖' 111.py import tang tang.name='糖糖'
#if __name__ == __main__: 此時,只有在111py文件為執行文件時才會改變值
#tang.name='糖糖’
112.py import tang import 111 print(tang.name) #結果是‘糖糖’
113.py
import tang
import 111
#print(tang.name) #而此時,結果就不在是‘糖糖’,而是‘糖’
我們可以對引入的模塊重新命名,還可以一次性引入多個模塊
import tang as t print(t.name) #這樣也行的
import time,random,json,tang #一次引入多個,但引入的順序是有規定的
正確的導入模塊的順序:
1,所有的模塊導入都要寫在最上面,這是最基本的
2,先引入內置模塊
3,在引入擴展模塊
4,最后引入自定義的模塊
三,from xxx import xxx
其實就是選擇性的導入
tang.py
name='糖糖' def xihuan(): print('%s喜歡看小說'%name) print('她喜歡畫畫') print('她喜歡喝冰紅茶') print('她喜歡吃胡豆') xihuan()
from tang import xihuan
xihuan() #直接使用就可以,不用tang.
但是這有個坑,當我們從一個模塊中引入一個變量的時候,如果當前文件中出現了重名的變量時,會覆蓋掉模塊中引入的那個變量
tang.py
name='糖糖' def xihuan(): print('%s喜歡看小說'%name) print('她喜歡畫畫') print('她喜歡喝冰紅茶') print('她喜歡吃胡豆') xihuan()
from tang import name
name='靜靜'
print(name) #此時結果是‘靜靜’
所以,不要重名,切記,不要重名!不僅僅是變量名不要重復,我們創建的py文件的名字不要和系統內置的模塊重名,否則,引入的模塊都是python內置的模塊。
還有一種特殊的寫法,from xxx import *,此時也是把模塊中的所有內容導入。注意:如果所導的模塊中沒有寫__all__則默認所有內容導入,但如果寫了__all__,此時導入的內容就是__all__列表中列出來的所有名字
tang.py
__all__=['name']
name='糖糖' def xihuan(): print('%s喜歡看小說'%name) print('她喜歡畫畫') print('她喜歡喝冰紅茶') print('她喜歡吃胡豆')
www.py
from tang import *
print(name) #結果是‘糖糖’
xihuan() #報錯