python複雜程式的組織講座

2021-10-09 12:02:17 字數 4372 閱讀 3381

當程式簡單時,將**寫進乙個檔案即可。但當專案的複雜度增加時,會出現**過多導致檔案過大的問題。因此,模組和包就能方便管理和維護**。模組和包都是複雜程式組織的一種方式,一般來說,一般複雜度較低使用模組(module),複雜度較高使用包(package)來管理**。

乙個包(package)可以由多個模組組成,乙個模組,由多個函式、變數組成,若是採用物件導向程式設計程式設計正規化(paradigm)由多個類,每個類由多個變數、函式組成。表現為專案(project)的目錄結構。這樣做的原因:

1)可讀性高:幫助他人了解專案的目錄結構,從而非常快速的了解這個專案組織結構。

2)可維護性高:有助於維護者降低維護難度,,隨著時間的推移,**/配置的規模增加,專案結構不會混亂,仍然能夠組織良好。

模組概述

模組(module)是包含函式和其他語句的指令碼檔案,是一組python**的集合,以「.py」為字尾名,也就是python程式的字尾名。用作模組的python程式與一般python程式並沒有什麼區別。

使用模組中的**,也很簡單,那就是通過匯入(import)模組,然後使用模組中提供的函式或者資料。

下面具體介紹之。

python中的自定義模組及其使用

python中的自定義模組,就不是python自帶的模組,而是通過自己來建立出來的。

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

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

使用模組的意義

提高了**的可維護性。其次,編寫**不必從零開始。當乙個模組編寫完畢,就可以被其他地方引用。還可以避免函式名和變數名衝突。相同名字的函式和變數完全可以分別存在不同的模組中,因此,我們自己在編寫模組時,不必考慮名字會與其他模組衝突。

建立模組就是將檔案儲存為擴充套件名為.py的檔案。

注意事項:

模組名要遵循python變數命名規範,不要使用中文、特殊字元

模組名不要和系統模組名衝突,先檢視系統是否已存在該模組,檢查方法是在python互動環境執行import 模組名,若成功則說明系統存在此模組。如import abc是成功的,系統存在該模組。

python自定義模組及其使用的簡單例子

建立名為mym.py檔案,作為自定義模組檔案,內容如下:

def add(a, b):

return a + b

def sub(a, b):

return a - b

建立使用 import mym的名為的testa.py測試檔案,內容如下:

import mym

print("add(1, 2)的結果", mym.add(1, 2))

print("sub(2, 3)的結果:", mym.sub(2, 3))

將testa.py檔案和mym.py檔案儲存在同一目錄(資料夾)中,執行testa.py結果如下圖:

建立使用from mym import add的名為的testb.py測試檔案,內容如下:

from mym import add

print("add(1, 2): 的結果",add(1, 2))

將testb.py檔案和hello.py檔案儲存在同一目錄(資料夾)中,執行testb.py結果如下圖:

import語句的語法

格式一:

import 模組名 [as 別名]

說明:1)將整個模組匯入。2)[as 別名]部分可無,取別名簡化引用。 3)使用匯入模組中的成員的格式:模組名[或別名]. 成員

成員包括屬性(變數)或函式。

格式二:

from 模組名 import成員名或*

說明:1)匯入模組中的某個成員,*代表所有成員

若匯入包中模組,將上面語法中的模組名改為 包名.模組名

提示:import ***和from *** import yyy,兩者的區別在於:

import ***,需要通過***.yyy的方式使用匯入模組中的變數、函式、類等。

from *** import yyy,可以直接以yyy呼叫。

包(package)

當複雜度上公升時,為了避免模組名衝突,python又引入了按目錄來組織模組的方法,稱為包(package)。參見下圖:

乙個python包能有子包和模組。

