Python基础知识(第十一天)
154.模塊化編程理念_什么是模塊_哲學思想
模塊和包概念
1.Python?程序由模塊組成。一個模塊對應(yīng) python?源文件,一般后綴名是:.py。
2.模塊由語句組成。運行 Python?程序時,按照模塊中語句的順序依次執(zhí)行。
3.語句是 Python?程序的構(gòu)造單元,用于創(chuàng)建對象、變量賦值、調(diào)用函數(shù)、控制語句等。
標準庫模塊(standard library)
與函數(shù)類似,模塊也分為標準庫模塊和用戶自定義模塊。
Python?標準庫提供了操作系統(tǒng)功能、網(wǎng)絡(luò)通信、文本處理、文件處理、數(shù)學運算等基本的功能。比如:random(隨機數(shù))、math(數(shù)學運算)、time(時間處理)、file(文件處理)、os(和操作系統(tǒng)交互)、sys(和解釋器交互)等。另外,Python?還提供了海量的第三方模塊,使用方式和標準庫類似。功能覆蓋了我們能想象到的所有領(lǐng)域,比如:科學計算、WEB?開發(fā)、大數(shù)據(jù)、人工智能、圖形系統(tǒng)等。
為什么需要模塊化編程
模塊(module)對應(yīng)于Python 源代碼文件(.py 文件)。模塊中可以定義變量、函數(shù)、類、普通語句。 這樣,我們可以將一個 Python 程序分解成多個模塊,便于后期的重復應(yīng)用。
模塊化編程(Modular Programming)將一個任務(wù)分解成多個模塊。每個模塊就像一個積木一樣,便于后期的反復使用、反復搭建。
155.模塊化編程的流程_設(shè)計和實現(xiàn)分離
模塊化編程的一般流程:
1.設(shè)計API,進行功能描述。? ?
2.編碼實現(xiàn)API?中描述的功能。
3.在模塊中編寫測試代碼,并消除全局代碼。? ?
4.使用私有函數(shù)實現(xiàn)不被外部客戶端調(diào)用的模塊函數(shù)。
API(Application Programming Interface 應(yīng)用程序編程接口)是用于描述模塊中提供的函數(shù)和類的功能描述和使用方式描述。模塊化編程中,首先設(shè)計的就是模塊的 API(即要實現(xiàn)的功能描述),然后開始編碼實現(xiàn)API 中描述的功能。最后,在其他模塊中導入本模塊進行調(diào)用。我們可以通過help(模塊名)查看模塊的API。一般使用時先導入模塊然后通過help函數(shù)查看。
設(shè)計計算薪水模塊的 API
""" 本模塊用于計算公司員工的薪資""" company = "Alimama"def yearSalary(monthSalary): """根據(jù)傳入的月薪,計算出年薪""" passdef daySalary(monthSalary): """根據(jù)傳入的月薪,計算出每天的薪資""" pass import Salary print(Salary.__doc__) print(Salary.yearSalary.__doc__)每個模塊都有一個名稱,通過特殊變量__name__可以獲取模塊的名稱。在正常情況下,模塊名字對應(yīng)源文件名。 僅有一個例外,就是當一個模塊被作為程序入口時(主程序、交互式提示符下),它的__name__的值為“???main???”。我們可以根據(jù)這個特點,將模塊源代碼文件中的測試代碼進行獨立的處理。例如:
if __name__=="__main__":print(yearSalary(3000))print(daySalary(3000))156.模塊導入_import和from_import語句詳解和區(qū)別
模塊導入
模塊化設(shè)計的好處之一就是“代碼復用性高”。寫好的模塊可以被反復調(diào)用,重復使用。 ???模塊的導入就是“在本模塊中使用其他模塊”。
import?語句導入
import 語句的基本語法格式如下:
import 模塊名? ? ? ? ? ? #導入一個模塊
import 模塊?1,模塊?2…? ? ? ? ?#導入多個模塊
import 模塊名 as?模塊別名? ? ? ? ? ?#導入模塊并使用新名字
import 加載的模塊分為四個通用類別
1.使用 python?編寫的代碼(.py?文件);
2.已被編譯為共享庫或 DLL?的 C?或 C++擴展;
3.c.包好一組模塊的包
4.使用 C 編寫并鏈接到 python 解釋器的內(nèi)置模塊;
from…import?導入
Python?中可以使用from…import?導入模塊中的成員。基本語法格式如下:
from 模塊名 import 成員?1,成員?2,…
如果希望導入一個模塊中的所有成員,則可以采用如下方式:
from 模塊名 import *
import 導入的是模塊 , from...import 導入的是模塊中的一個函數(shù)/一個類。
import math print(math.sin(30))from math import sin print(sin(30))157.import加載底層原理_importlib模塊
????import? ???()動態(tài)導入
import importlib a = importlib.import_module("math") print(a.pi)模塊的加載問題
一個模塊無論導入多少次,這個模塊在整個解釋器進程內(nèi)有且僅有一個實例對象。
有時候我們確實需要重新加載一個模塊,這時候可以使用:
import test02 import test02print("####") import importlib importlib.reload(test02)158.包的概念和創(chuàng)建包和導入包
包(package)的概念和結(jié)構(gòu)
當一個項目中有很多個模塊時,需要再進行組織。我們將功能類似的模塊放到一起, 形成了“包”。本質(zhì)上,“包”就是一個必須有?init?.py?的文件夾。典型結(jié)構(gòu)如下:
包下面可以包含“模塊(module)”,也可以再包含“子包(subpackage)”。就像文件夾下面可以有文件,也可以有子文件夾一樣。
pycharm中創(chuàng)建包
在 pycharm?開發(fā)環(huán)境中創(chuàng)建包,非常簡單。在要創(chuàng)建包的地方單擊右鍵:New-->Python package?即可。pycharm?會自動幫助我們生成帶有? ??init? ??.py?文件的包。
???????導入包操作
上一節(jié)中的包結(jié)構(gòu),我們需要導入 module_AA.py。方式如下:
1.import a.aa.module_AA
在使用時,必須加完整名稱來引用,比如:a.aa.module_AA.fun_AA()
2.from a.aa import?module_AA
在使用時,直接可以使用模塊名。 比如:module_AA.fun_AA()
3.from a.aa.module_AA?import?fun_AA
直接導入函數(shù)在使用時,直接可以使用函數(shù)名。 比如:fun_AA()
159.包的本質(zhì)和init文件_批量導入_包內(nèi)引用
包的本質(zhì)
導入包的本質(zhì)其實是“導入了包的? ??init? ??.py”文件。也就是說,”import??pack1”意味著執(zhí)行了包 pack1?下面的? ??init? ??.py?文件。 這樣,可以在? ??init? ??.py?中批量導入我們需要的模塊,而不再需要一個個導入。
? ??init? ??.py 的三個核心作用:
1.作為包的標識,不能刪除。
2.用來實現(xiàn)模糊導入
3.導入包實質(zhì)是執(zhí)行? ??init? ??.py 文件,可以在? ??init? ???.py 文件中做這個包的初始化、以及需要統(tǒng)一執(zhí)行代碼、批量導入。
???????用*導入包
import * 這樣的語句理論上是希望文件系統(tǒng)找出包中所有的子模塊,然后導入它們。這可能會花長時間等。Python 解決方案是提供一個明確的包索引。
這個索引由 ? ??init? ??.py 定義? ??all? ??變量,該變量為一列表,如上例?a?包下的????init? ??.py 中 ,可 定 義? ??all? ??= ["module_A","module_A2"]
這意味著,?from?sound.effects import?* 會從對應(yīng)的包中導入以上兩個子模塊;
【注】盡管提供 import * 的方法,仍不建議在生產(chǎn)代碼中使用這種寫法。
???????包內(nèi)引用
如果是子包內(nèi)的引用,可以按相對位置引入子模塊 以 aa 包下的module_AA 中導入a 包下內(nèi)容為例:
from ..?import?module_A? ? ? ? ? ? ?#..表示上級目錄 .表示同級目錄
from .?import?module_A2? ? ? ? ? ? #.表示同級目錄
?
160.sys.path和模塊搜索路徑詳解
當我們導入某個模塊文件時, Python?解釋器去哪里找這個文件呢?只有找到這個文件才能讀取、裝載運行該模塊文件。它一般按照如下路徑尋找模塊文件(按照順序?qū)ふ?#xff0c;找到即停不繼續(xù)往下尋找):
1.內(nèi)置模塊
2.當前目錄
3.程序的主目錄
4.pythonpath目錄(如果已經(jīng)設(shè)置了 pythonpath?環(huán)境變量)
5.標準鏈接庫目錄
6.第三方庫目錄(site-packages?目錄)
7.pth?文件的內(nèi)容(如果存在的話)
8.sys.path.append()臨時添加的目錄
161.模塊的本地發(fā)布_模塊的安裝
???????模塊的本地發(fā)布
當我們完成了某個模塊開發(fā)后,可以將他對外發(fā)布,其他開發(fā)者也可以以“第三方擴展庫”的方式使用我們的模塊。我們按照如下步驟即可實現(xiàn)模塊的發(fā)布:
1.為模塊文件創(chuàng)建如下結(jié)構(gòu)的文件夾(一般,文件夾的名字和模塊的名字一樣):
2.在文件夾中創(chuàng)建一個名為『setup.py』的文件,內(nèi)容如下:
from distutils.core import setup setup(name='baizhanMath2', # 對 外 我 們 模 塊 的 名 字version='1.0', #版本號description='這是第一個對外發(fā)布的模塊,測試哦', #描述author='gaoqi', 作者author_email='gaoqi110@163.com',py_modules=['baizhanMath2.demo1','baizhanMath2.demo2'] #要發(fā)布的模塊 )???????3.構(gòu)建一個發(fā)布文件。通過終端,cd?到模塊文件夾 c?下面,再鍵入命令:
python?setup.py?sdist ?
???????本地安裝模塊
將發(fā)布安裝到你的本地計算機上。仍在 cmd 命令行模式下操作,進 setup.py 所在目錄,鍵入命令:
python setup.py install
安裝成功后,我們進入 python?目錄/Lib/site-packages?目錄(第三方模塊都安裝的這里,python?解釋器執(zhí)行時也會搜索這個路徑)
安裝成功后,直接使用 import?導入即可。
import baizhanMath2.demo1???????
總結(jié)
以上是生活随笔為你收集整理的Python基础知识(第十一天)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python基础知识(第十天)
- 下一篇: Python数据结构与算法(第二天)