用python編寫了乙個工程,如果import了自定義的第三方模組,在第一次執行後,發現工程根目錄下生成了乙個__pycache__資料夾,裡面是和py檔案同名的各種以.cpython-37.pyc結尾的檔案。
cpython-37各項意思,cpython代表的是c語言實現的python直譯器,-37代表的是3.7版本。
如果import多個自定義的第三方模組,則生成多個以模組命名的pyc
至於pyc,是相當於python的編譯檔案,python位元組碼檔案,執行速度快於py檔案,不能文字檢視內容,可以在發布時用pyc來代替原始碼py檔案,隱藏原始碼
將py原始碼檔案編譯成位元組碼:
python -m py_compile main.py
模組的呼叫
python匯入模組時,實際上會把被匯入的模組執行一遍。例如呼叫test.py模組:
def haha():
print("haha")
haha()
主程式main.py:
import test
print("good")
執行結果:
haha
good
如何才能只是單純呼叫而不執行被呼叫模組的**呢?要想被呼叫模組**不被執行,可以使用__name__。如果不涉及模組匯入,name__的值就是__main,如果模組被匯入引用的話,那麼這個模組內的__name__值就是檔案的名字(不帶.py),例如test.py:
def haha():
print("haha")
haha()
print(__name__)
執行結果為:
haha
__main__
如果test被匯入引用的話,例如test2:
import test
print("good")
執行結果為:
haha
test
good
在被呼叫的模組中,可執行**前加上ifname== 『main』:這麼一句判斷,被呼叫的模組的**就不會被執行。
python程式執行時不需要編譯成二進位制**,而直接從原始碼執行程式。簡單來說是,python直譯器將原始碼轉換為位元組碼,然後再由直譯器來執行這些位元組碼。
直譯器的具體工作:
完成模組的載入和鏈結;
將源**編譯為pycodeobject物件(即位元組碼),寫入記憶體中,供cpu讀取;
從記憶體中讀取並執行,結束後將pycodeobject寫回硬碟當中,也就是複製到.pyc或.pyo檔案中,以儲存當前目錄下所有指令碼的位元組碼檔案。
之後若再次執行該指令碼,它先檢查【本地是否有上述位元組碼檔案】和【該位元組碼檔案的修改時間是否在其原始檔之後】,是就直接執行,否則重複上述步驟。
第一次執行**的時候,python直譯器已經把編譯的位元組碼放在__pycache__資料夾中,這樣以後再次執行的話,如果被呼叫的模組未發生改變,那就直接跳過編譯這一步,直接去__pycache__資料夾中去執行相關的*.pyc檔案,大大縮短了專案執行前的準備時間。
漲知識之Python中zip函式
和名字一樣,zip函式就是用來打包和解包的函式,可接受2個以上可迭代的變數,輸出對應位置組成元組後的迭代型別。例如 a a b c b 4,5,6 zip a,b list zip a,b a 4 b 5 c 6 tuple zip a,b a 4 b 5 c 6 在這裡如果各迭代變數長度不一致時也...
漲知識啦 20200802
01 tar格式 解包 tar xvf filename.tar 打包 tar cvf filename.tar dirname 注 tar是打包,不是壓縮!02 gz格式 解壓1 gunzip filename.gz 解壓2 gzip d filename.gz 壓 縮 gzip filename...
pyhton001 基礎知識
建議使用3.5以上,這邊我使用的是3.7.8。終端輸入python 進入直譯器視窗。猶如菜譜,如何完成特定的任務。從本質上說,編寫電腦程式就是使用計算機能夠理解的語言 python 描述一種演算法。這種成為程式,主要由表示式和語句組成。例如2 2 簡單的表示式是使用運算子和函式將字面值組合起來得到的...