[TOC] 模塊 什麼事模塊 模塊:是一系列功能的集合體,而函數是某一功能的集合體,因此模塊可以看成是一堆函數的集合體。一個py文件內部就可以放一堆函數,因此一個py文件就可以看成一個模塊。 模塊的三種來源: 1:內置(python解釋器自帶的) 2:第三方的(別人寫的) 3:自定義的(自己寫的) ...
目錄
模塊
什麼事模塊
模塊:是一系列功能的集合體,而函數是某一功能的集合體,因此模塊可以看成是一堆函數的集合體。一個py文件內部就可以放一堆函數,因此一個py文件就可以看成一個模塊。
模塊的三種來源:
1:內置(python解釋器自帶的)
2:第三方的(別人寫的)
3:自定義的(自己寫的)
模塊的四種表現形式:
1:使用python編寫的py文件
2:已被編譯為共用庫或DLL的C或C++擴展
3:內置模塊,使用C編寫並鏈接到python解釋器的內置模塊
4 :把一系列模塊組織到一起的文件夾(文件下游一個__init__.py文件,該文件稱之為包。)
為什麼要用模塊
1:用別人寫好的模塊(內置,第三方):典型的拿來主義,極大的提高了開發效率。
2:使用自己寫的模塊:將我們自己程式中用到的公共功能,寫入一個python文件,然後程式的各部分組件可以通過導入的方式來引用自定義模塊的功能。
如何使用模塊
一般使用 import 和 from...import... 導入模塊。
# mod.py 文件
print('from mod')
hobby = 'read'
def func1():
print('from mod func1',hobby)
def func2():
print('from mod func2')
def func3():
global hobby
hooby = 'run'
import 模塊名
# run.py 文件
import mod # 導入文件名時,不要加 py
hobby = 'play'
mod.func1() # ---> 需要引用模塊功能時,需要 (模塊名.模塊文件中的名字) 使用
mod.func2()
mod.func3()
print(hobby) # ---> 不使用 (模塊名.模塊文件中的名字),只會在自己名稱空間去尋找所對應的值
# from mod
# from mod func1 read
# from mod func2
# play
- import 首次導入模塊發送了3件事:
1:執行模塊文件。
2:運行模塊文件中的代碼,將產生的名字與值存放到當前模塊的名稱空間中。
3:在執行文件中產生一個指向被導入模塊的名稱空間的名字。
2:執行模塊對應的文件
註意:多次導入不再執行模塊文件,會沿用第一次導入的成果。
- 當模塊文件名過於複雜時
# 假設需要導入的模塊 xxooaatt.py
import xxooaatt as x # 導入模塊名後加 as 加你認為方便使用時的名
# xxooaatt.模塊文件中的名字
# 現在只需要:
# x.模塊文件中的名字
- 導入多個模塊
# 導入多個模塊,用逗號隔開
import time,sys,os # 不推薦使用
from 模塊名 import 具體的功能
from mod import hobby
# 導入模塊後,就類似於
# hobby = 'run' 提前定義過了
hobby = 'play' # 覆蓋
print(hobby)
# from mod
# play
- from...import... 首次導入模塊發生了3件事:
1:執行模塊文件。
2:運行模塊文件中的代碼,將產生的名字與值存放到當前模塊的名稱空間中。
3:在當前執行文件的名稱空間中拿到一個名字,該名字直接指向模塊中的某一個名字,意味著可以不用加模塊名這個首碼而直接使用。
- 優點:不用加首碼,代碼更加精簡。
- 缺點:不加首碼容易與當前執行文件中名稱空間中的名字衝突。
import 和 from...import 的異同之處
相同點:
1:兩者都會執行模塊對應的文件,兩者都會產生模塊的名稱空間。
2:兩者調用功能時,需要跑到定義時尋找作用域關係,與調用位置無關。
不同點:
1:import 需要加首碼,from...import... 不需要加首碼。
__all__ 使用方法
# 在被導入的模塊中使用,限制其導入功能的個數
__all__ = ['hobby'] # 只允許導入 honny
__all__ = []
# 不添加內容,則預設可以導入全部
__name__使用方法
- 當文件被當作執行文件執行的時候__name__列印的結果是__main__
- 當問及被當作模塊導入的時候__name__列印的結果是模塊名(沒有尾碼)
# mod.py 文件
def func():
print('from mod func')
print(__name__)
if __name__ == '__main__': # 快捷方式輸入 main 回車
func()
# run.py 文件
import mod
print(__name__)
# mod # 文件名
# __main__