[TOC] 模塊的四種形式 在python中,總共有以下四種形式的模塊: 1. 內置模塊:python解釋器啟動自帶的模塊,random / time …… 2. pip install 安裝的模塊 3. 自定義模塊:如果你自己寫一個py文件,在文件內寫入一堆函數,則它被稱為自定義模塊,即使用pyt ...
目錄
模塊的四種形式
在python中,總共有以下四種形式的模塊:
- 內置模塊:python解釋器啟動自帶的模塊,random / time ……
- pip install 安裝的模塊
- 自定義模塊:如果你自己寫一個py文件,在文件內寫入一堆函數,則它被稱為自定義模塊,即使用python編寫的.py文件
- 包:把一系列模塊組織到一起的文件夾(註:文件夾下有一個
__init__.py
文件,該文件夾稱為包)
import和from...import...
import 模塊
import time
這個代碼做了以下事情
- 開闢記憶體空間,記憶體空間命名為time
- 把time.py中的所有代碼讀入名稱空間,然後運行
- 通過time.方法名使用time模塊中的方法
from 模塊 import 方法
from time import sleep
- 開闢記憶體空間,記憶體空間命名為time
- 把time.py中的所有代碼讀入名稱空間,然後運行
- 把sleep()方法讀入當前文件中,因此可以直接使用sleep方法
如果想使用多個方法:
from time import sleep,time
導入所有功能:
from time import *
import與from...import的優缺點
import:
- 優點:永不衝突
- 缺點:每次導入多輸入幾個字元
from...import的優缺點:
- 優點:少輸入幾個字元
- 缺點:容易與當前執行文件中名稱空間中的名字衝突
迴圈導入
# m1.py
from m2 import y
x = 10
print('m1:', x, y)
- 創建m2的名稱空間
- 執行m2.py,將執行產生的名字丟到m2.py
- 在當前執行文件中拿到m2.x
# m2.py
from m1 import x
x = 20
print('m2:', x, y)
- 創建m1的名稱空間
- 執行m1.py,將執行產生的名字丟到m1.py
- 在當前執行文件中拿到m1.y
由於模塊永遠只會開闢一次空間,所有這樣不會永遠迴圈下去,一次就會報錯
解決方法
方案一:
# m1.py
x = 10
from m2 import y
print('m1:', x, y)
# m2.py
y = 20
from m1 import x
print('m2:', x, y)
方案二:
這個解決方法就是:函數定義階段只檢測語法,不執行代碼
# m1.py
x = 10
def f1():
from m2 import y
print('m1:', x, y)
f1()
# m2.py
y = 10
def f2():
from m2 import x
print('m2:', x, y)
f2()
註:模塊永遠只開闢一次;from m1 import 必須執行m1.py中所有代碼
模塊的搜索路徑
模塊其實就是一個文件,如果要執行文件,首先就需要找到模塊的路徑(某個文件夾)。如果模塊的文件路徑和執行文件不在同一個文件目錄下,我們就需要指定模塊的路徑。
模塊的搜索路徑指的就是在導入模塊時需要檢索的文件夾。
導入模塊時查找模塊的順序是:
- 先從記憶體中已經導入的模塊中尋找
- 內置(環境變數)
- 自定義模塊
python文件的兩種用途
python文件總共有兩種用途,一種是執行文件;另一種是被當做模塊導入。
編寫好的一個python文件可以有兩種用途:
- 執行文件,一個文件就是整個程式,用來被執行
- 模塊,文件中存放著一堆功能,用來被導入使用
# test123.py
def f1():
print('from f1')
f1()
# run.py
from test123 import f1
如果直接運行run.py會直接運行test123.py中的f1(),但是如果我們在test123.py中加上if`__name__=='__main__'這句話,則可以防止運行run.py時執行f1()。
__name__
=='__main__'
不成立,__name__
!='__main__'
當test123為模塊文件時,__
name__
等於文件名