前言
Python是一種簡(jiǎn)單易學(xué)、功能強(qiáng)大的編程語(yǔ)言,而其模塊和包的概念更是為我們提供了一種有效管理和組織代碼的方式。模塊是Python程序的基本組成單元,它是一個(gè)包含函數(shù)、變量和類(lèi)的文件。而包則是由多個(gè)模塊組成的一個(gè)目錄,可以幫助我們更好地組織和復(fù)用代碼。
在本系列的文章中,我們將從基礎(chǔ)知識(shí)開(kāi)始,逐步介紹Python模塊和包的概念、語(yǔ)法和使用方法。
模塊
什么是模塊
在Python中,模塊是一種組織和復(fù)用代碼的方式。它是一個(gè)包含函數(shù)、變量和類(lèi)的文件,以 .py
為文件擴(kuò)展名。模塊可以被其他程序?qū)牒褪褂?,以提供特定功能或?qū)崿F(xiàn)特定任務(wù)。
Python模塊使代碼更易于管理和組織,同時(shí)也促進(jìn)了代碼的可重用性。通過(guò)將相關(guān)的功能放入不同的模塊中,可以使代碼更具可讀性和可維護(hù)性。此外,模塊還可以幫助開(kāi)發(fā)人員對(duì)功能進(jìn)行封裝,以便在不同的項(xiàng)目中共享和復(fù)用代碼。
導(dǎo)入模塊
在 python 中,有以下的方式來(lái)導(dǎo)入模塊:
- import 模塊名
- from 模塊名 import 功能名
- from 模塊名 import *
- import 模塊名 as 別名
- from 模塊名 import 功能名 as 別名
import 導(dǎo)入模塊
前面我們也見(jiàn)過(guò),當(dāng)我們生成隨機(jī)數(shù)的時(shí)候需要導(dǎo)入 random 模塊,那么在 python 中可以使用 import 模塊名
來(lái)導(dǎo)入模塊。
當(dāng)我們以 import 模塊名
的形式導(dǎo)入模塊的時(shí)候,使用 模塊名.功能
來(lái)使用模塊中的方法。
import random # 導(dǎo)入random模塊
result = random.randint(1,10) # 生成1-9之間的隨機(jī)數(shù)
print(result)
使用 import 模塊名
也可以導(dǎo)入多個(gè)模塊,但是不推薦 import 模塊1,模塊2...
from 模塊名 import 功能
我們使用 import 模塊名
導(dǎo)入的是該模塊下的所有代碼,我們也可以只導(dǎo)入該模塊下的指定方法,并且我們調(diào)用方法的時(shí)候可以直接使用方法,而不需要加模塊名。
from random import randint # 導(dǎo)入random模塊下的randint方法
result = randint(1,10)
print(result)
from 模塊名 import *
from 模塊名 import 功能
與 from 模塊名 import *
是相似的,只是前面一種導(dǎo)入方法,導(dǎo)入的是指定的功能,而后面一種方法導(dǎo)入的是該模塊下的所有方法,兩種導(dǎo)入方法調(diào)用功能的時(shí)候都只需使用功能() ,而不需要加上 模塊名.功能。
from math import *
print(sqrt(9)) # 3.0
print(pow(3,2)) # 9.0
as定義別名
如果我們覺(jué)得模塊名或者方法名太長(zhǎng)寫(xiě)的時(shí)候太麻煩的時(shí)候,我們可以使用別名。import 模塊名 as 別名
來(lái)別名模塊名,from 模塊名 import 功能 as 別名
別名功能名。
import time as t
t.sleep(2) # 程序會(huì)停止兩秒再結(jié)束
from time import sleep as slp
slp(2)
當(dāng)我們使用別名之后,之前的名字不能再繼續(xù)使用,否則會(huì)報(bào)錯(cuò)
from time import sleep as slp
sleep(2)
制作模塊
在Python中,每個(gè)Python文件都可以作為一個(gè)模塊,模塊的名字就是文件的名字。也就是說(shuō)自定義模塊名必須要符合標(biāo)識(shí)符命名規(guī)則。
我們創(chuàng)建一個(gè) python 文件,并且在該文件中定義一個(gè) add_num 方法。
我們可以對(duì)該模塊內(nèi)的 add_num 方法進(jìn)行測(cè)試,看方法是否能實(shí)現(xiàn)指定功能。
def add_num(a,b):
return a + b
print(add_num(1,2)) # 3
每實(shí)現(xiàn)一個(gè)模塊中的方法,我們就需要進(jìn)行測(cè)試,那么當(dāng)我們測(cè)試完成之后,需不需要將測(cè)試代碼給刪除呢?如果不刪除會(huì)有什么影響呢?
我們?cè)?Test文件中導(dǎo)入該模塊并使用該模塊下的方法。
這里 3 很顯然是我們測(cè)試代碼里面的測(cè)試結(jié)果,import 模塊名
會(huì)將該模塊下的所有代碼都導(dǎo)入,但是我們刪除了測(cè)試代碼的話(huà),下次再測(cè)試又需要重新寫(xiě),那我們?cè)撛趺醋黾饶軐?shí)現(xiàn)測(cè)試功能,又不影響其他功能呢?
使用 if __ name __ == '__ main __':
作為條件,來(lái)使該代碼只會(huì)在該模塊下執(zhí)行,出來(lái)該模塊所在的文件就不會(huì)執(zhí)行測(cè)試代碼。
__ name __ 是系統(tǒng)變量,是模塊的標(biāo)識(shí)符,值是:如果是自身模塊,值是__ main __,否則是模塊所在的文件名
我們?cè)谀K所在文件打印 __ name __。
然后在導(dǎo)入該模塊的文件下運(yùn)行代碼。
我們?cè)谀K所在文件加上對(duì)應(yīng)條件并執(zhí)行代碼。
def add_num(a,b):
return a + b
if __name__ == '__main__':
print(add_num(1,2)) # 3
然后在導(dǎo)入該模塊的文件下調(diào)用該模塊的對(duì)應(yīng)方法。
import my_module1
print(my_module1.add_num(3,5))
這里并不會(huì)執(zhí)行我們的測(cè)試代碼,這樣就解決了我們的問(wèn)題。
注意:如果使用 from .. import ..
或 from .. import *
導(dǎo)入多個(gè)模塊的時(shí)候,且模塊內(nèi)有同名功能。當(dāng)調(diào)用這個(gè)同名功能的時(shí)候,調(diào)用到的是后面導(dǎo)入的模塊的功能。
from my_module1 import add_num
print(add_num(-3,5)) # 2
def add_num(a,b):
return abs(a) + abs(b)
from my_module1 import add_num
def add_num(a,b):
return abs(a) + abs(b)
print(add_num(-3,5)) # 8
模塊的定位順序
當(dāng)導(dǎo)入一個(gè)模塊,Python解析?對(duì)模塊位置的搜索順序是:
- 當(dāng)前文件所在的目錄下的所有文件
- 如果不在當(dāng)前目錄,python 則搜索在shell變量pythonpath下的每個(gè)目錄
- 如果前面兩個(gè)路徑都找不到,python會(huì)查看默認(rèn)路徑
注意:
- 自己的文件名不要和已有模塊名重復(fù),否則導(dǎo)致模塊功能無(wú)法使用
- 使用
from 模塊名 import 功能
的時(shí)候,如果功能名字重復(fù),調(diào)用到的是最后定義或?qū)氲墓δ堋?/li>
__ all __
但我們使用 from 模塊名 import *
導(dǎo)入模塊的時(shí)候,我們可以指定導(dǎo)入的方法,而不是全部方法,我們只需要在模塊中定義 __ all __ = ['方法1',‘方法2']
,這樣就只會(huì)導(dǎo)入 __ all __
中的方法。
__all__ = ['add_num']
def add_num(a,b):
return a + b
if __name__ == '__main__':
print(add_num(1,2))
def sub(a,b):
return a - b
from my_module1 import *
print(sub(1,2))
這里會(huì)直接提示錯(cuò)誤。
包
Python包是一種用于組織和管理Python代碼的方式。它是一個(gè)包含模塊、子包和資源文件的目錄,可以在Python程序中被導(dǎo)入和使用。包的主要目的是將相關(guān)的功能和數(shù)據(jù)組織到一個(gè)單獨(dú)的單元中,以便于重用和維護(hù)。
一個(gè)包通常包含一個(gè)名為 __init__.py
的特殊文件,用于標(biāo)識(shí)該目錄為一個(gè)包。它可以包含其他Python模塊文件(以.py為擴(kuò)展名)和子包(也是一個(gè)包的目錄)。
在pycharm上如何創(chuàng)建包
當(dāng)我們創(chuàng)建完成一個(gè)包之后,我們會(huì)發(fā)現(xiàn)該包下會(huì)自動(dòng)產(chǎn)生一個(gè) __ init __.py
的文件。
導(dǎo)入包
我們首先需要在包下創(chuàng)建幾個(gè)模塊文件。
add_num.py
def add_num(a,b):
return a + b
sub_num.py
def sub_num(a,b):
return a - b
導(dǎo)入包有兩種方式:
- import 包名.模塊
- from 包名 import *
import 包名.模塊 導(dǎo)入包
當(dāng)我們使用 import 包名.模塊
導(dǎo)入包的時(shí)候,我們以 包名.模塊名.功能
來(lái)使用相關(guān)功能。
import mypackage.add_num
import mypackage.sub_num
print(mypackage.add_num.add_num(10,20)) # 30
print(mypackage.sub_num.sub_num(50,20)) # 30
from 包名 import * 導(dǎo)入包
當(dāng)我們使用 from 包名 import *
導(dǎo)入包的時(shí)候,我們需要在 __ init __.py
文件中添加 __ all __ = [ ]
來(lái)設(shè)置允許導(dǎo)入的模塊列表。
__all__ = ['add_num','sub_num']
使用 模塊名.功能
的方法來(lái)使用相應(yīng)的功能。
from mypackage import *
print(add_num.add_num(10,20)) # 30
print(sub_num.sub_num(50,20)) # 30
如果我們將 __ init __
文件中的 __ all __ = [ ]
給刪除或者注釋掉的話(huà),會(huì)出現(xiàn)什么情況亂。
所以但我們使用 from 包名 import *
導(dǎo)入包的時(shí)候一定要記得設(shè)置 __ init __
文件里的 __ all __ = [ ]
來(lái)設(shè)置允許導(dǎo)入的模塊列表。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-568502.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-568502.html
到了這里,關(guān)于python 模塊和包的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!