模塊是什麼: ***** 模塊 是一系列功能的集合體 一個py文件就是一個模塊 一個函數就是一個功能 例如 A.py 文件名A.py 模塊名 A模塊有哪些來源 內置 第三方 自定義模塊有四種通用的類別: 1.自定義模塊 ***** (第三方模塊也屬於自定義 它是別的程序員寫的 ) 關注如何自定義 2.內置模塊 **** 是c語言寫的 而後鏈接到python解釋器中 例如 time模塊 關注如何使用 3.已經編譯爲DLL c或c++ *** 不須要知道怎麼來的 會用就行 4.包 ***** 包其實是包含一堆模塊的文件夾 以後詳細將 對於這四種模塊 它們的使用方式 是一致的如何定義模塊:***** 建立一個py文件 把你的功能寫到文件中爲什麼用模塊: 1,使用內置和第三方的模塊:拿來主義能夠極大地提升開發效率 2,使用自定義模塊:爲了減小代碼冗餘如何使用模塊:***** 大前提:使用模塊必須區分開誰是執行文件,誰是被導入的模塊 import 模塊名 使用:必須加前綴(模塊名.) 優勢:指名道姓地向某一個模塊的名稱空間要名字,確定不會與當前執行文件名稱空間中的名字衝突 缺點:必須加前綴,不夠簡潔 首次導入模塊發生3件事(import spam): 1. 產生一個模塊的名稱空間 2. 執行被導入spam.py內的代碼,將執行過程當中產生的名字丟存放於模塊的名稱空間中 3. 在當前執行文件中拿到一個模塊名,該名字是指向模塊的名稱空間的 from 模塊名 import名字 使用:直接使用名字 優勢:無需加前綴,使用更爲簡潔 缺點:容易與當前執行文件名稱空間中的名字衝突 首次導入模塊發生3件事(from spam import money): 1. 產生一個模塊的名稱空間 2. 執行spam.py內的代碼,將執行過程當中產生的名字丟存放於模塊的名稱空間中 3. 在當前執行文件中拿到一個名字money,該名字直接指向模塊的名稱空間的那個money的內存地址 注意: 函數的做用域關係在定義階段就已經固定死了,與調用位置無關簡單的說其實就是獲得了一個名稱 這個名字指向被導入文件一旦有了這個名稱咱們就能夠經過這個名稱找到對應的命名空間中的全部名稱import 的其餘寫法 ***** 1.import xxx as xxx 給模塊取別名 用於簡化書寫 6 from xxx import xx as xx 取別名 2.import xxx,xxxx 一次導入多個模塊 4.from xxx import xxx,xxx,xx 從模塊中導入多個名稱 3.from xxx import xxx 從模塊中導入某個名字到當前名稱空間 注意 要避免名稱衝突 若是衝突了 按照就近查找原則 5.from xxx import * 從模塊中導入全部名稱 __all__用於控制 使用者可使用哪些名稱 from 和 import 除了導入的名稱 不一樣 其餘特性一致思考:在模塊的使用.py文件中加入:import spamimport spamimport spamimport spam問:"from the spam" 輸出幾回?答案是1次: 模塊的中代碼僅在首次導入時執行一次執行文件和被導入的模塊的命名空間 是相互獨立的 **** 在被導入模塊中 全部的名字使用的都是本身空間中的 和調用者無關py文件的兩種執行方式 ***** 1.做爲執行文件 (右鍵run) 2.做爲模塊被導入 __name__ 這個名稱 能夠獲取當前執行狀態 若是是__main__ 說明當前是執行文件 不然 說明是做爲模塊 因而乎有了如下代碼 if __name__ == "__main__": print("做爲執行文件") else: print("做爲模塊導入了")模塊的搜索路徑的優先級 內存中已經加載過的 -> 內置模塊 -> sys.path # 第一個值是當前執行文件所在的文件夾 sys.modules 查看內存中已加載的 其中只有sys.path 咱們能夠操做 一般咱們會將模塊的路徑手動添加到sys.path中# 方案一:# import sys# sys.path.append(r'D:\脫產三期視頻\day16\03 模塊的搜索路徑1\dir1')# print(sys.path)# import m1# m1.f1()# 方案二:# from dir1 import m1# m1.f1()from dir1.dir2 import m2m2.f2()