模塊就是一個包含了python定義和聲明的文件,文件名就是模塊的名字加上.py後綴,整體來講,import加載的模塊一共分紅四個通用的類別:python
1,使用python編寫的py文件
json
2,已被變異爲共享或者DLL或者C++的擴展dom
3,包好一組模塊的包spa
4,使用c編寫並鏈接到python解釋器的內置模塊code
爲何要使用模塊?爲了咱們寫的代碼能夠重用不至於把全部的代碼都寫在一個文件內,當項目規模比較小的時候,徹底可使用一個py搞定整個項目的開發,可是若是是一個很是大的項目,此時就必需要把相關的功能進行分離,方便咱們平常維護,以及新項目的開發,導入模塊有兩種方式:blog
1,import 模塊開發
2,from xxx import xxxclass
首先建一個tang.py文件。 import
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,最後引入自定義的模塊
其實就是選擇性的導入
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) #此時結果是‘靜靜’
還有一種特殊的寫法,from xxx import *,此時也是把模塊中的全部內容導入。注意:若是所導的模塊中沒有寫__all__則默認全部內容導入,但若是寫了__all__,此時導入的內容就是__all__列表中列出來的全部名字
tang.py
__all__=['name']
name='糖糖' def xihuan(): print('%s喜歡看小說'%name) print('她喜歡畫畫') print('她喜歡喝冰紅茶') print('她喜歡吃胡豆') www.pyfrom tang import *print(name) #結果是‘糖糖’xihuan() #報錯