Python 13 模組和包

2022-08-04 01:15:17 字數 2562 閱讀 1513

在電腦程式的開發過程中,隨著程式**越寫越多,在乙個檔案裡**就會越來越長,越來越不容易維護。

為了編寫可維護的**,我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的**就相對較少,很多程式語言都採用這種組織**的方式。在python中,乙個.py檔案就稱之為乙個模組(module)。

使用模組有什麼好處?

最大的好處是大大提高了**的可維護性。

其次,編寫**不必從零開始。當乙個模組編寫完畢,就可以被其他地方引用。我們在編寫程式的時候,也經常引用其他模組,包括python內建的模組和來自第三方的模組。

所以,模組一共三種:

另外,使用模組還可以避免函式名和變數名衝突。相同名字的函式和變數完全可以分別存在不同的模組中,因此,我們自己在編寫模組時,不必考慮名字會與其他模組衝突。但是也要注意,盡量不要與內建函式名字衝突。

1importmodule1[, module2[,... modulen]

當我們使用import語句的時候,python直譯器是怎樣找到對應的檔案的呢?答案就是直譯器有自己的搜尋路徑,存在sys.path裡。12

['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu',

'/usr/lib/python3.4/lib-dynload','/usr/local/lib/python3.4/dist-packages','/usr/lib/python3/dist-packages']

因此若像我一樣在當前目錄下存在與要引入模組同名的檔案,就會把要引入的模組遮蔽掉。

1frommodnameimportname1[, name2[, ... namen]]

這個宣告不會把整個modulename模組匯入到當前的命名空間中,只會將它裡面的name1或name2單個引入到執行這個宣告的模組的全域性符號表。

1frommodnameimport*

這提供了乙個簡單的方法來匯入乙個模組中的所有專案。然而這種宣告不該被過多地使用。大多數情況, python程式設計師不使用這種方法,因為引入的其它**的命名,很可能覆蓋了已有的定義。

如果不同的人編寫的模組名相同怎麼辦?為了避免模組名衝突,python又引入了按目錄來組織模組的方法,稱為包(package)。

舉個例子,乙個abc.py的檔案就是乙個名字叫abc的模組,乙個xyz.py的檔案就是乙個名字叫xyz的模組。

現在,假設我們的abcxyz這兩個模組名字與其他模組衝突了,於是我們可以通過包來組織模組,避免衝突。方法是選擇乙個頂層包名,比如mycompany,按照如下目錄存放:

mycompany

├─ __init__.py

├─ abc.py

└─ xyz.py

引入了包以後,只要頂層的包名不與別人衝突,那所有模組都不會與別人衝突。現在,abc.py模組的名字就變成了mycompany.abc,類似的,xyz.py的模組名變成了mycompany.xyz

請注意,每乙個包目錄下面都會有乙個__init__.py的檔案,這個檔案是必須存在的,否則,python就把這個目錄當成普通目錄,而不是乙個包。__init__.py可以是空檔案,也可以有python**,因為__init__.py本身就是乙個模組,而它的模組名就是mycompany

類似的,可以有多級目錄,組成多級層次的包結構。比如如下的目錄結構:

mycompany

├─ web

│ ├─ __init__.py

│ ├─ utils.py

│ └─ www.py

├─ __init__.py

├─ abc.py

└─ utils.py

python13 引數 變數 拆包

在這一章中,我們會涉及另一種輸入引數的方法。我們可以把變數傳給指令碼 scrip ps python是一種指令碼語言,所以,指令碼是 py檔案的另一種說法。看下示例先ex13.py from sys import argv script,first,second,third argv print t...

python 13 內建函式與閉包

abs 返回絕對值 返回的是正數 enumerate 可迭代物件 序號起始值 列舉 預設起始值為0,返回的是元組形式 lst 11 22,33 print i for i in enumerate lst,1 1,11 2,22 3,33 max 可迭代物件 求最大值 min 可迭代物件 求最小值 ...

python 13 函式 物件導向

函式 允許遞迴 函式的定義分類 內建函式 標準庫函式 庫函式使用者自定義函式函式的定義和呼叫 使用def語句定義函式 def 函式名 引數列表 函式體 語句 形參之間用逗號做間隔 有沒有返回值的函式看函式有沒有return語句 練習,n階調和數 def myadd n sum 0.0 for i i...