引入了包以後,只要頂層的包名不衝突,同名的模組就不衝突,如上圖中兩個aa.py模組不會衝突。注意,每乙個包目錄下面都會有乙個__init__.py的檔案(init前後有兩個下劃線),這個檔案是必須存在的,否則,python就把這個目錄當成普通目錄,而不是乙個包。__init__.py可以是空檔案,也可以有**。當匯入包時,python會自動執行 "__init__.py" 裡的**,可作包和模組的初始化。

簡單而言,模組(module)是指py檔案,包(package)是指目錄(含有__init__.py檔案的目錄)。

匯入包的方法與匯入模組的方法類似。可以使用點(.)符號從乙個包裡邊匯入模組,參見上圖,如果想使用a1x模組包含的函式sel(),做法如下:

import a.a1.a1x

a.a1.a1x.sel()

也可以如下簡潔方式:

from a.a1 import a1x

a1x.sel()

或者from a.a1.a1x import sel

sel()

建立包包可以理解為包含多個模組的資料夾,但是本質仍然為模組。

建立包分為兩步:

1)新建資料夾,資料夾名則為包名

2)在資料夾新建名為__init__.py的檔案,可以是空檔案,也可以有**。前文講到,該檔案也是乙個模組,模組名為包名。

匯入包的方法與匯入模組的方法類似。

import語句匯入不同路徑下的模組

在呼叫程式檔案(主程式)中匯入被匯入模組(模組程式)時,若被匯入模組的儲存路徑與呼叫程式檔案的相同,或者將被匯入的模組放入系統預設的模組查詢路徑【注】中,不需要考慮路徑,否則需要注意指明路徑。

【注:windows系統預設路徑為python安裝目錄及其子目錄,如lib、lib\site-packages、dlls等。

linux預設路徑為/usr/lib、/usr/lib64及其子目錄。】

(1)主程式與模組程式在同一目錄下:

如下面程式結構:

若在程式test1.py中匯入模組mod1, 則直接使用 import  mod1或from mod1 import *;

(2)主程式所在目錄是模組所在目錄的父(或祖輩)目錄

如下面程式結構:

若在程式test1.py中匯入模組mod2, 需要在moda資料夾中建立空檔案__init__.py檔案(也可以在該檔案中自定義輸出模組介面); 然後使用 from moda.mod2 import * 或import moda.mod2.

(3)主程式匯入上層目錄中模組或其他目錄(平級)下的模組

如下面程式結構:

若在程式test2.py中匯入模組mod1和mod2。首先需要在mod2下建立__init__.py檔案(同(2)),src下不必建立該檔案。然後呼叫方式如下:

sys.path簡介

sys.path是python的搜尋模組的路徑集,是乙個list 。

可用下列檢視python系統預設的模組查詢路徑

import sys

for i in sys.path:

print(i)

Windows API 程式的組織結構

在介紹windows 程式的基本構架之前我們必需先了什麼是訊息。在windows 多工環境下同時會有許多程式交織著進行這樣複雜的工作是如何管理的呢?windows 憑藉的就是 訊息傳送 messagepassing 這個法寶 在windows 下所有外部輸入如按鍵 滑鼠 按鈕 移動計時等動作都是由系...

python 程式的計算代價(複雜度)

在考慮 python 程式的時間開銷時,有乙個問題特別需要注意 python 程式中的很多基本操作不是常量時間的。下面是一些情況 1 基本算術運算時常量時間操作 注 邏輯運算時常量時間運算。2 組合物件的操作有些是常量時間的,有些不是,例如 複製和切片操作通常需要線性時間 與長度有關,是 o n 時...

楊桃的Python高階講座1 序言

本人csdn部落格專欄 楊桃的python基礎教程完結之後,有朋友問,下一步該學什麼?我問他,你想學什麼?他 當然是啥子熱門學啥,人工智慧,機器學習,深度學習都要會。我 好的,其實基礎學完之後確實可以開始了,但如果你方法不對,就會走一些彎路。他 我 牛頓說的最有名的一句話是什麼?他 站在巨人肩膀上那...