人生苦短,我愛python
- 一、模塊的定義和使用
- 1. 匯入模塊
- import陳述句
- from … import陳述句
- from … import *陳述句(有冷門知識點)
- 搜索路徑
- 2. 創建模塊
- 二、包的定義和使用
- 1. 匯入包
- 2. 創建包
- 3. 我對__init__.py的一點思考
- 三、寫在最后
接上文:薛欽亮的python教程(五)極簡版Python面向物件編程
在上一次更新完博客之后,收到了小伙伴肯定的留言,真的超級暖啊,給了我莫大的動力,我會繼續認真更新博客,用最認真的態度去做好這件事情,
今天本文要講一下Python中模塊和包的使用,
一、模塊的定義和使用
簡單理解,模塊就是一個包含代碼的python檔案,我們可以從模塊中匯入類、方法、物件等,
自己定義模塊的作用是更好地組織代碼,讓代碼更好用,更好懂,使用別人的模塊的作用不言而喻,就是站在前人的肩膀上編程,一定程度上可以講,Python正是有了大量前人開發好的擴展包,才變得好用和流行,
1. 匯入模塊
在學習自己寫模塊之前,先學習一下如何匯入別人的模塊吧(這里所引入的有的模塊其實是包,為了說明import語法,請容忍此處的不嚴謹),
import陳述句
import modulename as shortname
我們用import陳述句來匯入一個模塊,后面可以用as關鍵字跟一個簡稱(自己隨便起什么名字都好),之后,我們可以用這個模塊的名字/簡稱加一個點(.),來訪問模塊下的類、物件和方法,
看兩個具體的例子:
import math
print(math.sqrt(2)) #求2的平方根
import random as rdm
print(rdm.random()) #生成亂數
from … import陳述句
有時候,我們不想引入整個模塊(常見的原因是整個模塊太大了,我們如果只用一小部分功能,可以只引入其中的一部分),可以用from … import陳述句來實作功能,import后面所跟的,就是我們所引入的部分,
仍然是用上面的例子:
from math import sqrt
print(sqrt(2)) #這時候只需要直接呼叫參考的部分,無須加模塊的名稱
from random import random as rd_func
print(rd_func()) #可以把這個模塊改為自己任意想起的名字
from … import *陳述句(有冷門知識點)
這個陳述句是把一個模塊下的所有內容 (這里不準確)匯入當前的命名空間,十分粗暴,可以無須通過模塊名稱直接呼叫模塊內的內容,應該盡量減少使用這種語法,
from math import *
print(sqrt(2))
print(log(2,e)) #生成以e為底2的對數
print(pi) #列印π的值
這里補充一下上文說的不準確之處:這種語法不會匯入以下劃線開頭的類、方法和物件,一般的教程這里很少提及這一點,這個知識點可能比較冷門,但我覺得需要了解一下
搜索路徑
現在有個問題,Python是在什么路徑下搜索模塊的呢?
- 當前目錄
- sys.path所包含的路徑
查看sys.path的方式為
import sys
print(sys.path)
任何包含在上述路徑下的模塊,都是可以被搜索到并引入的,
2. 創建模塊
我們可以創建一個模塊,里面包含我們常用的函式,
tools.py
'''這個模塊包含常用的工具'''
def print_love():
love_list = [
' $$$$ $$$$',
' $$$$$$$ $$$$$$$',
' $$$$$$$$$$$$$$$$$',
'$$$ I love you! $$$',
' $$$$$$$$$$$$$$$$$',
' $$$$$$$$$$$$$',
' $$$$$$$$$',
' $$$$$$$',
' $$$',
]
for i in love_list:
print(i)
def show_picture(path):
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open(path)
plt.imshow(img)
plt.show()
if __name__ == "__main__":
show_picture("C:\\Users\\HP\\Pictures\\python.jpeg")
print_love()
這個模塊包含兩個函式:print_love和show_picture,最下面的幾行代碼的功能是:如果該檔案是直接使用的,則運行下面的代碼,如果是被其他檔案當作模塊匯入時,則不運行下面的兩行代碼,
我們現在可以在同一個目錄下創建新檔案,匯入剛剛寫的這個模塊,
from tools import print_love
print_love()
結果為:
$$$$ $$$$
$$$$$$$ $$$$$$$
$$$$$$$$$$$$$$$$$
$$$ I love you! $$$
$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$
$$$$$$$$$
$$$$$$$
$$$
二、包的定義和使用
我們已經知道了模塊其實就是一個python檔案,包的定義也很簡單,包就是檔案夾,但該檔案夾下必須存在__init__.py 檔案, 這個檔案在呼叫包的時候會自動執行,但其內容可以為空,__init__.py 用于標識當前檔案夾是一個包,
別人寫好的大部分是包而不是模塊,原因是包的結構更加復雜,可以勝任一些復雜的功能開發,我們簡單來看一下,
1. 匯入包
包和模塊最大的區別在于,包可以有多層結構,而模塊一般只有兩層結構,在匯入時,語法和模塊的import等陳述句完全相同,此處就看一個含有多層結構的包的匯入吧,
import matplotlib.pyplot as plt
from matplotlib import pyplot as plt
上面兩行代碼功能完全相同,都是匯入matplotlib中的一個子包,叫做pyplot,并簡稱為plt,因此,如果匯入的是包,可以用pkgname.subname的方式來呼叫其中的子包,
2. 創建包
我們創建一個目錄,叫做manytools(假裝真的有很多),里面需要包含大量的子包和模塊,
假設我們已經寫好了其中的內容,包含了兩個(假裝挺多的)檔案,目前的目錄結構是:
----manytools/
--------love.py
--------pic.py
如果僅僅這樣,我們要怎么寫代碼引入這些模塊呢?
import manytools.love
import manytools.pic
manytools.love.print_love()
現在的代碼可以正常運行,但缺點是我們需要把檔案夾下面所有模塊都引入一遍,才能使用其全部功能,如果其下面還有子檔案夾,要一層一層引入才可以,
如果只寫一個import manytools呢?
import manytools
manytools.love.print_love()
Traceback (most recent call last):
File "c:\Users\HP\Desktop\demo\main.py", line 2, in <module>
manytools.love.print_love()
AttributeError: module 'manytools' has no attribute 'love'
如果在檔案夾中加一個__init__.py呢?在__init__.py中可以定義一個特殊變數__all__,控制當匯入包的時候,自動匯入的模塊有哪些,
__init__.py
__all__ = ['love','pic']
當然這樣寫也是等價的,
import manytools.love
import manytools.pic
現在我們可以方便地去使用這個包了,
import manytools
manytools.love.print_love()
manytools.pic.show_picture('C:/Users/HP/Pictures/python.jpeg')
3. 我對__init__.py的一點思考
這個檔案的特殊之處有兩點:
- 在包引入的時候自動執行
- 匯入時,默認只匯入__all__定義的模塊
因此,這個檔案成為構建一個可用的包必不可少的檔案,如果缺少了這個檔案,包只能叫做模塊的集合,各模塊之間還是松散的,呼叫時需要手動去呼叫每個模塊,有了__init__.py,可以統一呼叫包中的各個模塊,還可以在匯入包的時候做一些必要的初始化的作業,
三、寫在最后
本次的內容,新手掌握時以學會呼叫包和模塊為主,開發包和模塊是熟練之后需要做的事情,
Python自身不夠強大,強大的是無數的前輩用掉了無數根頭發換來的各種好用的包,因此,讓我們站在前人的肩膀上,開始快樂地python編程吧,
下一篇博客內容預告:常見python包的介紹
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/254941.html
標籤:python
