模塊就是py
文件,一堆函數的集合體。dom
實現一些功能,使代碼邏輯更清晰函數
使用 import 和 from...import...導入code
import sleep
排序
導入多個模塊 :ip
import time, os, sys
內存
使用:utf-8
time.sleep(1)
作用域
導入time模塊解釋器發生的三件事情:get
time.py
中全部代碼讀入名稱空間並運行代碼from time import sleep
導入多個方法 :
from time import sleep, time
from time import *
使用:
sleep(1)
導入time模塊解釋器發生的三件事情:
相同點:
不一樣點:
import 須要加模塊名前綴,from...import...不須要加
import | from...import... | |
---|---|---|
優勢 | 變量名發生衝突概率小 | 調用方便 |
缺點 | 調用麻煩 | 變量名發生衝突概率大 |
__all__ = ["a","f1"]
在使用from test2 import *
導入模塊的時候,
在被導入的模塊中文件頭添加如上代碼,表示只能使用被導入的模塊的方法。其餘導入方式對此方法失效
# cat test1.py # coding=utf-8 from test2 import * print(a) # 正常調用 # 1 f1() # 調用報錯 # NameError: name 'f1' is not defined
# cat test2.py # coding=utf-8 __all__ = ["a",] # 限制只能使用 a 變量 a = 1 def f1(): print("from f1")
演示一個現象:
# cat m1.py # coding=utf-8 from m2 import y x = 1 print("m1111111:",x,y) # ImportError: cannot import name 'y' # 建立m2的名稱空間 # 執行m2.py,將執行產生的名字丟到m2.py # 在當前文件中拿到m2.x
# cat m2.py from m1 import x y = 2 print("m2222222:",x,y) # ImportError: cannot import name 'x' # 建立m1的名稱空間 # 執行m1.py,將執行產生的名字丟到m1.py # 在當前執行文件中拿到m1.y
上述狀況:
m1.py執行,產生m2的名稱空間,m2.py並運行代碼,遇到import語句產生m1的名稱空間,名稱空間在內存中只產生一次,而後運行下面的代碼,m1定義變量x = 1 print("m1111111:",x,y)
,發現找不到y的變量 因此報錯,m2.py運行結果亦是如此。
解決方案一:
將變量寫在文件開頭
# cat m1.py # coding=utf-8 x = 1 from m2 import y print("m1111111:",x,y) # cat m2.py # coding=utf-8 y = 1 from m1 import x print("m2222222:",x,y)
解決方案二:
將導入模塊代碼包在一個函數裏,函數執行只檢測語法,不執行代碼
# cat m1.py # coding=utf-8 def m1(): from m2 import y print("m1111111:", x, y) x = 1 m1() # cat m2.py # coding=utf-8 def m2(): from m1 import x print("m2222222:", x, y) y = 1 m2()
上述問題我以爲在座的聰明絕頂的人不會犯這種錯誤,演示代碼只不過是演示這種現象,之後萬一出現了知道怎麼回事。
以前咱們講過變量名的搜索路徑是 從當前位置--》局部--》全局--》內置
那麼模塊的搜索路徑是什麼呢?好比說咱們自定義了一個和內置模塊名字同樣的模塊會先去哪裏找呢?
# coding=utf-8 import time ''' 內存 內置 自定義 ''' import test # 自定義一個test模塊並導入 print(test.a) # 正常使用模塊內的方法 time.sleep(10) # 爲了驗證內存 和 自定義模塊的順序,可讓程序睡會~ 期間咱們把test.py文件刪掉再看現象 print(test.a) # 發現還能繼續打印,也就是說還在內存中 # 那麼搜索順序能夠先排序: # 內存 --》 自定義 import requests # 使用內置模塊 print(requests.get("http://www.baidu.com")) time.sleep(10) # 依然程序睡眠時間,刪除requests模塊 print(requests.get("http://www.baidu.com")) # 發現還能繼續打印,也就是說還在內存中 # 那麼搜索順序能夠先排序: # 內存 --》 內置 # 最後模塊搜索順序: # 內存 --》 內置 --》 自定義
def run(): print("run....") if __name__ == '__main__': run() # 噹噹前文件爲模塊文件導入時,__name__等於文件名,#__name__ == '__main__'不成立(__name__ != '__main__)',因此不會運行下面的函數 # __name__是每一個文件獨有的,當該文件做爲執行文件運行時,__name__等於'__main__';當該文件做爲模塊文件導入時,__name__等於文件名